1. ホーム
  2. php

MySQLiのプリペアドステートメントエラーレポート [重複]

2023-08-20 03:11:56

質問

MySQliを使いこなそうとしているのですが、エラー報告に戸惑っています。 私はMySQLiの'prepare'ステートメントの戻り値を使って、このようにSQLを実行するときにエラーを検出するようにしています。

$stmt_test =  $mysqliDatabaseConnection->stmt_init();
if($stmt_test->prepare("INSERT INTO testtable VALUES (23,44,56)"))
{
 $stmt_test->execute();
 $stmt_test->close();
}
else echo("Statement failed: ". $stmt_test->error . "<br>");

しかし、prepare文の戻り値は、SQL文のpreperationにエラーがある場合のみ検出し、実行エラーは検出しないのでしょうか?もしそうなら、実行行もこのようにエラーをフラグするように変更すべきでしょうか。

if($stmt_test->execute()) $errorflag=true;

そして、念のため、ステートメントが実行された後、次のようなこともしておいたほうがいいでしょう。

if($stmt_test->errno) {$errorflag=true;}

...あるいは、私は最初からOKで、MySQLi の prepare' ステートメントの戻り値は、それが定義するクエリの完全な実行に関連するすべてのエラーを捕捉していたのでしょうか。

感謝 C

どのように解決するのですか?

mysqliの各メソッドは失敗する可能性があります。それぞれの戻り値をテストする必要があります。1 つでも失敗したら、期待する状態にないオブジェクトで処理を続けることに意味があるかどうかを考えてください。(安全な状態でない可能性もありますが、ここでは問題ないと思います。)

最後の操作に対するエラーメッセージのみが接続/ステートメントごとに保存されるため、次のような情報を失う可能性があります。 に関する情報を失うかもしれません。この情報を使って、スクリプトが再試行するか(一時的な問題)、何かを変更するか、完全にやめるか(バグを報告するか)を決定したいと思うかもしれません。そして、それはデバッグをより簡単にします。

$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)");
// prepare() can fail because of syntax errors, missing privileges, ....
if ( false===$stmt ) {
  // and since all the following operations need a valid/ready statement object
  // it doesn't make sense to go on
  // you might want to use a more sophisticated mechanism than die()
  // but's it's only an example
  die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}

$rc = $stmt->bind_param('iii', $x, $y, $z);
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement
// or there's a type conflict(?), or ....
if ( false===$rc ) {
  // again execute() is useless if you can't bind the parameters. Bail out somehow.
  die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}

$rc = $stmt->execute();
// execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( false===$rc ) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}

$stmt->close();

6年後のメモです。

mysqli 拡張モジュールは、0 以外の (mysqli) エラーコードを発生させる操作を例外として報告することが可能です。 mysqli_driver::$report_mode .

ダイ() は本当に、本当に下品で、私はもうこのような例のためにさえ使いません。

という事実だけを取り上げて、お願いします。 それぞれ (mysql) の操作 は多くの理由で失敗します。 もし であってもです。