PHPデータベース操作では、 MySQLI拡張機能は、MySQLデータベースを接続および操作するための最も一般的に使用される方法です。多くのシナリオでは、トランザクションを使用して、データベース操作の原子性を確保します。ただし、エラー診断のためにmysqli :: $ errnoを使用する場合、混乱する状況に遭遇する場合があります。トランザクションが失敗した場合でも、 mysqli :: $ errnoは0を返します。これにより、問題を診断することが困難になります。
まず、 mysqli :: $ errnoがどのように機能するかを理解する必要があります。 mysqli :: $ errnoは、最後のデータベース操作のエラーコードを返します。操作が成功すると、その値は0です。操作が失敗すると、ゼロ以外のエラーコードが返されます。ただし、問題は、一部のデータベース操作(特にトランザクションを含む)がMySQLI :: $ errnoを常に直接更新するとは限らず、操作が故障しても、重要なエラーコードが生成されない可能性があります。
トランザクションを使用して問題に遭遇し、トランザクションが失敗したとしても、 mysqli :: $ errnoはまだ0です。これはエラーが発生していないことを意味しません。実際、トランザクション操作自体はエラーコードを直接送信しない場合があります。たとえば、 mysqli :: begin_transaction()またはmysqli :: commit()を使用する場合、データベース自体が深刻なエラーを検出しない場合、エラーコードを返すことはできませんが、トランザクションを「失敗」としてマークするだけです。
この現象は通常、次の状況で発生します。
自動コミットモード: mysqli :: $ auto_commitがトランザクションでTrueに設定されている場合、トランザクション操作が自動的にコミットされる場合があり、エラーが発生した場合でも明示的なロールバックはありません。
SQLエラーは表示されません。特にデータベースエラーが抑制された場合、一部のエラー(データ制約エラーなど)はMySQLI :: $ ERRNOにすぐに反映されない場合があります。
mysqli :: $ errnoが0を返し、トランザクション操作が失敗したと思われる場合、次の機能を組み合わせて問題を診断できます。
mysqli :: $エラー:
mysqli :: $エラーデータベース操作のエラーメッセージを返します。 mysqli :: $ errnoが0の場合、 mysqli :: $エラーをチェックすると、より詳細なエラー情報を取得するのに役立ちます。明示的なエラーコードがなくても、データベースエラーメッセージが文字列として存在する場合があります。
if ($mysqli->errno) {
echo "Error: " . $mysqli->error;
}
mysqli :: error_list :
MySQLバージョン5.5+の場合、 MySQLI :: ERROR_LISTは、トランザクションが複雑な場合に特に役立つ複数のエラー原因を含む、より詳細なエラー情報を取得できるエラーリストを提供します。
$errors = $mysqli->error_list;
foreach ($errors as $error) {
echo "Error code: " . $error['errno'] . " - " . $error['error'];
}
mysqli :: rollback() :
トランザクション障害の問題が発生した場合、トランザクションが失敗したときにRollback()を明示的に呼び出し、エラー情報と一緒にトランザクションをロールバックして問題を分析できます。これにより、不完全なトランザクションコミットによって引き起こされるデータの矛盾を回避できます。
$mysqli->rollback();
echo "Transaction failed, rolled back.";
Engine Innodbステータスを表示:
これは、INNODBエンジンのステータス情報を取得するためのMySQLに組み込みコマンドです。このコマンドを照会することにより、デッドロック、ロック待機、その他の問題など、トランザクションに関連する詳細情報を見ることができます。 mysqli :: query()を介してこのコマンドを実行して、より多くの手がかりを得ることができます。
$result = $mysqli->query("SHOW ENGINE INNODB STATUS");
$status = $result->fetch_assoc();
echo $status['Status'];
データベースログを表示します。
場合によっては、データベースのエラーログは、特にPHPによって返されたエラーコードを介していくつかの基礎となるトランザクションエラーを取得できない場合、より有用な情報を提供する場合があります。 MySQLエラーログファイルを確認するか、PHPMyAdminなどのツールを使用してこれらのログを表示できます。
mysqli :: $ errnoを使用する場合、トランザクション障害ですが、0を返す場合は、トランザクション障害の問題をより正確に診断するために、自動コミットモード、SQLエラー障害などを含むさまざまな理由が原因である可能性があります。データの一貫性を確保するために、必ずトランザクションの開始、コミット、ロールバックの操作を処理してください。