$sql="SELECT * FROM table";
$res=$pdo->query($sql);
$res2= clone $res;//コピー
//ループ
while($any_data=$res->fetch(PDO::FETCH_ASSOC))
{
echo $any_data[0];
}
//$res2コピーでループ
while($any_data2=$res2->fetch(PDO::FETCH_ASSOC))
{
echo $any_data2[0];
}
データベースへのアクセス回数を減らそうと上記の様に
$res2= clone $res;//コピー
を行い、ループを行ったのですが、コピー文の結果が出ません。
どこが間違っているのでしょうか?
また、他の方法で実現する方法があれば教えてください。
どこが間違っているのでしょうか?
メソッドの名前から query でデータベースの検索をして、その戻り値には検索結果が入っている、と思いがちですが、実際には fetch でデータベースのアクセスをしています。
なので clone しても、検索結果を複製したことにはなりません。
fetch をする度に、データベースのカーソルが次の条件を満たすレコードを指すように動いていきます。
また、他の方法で実現する方法があれば教えてください。
最初に結果を全て配列に取り込んで置いて、それぞれの処理ではその配列を使って処理をするようにします。
fetch でループを回して、自分で用意した配列に追加していくか、fetchAll を使って、一気に取り込みます。
PHP: PDOStatement::fetchAll - Manual
fetchAll は何通りかの使い方があるので、”php query fetchAll” みたいな感じでググってみてください。
データベースへのアクセスを一回にするなら、配列に一旦格納して、それを参照ですね。
$anydata = array();
で初期化して、
whileループ内で、
$anydata[] = $any_data[0];
で格納できますね。
回答ありがとうございます。
どこが間違っているのでしょうか?
メソッドの名前から query でデータベースの検索をして、その戻り値には検索結果が入っている、と思いがちですが、実際には fetch でデータベースのアクセスをしています。
なので clone しても、検索結果を複製したことにはなりません。
fetch をする度に、データベースのカーソルが次の条件を満たすレコードを指すように動いていきます。
また、他の方法で実現する方法があれば教えてください。
最初に結果を全て配列に取り込んで置いて、それぞれの処理ではその配列を使って処理をするようにします。
fetch でループを回して、自分で用意した配列に追加していくか、fetchAll を使って、一気に取り込みます。
PHP: PDOStatement::fetchAll - Manual
fetchAll は何通りかの使い方があるので、”php query fetchAll” みたいな感じでググってみてください。
回答ありがとうございます。
fetchで1回1回取りにいってるんですね。それなら謎が解けました(・∀・)
ふむふむ
回答ありがとうございます。
回答ありがとうございます。
2015/04/09 14:00:35fetchで1回1回取りにいってるんですね。それなら謎が解けました(・∀・)