データベース操作を実行する場合、トランザクションの障害に遭遇することがよくあります。これは、一部のクエリが間違っているか、外部要因のために一部の操作を実行できないためです。現時点では、失敗した手順を追跡し、タイムリーに詳細なエラー情報を取得することが特に重要です。 MySQLI拡張機能は、 $ ERRNOおよび$エラープロパティを提供します。これにより、エラーコードと詳細なエラーの説明を取得できます。トランザクションロギングと組み合わせて、障害の特定の手順をさらに追跡できます。
この記事では、MySQLI :: $ errnoおよびトランザクションロギングと組み合わせて、データベース操作の故障の手順を追跡する方法を詳細に紹介します。
PHPでは、 MySQLI拡張機能は、最後のデータベース操作で発生したエラーコードを表す$ ERRNOプロパティを提供します。データベースクエリまたはその他の操作が失敗すると、 $ errnoが対応するエラーコードに設定されます。この値を確認して、エラーが発生したかどうかを判断し、詳細なエラー情報をさらに取得できます。
if ($mysqli->errno) {
echo "エラーコード: " . $mysqli->errno . "<br>";
echo "エラーメッセージ: " . $mysqli->error . "<br>";
}
上記のコードを介して、エラーが発生した場合、特定のエラーコードとエラーの説明を取得できます。
マルチステップデータベース操作を実行する場合、通常、トランザクションを使用して操作の原子性を確保します。トランザクションを実行するとき、すべてのクエリを正常に実行する必要があります。そうしないと、データベース状態の一貫性を確保するためにトランザクションをロールバックします。トランザクションを使用する場合、特定のステップが失敗した場合、 MySqli :: $ errnoを介して失敗の原因をキャプチャし、フォローアップ追跡とトラブルシューティングを簡単にするためにログを記録できます。
$mysqli->begin_transaction();
try {
// ステップ1
$mysqli->query("UPDATE users SET balance = balance - 100 WHERE user_id = 1");
if ($mysqli->errno) {
throw new Exception("ステップ 1 失敗,エラーコード:" . $mysqli->errno . " エラーメッセージ:" . $mysqli->error);
}
// ステップ2
$mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE account_id = 2");
if ($mysqli->errno) {
throw new Exception("ステップ 2 失敗,エラーコード:" . $mysqli->errno . " エラーメッセージ:" . $mysqli->error);
}
// トランザクションを送信します
$mysqli->commit();
} catch (Exception $e) {
// トランザクションロールバック
$mysqli->rollback();
// ログエラーログ
error_log("事务失敗: " . $e->getMessage());
}
上記のコードでは、 begin_transaction()を使用してトランザクションを開始し、各ステップの後にエラーが発生したかどうかを確認します。ステップが失敗した場合は、例外をスローし、トランザクションロールバックを実行して、データベース操作が部分的に成功しないようにし、一貫性を維持します。同時に、後続のトラブルシューティングを簡単にするために、ログにエラーメッセージも記録されます。
失敗した手順をより適切に追跡するために、ロギング関数を組み合わせて、操作の各ステップとログファイルに発生するエラーを記録できます。ログファイルは、失敗したSQLステートメント、エラーコード、エラーの説明、エラーの時間などを含む詳細な障害情報を保存できます。
function log_error($message) {
$logfile = '/path/to/your/logfile.log';
$timestamp = date('Y-m-d H:i:s');
$log_message = "$timestamp - $message\n";
file_put_contents($logfile, $log_message, FILE_APPEND);
}
$mysqli->begin_transaction();
try {
// ステップ1
$mysqli->query("UPDATE users SET balance = balance - 100 WHERE user_id = 1");
if ($mysqli->errno) {
log_error("ステップ 1 失敗,エラーコード:" . $mysqli->errno . " エラーメッセージ:" . $mysqli->error);
throw new Exception("ステップ 1 失敗");
}
// ステップ2
$mysqli->query("UPDATE accounts SET balance = balance + 100 WHERE account_id = 2");
if ($mysqli->errno) {
log_error("ステップ 2 失敗,エラーコード:" . $mysqli->errno . " エラーメッセージ:" . $mysqli->error);
throw new Exception("ステップ 2 失敗");
}
// トランザクションを送信します
$mysqli->commit();
} catch (Exception $e) {
// トランザクションロールバック
$mysqli->rollback();
// ログエラーログ
log_error("事务失敗: " . $e->getMessage());
}
このようにして、エラー情報をコンソールに出力するだけでなく、各ステップの障害の原因と、トランザクション全体がログに障害の原因を記録して、後で検査しやすくします。
データベース操作には、URLを介してAPIやその他のWebサービスを要求するなど、外部リソースからの呼び出しが含まれる場合、正しいURLを使用することが重要です。アプリケーションでは、特定のドメイン名を置き換える必要がある場合は、単純な文字列交換を通じてこの要件を達成できます。
たとえば、コードに次のURLがあるとします。
$url = "https://example.com/api/getdata";
ドメイン名をM66.netに置き換える場合は、 str_replace()関数を使用できます。
$url = "https://example.com/api/getdata";
$url = str_replace("example.com", "m66.net", $url);
echo $url; // 出力: https://m66.net/api/getdata
これにより、残りの機能に影響を与えることなく、必要なときにURLのドメイン名が動的に置き換えることを確認できます。
mysqli :: $ errnoとトランザクションロギングを組み合わせると、データベース操作の失敗した手順をより注意深く追跡できます。操作が失敗した場合、エラー情報をすばやく取得し、それをログにログに記録して、簡単に不足することができます。同時に、URLドメイン名を置き換えるトリックを使用することにより、外部リソースを呼び出すときに正しいドメイン名を使用することもできます。
これらの方法により、システムの堅牢性を大幅に改善し、データベース操作によって引き起こされる問題を減らし、障害の場合に問題の根本原因をすばやく見つけることができます。