PHPでは、 mysqli_autocommit()関数を使用して、トランザクションを自動的にコミットする機能を有効または無効にします。デフォルトでは、MySQLは各クエリが実行された後にトランザクションを自動的にコミットします。ただし、場合によっては、開発者は、複数のクエリが実行されるとトランザクションの一貫性が維持されるように、自動コミット関数をオフにする必要がある場合があります。この場合、開発者は手動でcompit()またはrollback()を呼び出してトランザクションをコミットまたはロールバックする必要があります。
ただし、特にmysqli_autocommit()を使用する場合、トランザクションのコミットメントがある場合があります。これらの問題を見つけるために、 mysqli :: $ errnoとmysqli :: $エラーの2つのプロパティが特に重要です。 mysqli :: $ errnoは、mysql操作のエラーコードを取得するのに役立ちますが、 mysqli :: $エラーはエラー情報を提供します。これら2つの属性を組み合わせることで、開発者は簡単にデバッグして問題を見つけることができます。
まず、基本的なPHPの例を見て、トランザクションコントロールにmysqli_autocommit()を使用する方法と、 mysqli :: $ errnoを使用する方法を示して、トランザクションをコミットするときにエラーをデバッグします。
<?php
// データベース接続を作成します
$mysqli = new mysqli("localhost", "username", "password", "database");
// 接続が成功しているかどうかを確認してください
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// 自動トランザクションの提出をオフにします
$mysqli->autocommit(false);
// トランザクションを開始します
$mysqli->begin_transaction();
try {
// 最初のクエリを実行します
$mysqli->query("INSERT INTO users (username, email) VALUES ('user1', 'user1@m66.net')");
// 2番目のクエリを実行します
$mysqli->query("INSERT INTO orders (user_id, product) VALUES (1, 'product1')");
// エラーがあるかどうかを確認してください
if ($mysqli->errno) {
// エラーがある場合,ロールバックトランザクション
throw new Exception("間違い:".$mysqli->error);
}
// トランザクションを送信します
$mysqli->commit();
echo "トランザクションは正常に送信されました!";
} catch (Exception $e) {
// 例外がキャッチされている場合,ロールバックトランザクション
$mysqli->rollback();
echo "トランザクションロールバック,間違い信息:" . $e->getMessage();
}
// データベース接続を閉じます
$mysqli->close();
?>
データベースへの接続:最初にnew mysqli()を介してデータベース接続を作成して、mysqlサーバーに接続しました。接続が失敗した場合、 $ mysqli-> connect_errorを使用してエラーメッセージを取得し、プログラムを終了します。
自動コミットをオフにする: $ mysqli-> autocommit(false)を使用して、自動コミットモードをオフにします。これは、各クエリの直後にトランザクションが送信されないことを意味しますが、代わりにコミットするためにコミット()に手動で呼び出す必要があります。
トランザクションの実行: $ mysqli-> begin_transaction()を介してトランザクションを開始し、 $ mysqli-> query()を使用して挿入操作を実行します。クエリエラーが発生した場合、 $ mysqli-> errnoはエラーコードを返し、 $ mysqli->エラーはエラーの説明を返します。
エラー処理:クエリの実行時にエラーが発生した場合、 if($ mysqli-> errno)でエラーを判断してキャッチします。エラーが発生した場合、 Throw New Exception()を使用して例外をスローし、トランザクション( $ mysqli-> rollback() )をロールバックします。
コミットトランザクション:すべてのクエリにエラーがない場合、トランザクションをコミットするために$ mysqli-> commit()を呼び出します。
接続を閉じます:最後に、 $ mysqli-> close()を使用してデータベース接続を閉じます。
上記のコードでは、 $ mysqli-> errnoが主にクエリが正常に実行されるかどうかを判断するために使用されます。クエリが失敗した場合、 $ mysqli-> errnoはゼロ以外のエラーコードを返し、 $ mysqli->エラーは特定のエラー説明情報を返します。この情報を通じて、問題をすばやく見つけることができます。
$ mysqli-> errnoが0の場合、エラーは発生しませんでした。
$ mysqli-> errnoがゼロ以外の値である場合、エラーが発生したことを意味します。 $ mysqli->エラーを使用して、特定のエラー情報を表示できます。
たとえば、挿入クエリを実行するときに挿入が故障しているため、テーブル内にデータが既に複製されている場合、MySQLはエラーコード1062 (重複キーエラーを示します)を返します。現時点では、 $ mysqli-> errnoは1062を返しますが、 $ mysqli->エラーは「キー「プライマリ」の「duplicate enter 'user1」などのエラーメッセージを返します。
1062-エントリエラーを繰り返す(例:主要な重複)
1046-データベースが選択されていません
1146-テーブルは存在しません
2002 -MySQLサーバーへの接続に失敗しました
$ mysqli-> errnoおよび$ mysqli->エラーにより、エラーの原因を効果的に見つけて、対応する測定値をタイムリーに実行できます。
要約します
トランザクションコントロールにmysqli_autocommit()を使用する場合、 mysqli :: $ errnoおよびmysqli :: $エラーは、コミットの問題に遭遇したときに非常に便利なデバッグツールです。開発者は、エラーの原因をすばやく見つけるのに役立ち、それにより問題をより効率的にデバッグして解決します。実際の開発プロセス中に、データベース操作の信頼性と安定性を確保するために、トランザクションとエラー処理メカニズムを合理的に使用することを忘れないでください。