Cette méthode renvoie un objet MySQLI_WARNING , permettant la traversée de tous les avertissements renvoyés par la base de données. Applicable à SQL qui s'exécute avec succès mais renvoie l'avertissement.
$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());
}
En revanche, Error_List est un tableau contenant tous les messages d'erreur (y compris le code d'erreur et le message) qui convient à la capture des informations d'échec de l'exécution SQL.
$result = $mysqli->query("BROKEN SQL");
if (!$result) {
foreach ($mysqli->error_list as $error) {
echo "Error [{$error['errno']}]: {$error['error']}" . PHP_EOL;
}
}
Afin d'obtenir une journalisation plus complète, nous pouvons encapsuler une fonction de journal, enregistrer les erreurs et des informations d'avertissement, et enregistrer des contextes pertinents (tels que les instructions SQL, le temps d'exécution, la source d'accès, etc.) pour le dépannage et l'optimisation ultérieurs.
function log_db_activity(mysqli $mysqli, string $sql, $result): void {
$log = [];
// EnregistrerSQLDéclaration
$log['sql'] = $sql;
$log['time'] = date('c');
// Vérifier les erreurs
if (!$result && !empty($mysqli->error_list)) {
$log['errors'] = $mysqli->error_list;
}
// Vérifier l'avertissement
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'])) {
// Peut être remplacé par une base de données ou une méthode de persistance
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 donnera un avertissement lors de l'exécution de certaines requêtes qui peuvent provoquer une défaillance de l'index, telles que:
$sql = "SELECT * FROM users WHERE name LIKE '%abc%'";
Bien que ce SQL soit légal et puisse retourner les résultats, get_warnings () peut révéler ses problèmes d'efficacité, ce qui est propice à l'optimisation des index ou à l'ajustement de la logique de requête.
L'insertion de contenu qui dépasse la longueur du champ peut ne pas échouer, mais un avertissement sera déclenché. Grâce aux journaux, la conception de champ ou la logique de vérification frontale peuvent être découvertes et optimisées en temps opportun.
Dans les grands projets, les journaux ne doivent pas être enregistrés uniquement dans le texte local. Vous pouvez en outre pousser ces journaux vers un service de collecte de journaux distants tels que 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);
}