2017-02-05 9 views
0

私はPDOを学習しています。私はちょうどYoutubeのチュートリアルに従いました。そこでここではDbクラスのメソッドがあり、foreachのほかにwhileループを試したいので、PDO :: FETCH_ASSOCという新しい行を追加しました。PHP:PDO fetch()に結果が表示されない

public function query($sql, $params = array()){ 
$this->_error = false; 
$this->_count = 0; 
if($this->_query = $this->_pdo->prepare($sql)){ 

    #check if theres a parameter and bindvalue to sql statement 
    if(count($params)){ 
    $x = 1; 
    foreach($params as $param){ 
     $this->_query->bindValue($x, $param); 
     $x++; 
    } 
    } 

    #execute with or without parameter 
    if($this->_query->execute()){ 
    $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
    $this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC); 
    $this->_count = $this->_query->rowCount(); 
    }else{ 
    $this->_error = true; 
    } 
    return $this; 
} 
} #end of GET function 


public function whileFetch(){ 
    return $this->_whileFetch; 
} 

のforeachがうまく機能しているが、私は、whileループを試してみたいが、それはどのようなデータが表示されない、動作しないようです。

$query = $db->query("SELECT * from master_data.store"); 
while($row = $query->whileFetch()){ 
    echo $row['name']; 
} 

これも試してみますが、エラーが表示されます。

while($row = $query->fetch(PDO::FETCH_ASSOC)){ 
    echo $row['name']; 
} 

答えて

1

問題は、このメソッド呼び出しのためです->fetchAll(PDO::FETCH_OBJ)です。結果セットからすべての行を配列として取り出し、それをインスタンス変数$resultsに代入するので、この文$this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC);はその後は動作しません。そのため、$this->_whileFetchfalseとなります。

だから、解決策が

  • があなたのクラスからインスタンス変数$_whileFetchを外し、である、あなたはこれを必要とされることはありません。
  • このif($this->_query->execute()){ ... }ブロックから次の2行を削除し、whileFetch()方法において

    $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ); 
    $this->_whileFetch = $this->_query->fetch(PDO::FETCH_ASSOC); 
    
  • 、代わりの$this->_whileFetch、直接、結果セットから次の行をフェッチし、それを返す

    return $this->_query->fetch(PDO::FETCH_ASSOC); 
    

したがって、query()whileFetch()の方法は、次のようになります。

public function query($sql, $params = array()){ 
    $this->_error = false; 
    $this->_count = 0; 
    if($this->_query = $this->_pdo->prepare($sql)){ 
     #check if theres a parameter and bindvalue to sql statement 
     if(count($params)){ 
      $x = 1; 
      foreach($params as $param){ 
       $this->_query->bindValue($x, $param); 
       $x++; 
      } 
     } 

     #execute with or without parameter 
     if($this->_query->execute()){ 
      $this->_count = $this->_query->rowCount(); 
     }else{ 
      $this->_error = true; 
     } 
     return $this; 
    } 
} 

public function whileFetch(){ 
    return $this->_query->fetch(PDO::FETCH_ASSOC); 
} 

その後、あなたはあなたのクエリとこのようなwhile()ループを持つことができます。

$query = $db->query("SELECT * from master_data.store"); 
while($row = $query->whileFetch()){ 
    echo $row['name']; 
} 
+0

おかげで、私がやったが、私は一度だけwhileループやforeachのそれぞれを呼び出すことができますし、次のループはもう機能していません –

+1

@RaffyTLawrenceはい、whileループを使用して結果セットを反復処理すると、結果セットが使い果たされるからです。結果セットの先頭を指すように結果ポインターを調整することはできません。したがって、結果セットをループするには 'while'または' foreach'ループを使用します。 –

+0

@RaffyTLawrenceこれを言って、結果セット*をもう一度繰り返したい場合は、PDOカーソルを 'CURSOR_SCROLL'に設定する必要があります。デフォルトでは 'CURSOR_FWDONLY'に設定されています。このSOのスレッドを見て、*受け入れ*答え:[http://stackoverflow.com/q/15637291/5517143](http://stackoverflow.com/q/15637291/5517143) –

1

これはひどいチュートリアルであり、クラスには重大な欠点がいくつかあります。

$query = $db->query("SELECT * from master_data.store"); 
foreach($query as $row){ 
    echo $row['name']; 
} 

$query = $db->query("SELECT * from master_data.store"); 
while($row = $query->fetch()){ 
    echo $row['name']; 
} 

$list = $db->query("SELECT name from store")->fetchAll(PDO::FETCH_COLUMN); 
foreach($list as $name){ 
    echo $name; 
} 

とあなたとは違って、この関数は任意のクエリが返すと一緒に使用することができることを覚えている:あなたの関数は、あなたはPDOでサポートされているものは何でもメソッドを使用することができます。この

public function query($sql, $params = array()){ 
    $stmt = $this->_pdo->prepare($sql); 
    $stmt->execute($params); 
    return $stmt; 
} 

のように見えるべきですどんなタイプの結果でも、より良いエラー報告と他の多くの利点があります。

あなたのDbクラスのすべての欠点を説明する記事を書いてあります。Your first database wrapper's childhood diseasesは本当に読む価値があります。あなたは何か質問をすることを歓迎します。

関連する問題