人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

取り出したクエリデータのコピー

$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;//コピー
を行い、ループを行ったのですが、コピー文の結果が出ません。

どこが間違っているのでしょうか?
また、他の方法で実現する方法があれば教えてください。

●質問者: jamis
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● POGPI
●30ポイント

データベースへのアクセスを一回にするなら、配列に一旦格納して、それを参照ですね。
$anydata = array();
で初期化して、
whileループ内で、
$anydata[] = $any_data[0];
で格納できますね。


jamisさんのコメント
回答ありがとうございます。

2 ● a-kuma3
●65ポイント ベストアンサー

どこが間違っているのでしょうか?

メソッドの名前から query でデータベースの検索をして、その戻り値には検索結果が入っている、と思いがちですが、実際には fetch でデータベースのアクセスをしています。
なので clone しても、検索結果を複製したことにはなりません。
fetch をする度に、データベースのカーソルが次の条件を満たすレコードを指すように動いていきます。

また、他の方法で実現する方法があれば教えてください。

最初に結果を全て配列に取り込んで置いて、それぞれの処理ではその配列を使って処理をするようにします。
fetch でループを回して、自分で用意した配列に追加していくか、fetchAll を使って、一気に取り込みます。
PHP: PDOStatement::fetchAll - Manual

fetchAll は何通りかの使い方があるので、”php query fetchAll” みたいな感じでググってみてください。


jamisさんのコメント
回答ありがとうございます。 fetchで1回1回取りにいってるんですね。それなら謎が解けました(・∀・)

3 ● きゃづみぃ
●5ポイント

http://funini.com/kei/java/clone.shtml

内容もコピーしないとダメでは?


a-kuma3さんのコメント
>> http://funini.com/kei/java/clone.shtml << これって、java の clone メソッドの話じゃないですか。 確かに、オブジェクトの複製を作るときには、シャローコピーだ、ディープコピーだとかは気にしなきゃいけない([http://php.net/manual/ja/language.oop5.cloning.php:title=PHP の clone は、デフォルトでシャローコピー])ですけど、PDOStatement については、そういう話じゃありません。 java の場合は、Cloneable を実装してないと例外が出るから、もっと分かりやすいですけれど、java の ResultSet クラス(PDOStatement に相当する)も同じ挙動をします。

きゃづみぃさんのコメント
ふむふむ

jamisさんのコメント
回答ありがとうございます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ