- ベストアンサー
php 多重ループでエラー
- データベースからレコードの値を取得時にエラーが発生します。
- 2度目のexecute()でなぜエラーが発生するのでしょうか?
- 開発環境はCentOS5、PHPは5.1.6、データベースはMYSQLです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ごめんなさいお返事遅れました。 あんまり修正してもらってややこしくなるから、全部書きます。 <? try { $dbh = new PDO("mysql" . ":host=localhost" . ";" . "dbname=" . "test", "user", "password"); if (!$dbh) { $info = $dbh->errorInfo(); exit($info[2]); } } catch (PDOException $e) { exit('データベースに接続できませんでした。' . $e->getMessage()); } $sql = "SELECT * FROM Master"; $result = $dbh->prepare($sql); $result->execute(); while ($rs = $result->fetch(PDO::FETCH_ASSOC)) { $sql = "SELECT * FROM MasterSub"; $sql = $sql . " Where ID = \"{$rs['ID']}\""; $result2 = $dbh->prepare($sql); $result2->execute(); while ($rs2 = $result2->fetch(PDO::FETCH_ASSOC)) { $Name = $rs["Name"]; } $rs2 = null; $result2 = null; } $rs = null; $result = null; ?> MYSQLはwhere カラム名 = ;ではエラーを吐きます。 where カラム名 = "";だと対象レコードなしを返します。 Masterテーブルの内容を見ていませんがIDカラムが空白かnullのレコードが含まれているんじゃないでしょうか? \はご存知かも知れませんがエスケープです。 これで動け~!と祈りつつ。
その他の回答 (3)
- Tarepanda_club
- ベストアンサー率72% (16/22)
たびたびすみません。 いろいろまちがえてました。 >2度目のexecute()はループ内のexecute()1回目ですね。 さらに$sql2に書き換えなくてもSELECT * FROM MasteSub Where ID = {$rs['ID']}は走ります。 重ね重ねごめんなさい。 すでに$sql2に書き直された前提で。 MasterとMasteSub(MasterSubの誤記じゃないですね?)の構成が書かれていないので微妙ですが 私が使うチェック方法は $sql2 = $sql2 . " Where ID = {$rs['ID']}"; ← さっき"}"抜けてました echo$sql2; ← これを追記 $result2 = $dbh->prepare($sql2); と一行追記して、画面に表示されたSQL文をsqlでコマンド実行します。 おそらく詳しいエラーメッセージが返ります。テーブルがないとかIDカラムがないとか。 せっかくprepare使うなら下なんてどうでしょう? $sql2 = "SELECT * FROM MasteSub Where ID = ?"; $result2 = $dbh->prepare($sql2); $result2->execute(array($rs['ID'])); while ($rs2 = $result2->fetch(PDO::FETCH_ASSOC)) ← "if"じゃないと思う { $Name = $rs["Name"]; } $rs2 = null; $result2 = null; } あとはおせっかいになるのですが $Name = $rs["Name"]; のあと echo$Name; ←とかにして結果表示しなくていいですか? $sqlや$sql2の結果セットが複数だった場合最後の1データだけが$Nameに残るのですが。 長くなりました。すみません!
- Tarepanda_club
- ベストアンサー率72% (16/22)
はじめまして。 $sql = "SELECT * FROM MasteSub"; $sql = $sql . " Where ID = {$rs['ID']"; のところで$sqlという変数を書き換えているので $sql = "SELECT * FROM Master"; の2回目のループが SELECT * FROM MasteSub Where ID = {$rs['ID']} になっているのです。 $sql2 = "SELECT * FROM MasteSub"; $sql2 = $sql2. " Where ID = {$rs['ID']"; $result2 = $dbh->prepare($sql2); で走りますよ! 一回目が走っているのですから。 わたしもコピペでいまだにコレをやらかします~
お礼
ご回答ありがとう御座います。 ご指示頂いたところを修正したのですが、結果変わりませんでした。
- shimix
- ベストアンサー率54% (865/1590)
この手のエラーでは $result2->execute(); //ここでエラー発生 の一つ前の $result2 = $dbh->prepare($sql); の結果を確認すべきでしょう。提示されたソースを読む限りでは $sql = $sql . " Where ID = {$rs['ID']"; 括弧が閉じていないのでSQL文に含まれてしまっていませんかね($sqlをprintしてみればわかると思います)。
お礼
ご回答ありがとうございます。 $sql = $sql . " Where ID = {$rs['ID']"; は転記ミスです。 ソース上は、$sql = $sql . " Where ID = {$rs['ID']}";になっています。
補足
>MasteSub(MasterSubの誤記じゃないですね? すみません!MasterSubの転記ミスです。 やはり、ご指示いた点をなおしても同じエラーが出ます。 $result2 = $dbh->prepare($sql);の前に$result=null;を追加すると、 エラーが回避されますが、 while ($rs = $result->fetch(PDO::FETCH_ASSOC))がレコードが複数あるのに対し、1回で終わってしまいます。