dポイントプレゼントキャンペーン実施中!

php pear mdb2に質問です。

以下の関数でエラーが出ます。

間違っているところがあれば、回答お願いします。

function product_info($id) {
global $db;
$res = $db->query("SELECT * FROM product WHERE id=?",
array($id));

if ($res != null) {
$row = $res->fetchrow(MDB2_FETCHMODE_ASSOC);
return $row;
}
return null;
}

A 回答 (2件)

具体的なエラー内容を教えてください。

そうでないと判断のしようがありません。
とりあえず考えられる原因としては、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;
}
---ここまで--

これで、具体的にどういうエラーが出るのか教えていただければ、状況は判断しやすくなるかと思います。

この回答への補足

回答、ありがとうございます。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)です。

補足日時:2010/07/06 21:44
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/07 20:53

回答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 で戻り値をちゃんとチェックすることが重要になってきます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/07/07 21:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!