
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;
}
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;
}
---ここまで--
これで、具体的にどういうエラーが出るのか教えていただければ、状況は判断しやすくなるかと思います。
この回答への補足
回答、ありがとうございます。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回答、ありがとうございます。pear mdb2で関数の引数の値でmysqlの連想配列を取得したかったのですが、なかなかうまくできなかったです。($res = $db->query("SELECT * FROM product WHERE id=?", array($id));)このコードが問題で他を探したのですが、だめでした。
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 で戻り値をちゃんとチェックすることが重要になってきます。
回答、ありがとうございます。最初は、prepareを使って(MDB2::isError($stat))この部分にエラーが出ていました。ここのエラーの部分を削除して、実行したら、うまく動きました。どういう訳か削除した部分を戻しても動きました。??? いずれにしても、目的は達成できました。ありがとうございました。また機会があれば、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
@fileとは
-
\\x00 でエラー
-
PHPで特定のURLにジャンプす...
-
PHPにて外部サイト内容が取得不...
-
トランザクションが原因?DBに...
-
関数の引数に未定義の変数を渡...
-
PHPでネットワークドライブのop...
-
MovePrevious関数について
-
フォントの色を変えるには?
-
PHPで、エラーがない場合のみ画...
-
502 Bad Gatewayの解決方法
-
PHP関数 mb_strlenでエラーになる
-
bindValueエラー
-
日本語をGETで渡す場合UR...
-
PHPのif文でその処理を途中で抜...
-
FTPコマンドでディレクトリごと...
-
CFileDialogの最初のディレクト...
-
PHP session_destroyとsession...
-
さくらインターネットでメール...
-
Subversionのリポジトリの削除
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォントの色を変えるには?
-
PHPでfatal errorが出ても無視...
-
PHP8を使うと、大量のWarningが...
-
PHPで、エラーがない場合のみ画...
-
トランザクションが原因?DBに...
-
phpでお問い合わせフォームを作...
-
PHPで特定のURLにジャンプす...
-
try~catch構文は、どういうメ...
-
ある条件に当てはまったときに...
-
PHPでネットワークドライブのop...
-
SELECTの値を保持する
-
PHP、unpack関数でのエラー
-
functionに括弧を使用するとエラー
-
iframeからのアクセスか、ブラ...
-
phpの質問です
-
外部のHTMLに書かれた文字を取...
-
E_NOTICEでも処理を止められま...
-
日本語をGETで渡す場合UR...
-
エラーが出ない
-
「@$変数」の「@の意味は?」
おすすめ情報