- 締切済み
PHP PEARにてポインタをリセットする方法
お世話になります。 下記のように、SQL発行→該当データの有無チェック→あれば該当データの出力を行おうとしています。 // SQL発行 $sql = "select username from company where section=?"; $data = $section_id; $rs =& $db->query($sql, $data); // データ有無チェック $dataExist = false; while($row=$rs->fetchRow()){ …(1) $dataExist = true; } if(!$dataExist){ print("該当データがみつかりません。"); } // 該当データ出力 else{ while($row=$rs->fetchRow()){ …(2) print($row[0]); print("<br>\n"); } } 発行したSQLに対し(1)で該当データの有無をチェックしているのですが、これによりポインタが最終行まで移動する為(2)でfetchRowを実行しようとしてもエラーとなり該当データが取得できません。 同じSQLを再実行することなく該当データを取得できるよう、ポインタをリセットする方法はあるでしょうか。 どうぞご指導の程宜しくお願い申し上げます。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- agunuz
- ベストアンサー率65% (288/438)
あらら・・・。 No.2の回答は慌てて $rs-> を端折ってしまってますのでご注意を(やり方は読み取れますよね)。
- agunuz
- ベストアンサー率65% (288/438)
>fetchRow(DB_FETCHMODE_ASSOC, 0)としてみたのですが、 >今度は該当データが無限に出力されてしまいます。 リセットして最初から読みたいときに1回だけ指定すればいいです。最初だけ読み方が違うので、こういうときこそdo~while構文が楽でしょう。 // ここまでにfetchRowを繰り返して一度読込んだとして $row = fetchRow(DB_FETCHMODE_ASSOC, 0); // 先頭に戻して読む do { $rowを使った処理をここに書く } while ($row = fetchRow(DB_FETCHMODE_ASSOC)); // 「次」を読む
- agunuz
- ベストアンサー率65% (288/438)
なぜ読み込み部分を2箇所で書くのかがわかりません。 $dataExists = false; while ($row = $rs->fetchRow()) { // データがあったときの処理(ループ) }$dataExist = true; print($row[0]); print("<br>\n"); } if(!$dataExist){ print("該当データがみつかりません。"); } でいいのでは? あるいは(どうしても先読みして決着付けたいなら) if ($row = $rs->fetchRow()) { do { print($row[0]); print("<br>\n"); } while ($row = $rs->fetchRow()); } else { print("該当データがみつかりません。"); } とか
補足
早速のご回答ありがとうございます。 実際のプログラムはデータ内容を一度把握し、その内容により出力の仕方が変わるようになっています。 その為にfetchRowを再度実行する必要があります。 記載したコードは、質問内容を伝え易いようにとシンプルなものを作成したのですが、言葉足らずの為に却って伝わりにくくなってしまったようで申し訳ございません。 他のサイトで、fetchRowの第2引数に開始行番号を指定すれば良いとあり(http://grokbase.com/t/php/pear-dev/017k7jgr00/data-seek-equivalent)、fetchRow(DB_FETCHMODE_ASSOC, 0)としてみたのですが、今度は該当データが無限に出力されてしまいます。 同じSQLを発行するコードを追加して$rs->fetchRow()とすると正常に動作するので、無限ループに陥る原因が分からず困っております。
お礼
丁寧なご説明とご回答をありがとうございます! お陰様で正常に動作致しました。 体調を崩していてお礼と返信が大変遅くなりました事、重ねてお詫び申し上げます。