• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:php pear mdb2に質問です。)

質問:PHP Pear MDB2について

このQ&Aのポイント
  • PHPのPear MDB2に関する質問です。
  • 質問内容は、特定の関数でエラーが発生していることです。
  • 関数の修正方法や間違いの指摘をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

具体的なエラー内容を教えてください。そうでないと判断のしようがありません。 とりあえず考えられる原因としては、DBはちゃんとオープンできていますか? ---ここから--- $db =& MDB2::connect("…"); if( MDB2::isError($db) ) { print "connect error: ".$db->getMessage(); } ---ここまで--- といった感じで、$dbを代入してる所でエラーチェックしてみてください。 それと、queryの結果は、エラー時にはエラーであるという情報が入ってますので、nullとの比較ではエラー判定できません。 原因究明のため、「if ($res != null)」の部分は、以下のようにエラー内容を表示させるようにしてみてください。 ---ここから--- if (MDB2::isError($res)) { print "query error: ".$res->getMessage(); } else { return $row; } ---ここまで-- これで、具体的にどういうエラーが出るのか教えていただければ、状況は判断しやすくなるかと思います。

sakimun65
質問者

お礼

回答、ありがとうございます。pear mdb2で関数の引数の値でmysqlの連想配列を取得したかったのですが、なかなかうまくできなかったです。($res = $db->query("SELECT * FROM product WHERE id=?", array($id));)このコードが問題で他を探したのですが、だめでした。

sakimun65
質問者

補足

回答、ありがとうございます。DBはオープンできていますが、$resはエラーがでました。(query error: MDB2 Error: syntax error)元々のエラーは、(Fatal error: Call to undefined method MDB2_Error::fetchRow() in C:\xampp\htdocs\webapp\dblib.php on line 30)です。

その他の回答 (1)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

回答1の者です。さっきの回答では、query内容をちゃんと見てなかったのですが、 もしかして、Prepared Statement を使おうとされてますか? そうだとしたら、MDB2 のquery では無理です。(queryの第二引数は戻り値の型の指定です) prepared statement を使う時は、query の代わりに prepare と execute を使って、 以下のようにしてください。 --- $stat = $db->prepare("SELECT * FROM product WHERE id=?", null, MDB2_PREPARE_RESULT); if (MDB2::isError($stat) { print "prepare error: ".$stat->getMessage(); return null; } $res = $stat->execute(array($id)); if( MDB2::isError( $res ) ) { print "execute error: ".$res->getMessage(); return null; } $row = $res->fetchRow(MDB2_FETCHMODE_ASSOC); if( MDB2::isError( $row ) ) { print "fetchRow error: ".$row->getMessage(); return null; } return $row; --- のようにしてください。 あるいは、MDB2_Extended モジュールを入れれば (予め $db->loadModule('Extended'); しておけば) --- $res = $db->getRow("SELECT * FROM product WHERE id=?", null, array($id)); if (MDB2::isError($res)) { print "getRow error: ".$res->getMessage(); return null; } return $res; --- のように簡単に書くこともできます。 (getRow は、prepare と execute と fetchRow を、まとめて実行してくれるメソッドです なお、質問者さんが最初に > 元々のエラーは、(Fatal error: Call to undefined method MDB2_Error::fetchRow() in … と出た理由ですが、MDB2は、エラー時にはエラー型のインスタンスを返すようになっています。 そのため、エラー時の戻り値は、メソッド fetchRow を持たないため「fetchRow というメソッドは定義されていない」というエラーになるわけです。 (逆にgetMessage はエラー時のみ使えるメソッドであり、エラーが発生してない時に使うと、getMessage が Call to undefined method になってしまいます) そのため、MDB2を使う際は、MDB::isError で戻り値をちゃんとチェックすることが重要になってきます。

sakimun65
質問者

お礼

回答、ありがとうございます。最初は、prepareを使って(MDB2::isError($stat))この部分にエラーが出ていました。ここのエラーの部分を削除して、実行したら、うまく動きました。どういう訳か削除した部分を戻しても動きました。??? いずれにしても、目的は達成できました。ありがとうございました。また機会があれば、よろしくお願いします。

関連するQ&A