PHPでMySQLデータベースを使用する場合、エラーをキャッチすることに加えて、データベースが発行した警告メッセージに注意を払う必要がある場合があります。これらの警告は、データの切り捨て、フィールドの長さを超える制限などの潜在的な問題を示している可能性があります。MySQLI:: get_Warnings関数は、これらの警告情報を入手するために、さらに処理するのに役立ちます。
この記事では、mysqli :: get_warningsをメールシステムと組み合わせて使用する方法を紹介して、簡単な例外通知サービスを構築します。データベース操作が警告を生成すると、警告コンテンツが電子メールで管理者に自動的に送信され、潜在的な問題のタイムリーな発見と処理を容易にします。
mysqli :: get_warningsは、最新のデータベース操作によって生成された警告情報を取得するために、PHPのmysqli拡張で提供される方法です。
使用例:
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->query("INSERT INTO table_name (col) VALUES ('長い文字列...')");
if ($warnings = $mysqli->get_warnings()) {
do {
echo "Warning: ({$warnings->errno}) {$warnings->message}\n";
} while ($warnings->next());
}
このメソッドは、すべての警告を通過するために使用されるerrno (警告コード)、メッセージ(警告メッセージ)、および次()メソッドを含むmysqli_warningオブジェクトを返します。
データベース操作を実行した後、 get_warningsを呼び出して警告があるかどうかを確認します。
警告が存在する場合は、すべての警告情報を収集します。
メールシステムを通じて、警告メッセージはプリセット管理者のメールボックスに送信されます。
実際のビジネスでは、このステップをデータベース操作のカプセル化関数に統合して、自動検出と通知を実現できます。
次の例は、データベース操作の後に警告を検出し、電子メール通知を送信する方法を示しています。
<?php
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
if ($mysqli->connect_errno) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$sql = "INSERT INTO users (username) VALUES ('長さを超えたユーザー名の例……')";
$mysqli->query($sql);
$warnings = $mysqli->get_warnings();
if ($warnings) {
$warningMessages = [];
do {
$warningMessages[] = "Warning ({$warnings->errno}): {$warnings->message}";
} while ($warnings->next());
$subject = "データベース警告通知";
$body = "以下は、最近のデータベース操作によって生成された警告メッセージです:\n\n" . implode("\n", $warningMessages);
$to = "[email protected]";
$headers = "From: [email protected]";
// メールを送信します
if (mail($to, $subject, $body, $headers)) {
echo "警告通知メールが送信されました。";
} else {
echo "メールの送信に失敗しました。";
}
} else {
echo "データベース警告は検出されません。";
}
$mysqli->close();
?>
ロギング:電子メールの送信に加えて、後続の監査とトラブルシューティングを容易にするために、ログファイルに警告情報を記述することをお勧めします。
非同期通知:電子メールの送信がビジネスプロセスをブロックする場合は、キューまたは非同期タスクを使用して電子メールの送信を処理できます。
より多くのアラームチャネル:SMSやWeChatなどの他のインスタント通知方法と組み合わせて、アラーム応答速度を向上させます。
例外カプセル化:データベースの操作機能をカプセル化し、エラーと警告を均一にキャプチャし、重複するコードを避けます。