sql >> データベース >  >> RDS >> Mysql

MySQLiプリペアドステートメントエラーレポート

    mysqliの各メソッドは失敗する可能性があります。各戻り値をテストする必要があります。失敗した場合は、期待した状態にないオブジェクトを続行することが理にかなっているかどうかを検討してください。 (「安全な」状態ではない可能性がありますが、ここでは問題ではないと思います。)

    接続/ステートメントごとに最後の操作のエラーメッセージのみが保存されるため、に関する情報が失われる可能性があります。 何か問題が発生した後に続行すると、エラーが発生しました。その情報を使用して、スクリプトに再試行するか(一時的な問題のみ)、何かを変更するか、完全に救済するか(およびバグを報告するか)を決定させることができます。また、デバッグが非常に簡単になります。

    $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 。
    die() 本当に、本当に粗雑で、このような例でももう使用しません。
    だから、すべてという事実だけを取り除いてください。 (mysql)操作できます いくつかの理由で失敗します。 if まったく同じことが1000回前にうまくいきました....



    1. PyInstaller、スペックファイル、ImportError:「blah」という名前のモジュールがありません

    2. 接続文字列からデフォルトのスキーマを設定できますか?

    3. Microsoft SQL ServerManagementStudioの入手とインストール

    4. エンティティフレームワークにID列を挿入させるにはどうすればよいですか?