このメソッドは、 MySQLI_WARNINGオブジェクトを返し、データベースによって返されるすべての警告のトラバーサルを可能にします。正常に実行されますが、警告を返すSQLに適用されます。
$mysqli = new mysqli("localhost", "user", "pass", "database");
$mysqli->query("YOUR SQL HERE");
if ($warning = $mysqli->get_warnings()) {
do {
echo "Warning: " . $warning->message . PHP_EOL;
} while ($warning->next());
}
対照的に、 ERROR_LISTは、失敗したSQL実行情報をキャプチャするのに適したすべてのエラーメッセージ(エラーコードとメッセージを含む)を含む配列です。
$result = $mysqli->query("BROKEN SQL");
if (!$result) {
foreach ($mysqli->error_list as $error) {
echo "Error [{$error['errno']}]: {$error['error']}" . PHP_EOL;
}
}
より完全なロギングを実現するために、ログ関数、記録エラーと警告情報をカプセル化し、関連するコンテキスト(SQLステートメント、実行時間、アクセスソースなど)を記録することができます。
function log_db_activity(mysqli $mysqli, string $sql, $result): void {
$log = [];
// 記録SQL声明
$log['sql'] = $sql;
$log['time'] = date('c');
// エラーを確認してください
if (!$result && !empty($mysqli->error_list)) {
$log['errors'] = $mysqli->error_list;
}
// 警告を確認してください
if ($warning = $mysqli->get_warnings()) {
$log['warnings'] = [];
do {
$log['warnings'][] = [
'errno' => $warning->errno,
'message' => $warning->message,
];
} while ($warning->next());
}
if (!empty($log['errors']) || !empty($log['warnings'])) {
// データベースまたは永続性方法に置き換えることができます
file_put_contents(__DIR__ . '/db_log.json', json_encode($log, JSON_PRETTY_PRINT) . PHP_EOL, FILE_APPEND);
}
}
$mysqli = new mysqli("localhost", "user", "pass", "database");
$sql = "INSERT INTO users (id, name) VALUES (1, 'Tom')";
$result = $mysqli->query($sql);
log_db_activity($mysqli, $sql, $result);
MySQLは、次のようなインデックス障害を引き起こす可能性のあるクエリを実行するときに警告を発します。
$sql = "SELECT * FROM users WHERE name LIKE '%abc%'";
このSQLは合法であり、結果を返すことができますが、 get_warnings()はその効率の問題を明らかにすることができます。これは、インデックスの最適化またはクエリロジックの調整に役立ちます。
フィールドの長さを超えるコンテンツの挿入は失敗することはないかもしれませんが、警告がトリガーされます。ログを介して、フィールド設計またはフロントエンド検証ロジックをタイムリーに検出および最適化できます。
大規模なプロジェクトでは、ログをローカルテキストにのみ保存しないでください。これらのログをさらにhttps://gitbox.net/api/logsなどのリモートログコレクションサービスにプッシュできます。
function send_log_to_remote(array $log): void {
$ch = curl_init('https://gitbox.net/api/logs');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($log),
]);
curl_exec($ch);
curl_close($ch);
}