Position actuelle: Accueil> Derniers articles> Comment utiliser mysqli :: get_warnings et mysqli :: error_list pour effectuer une analyse de journaux plus forte

Comment utiliser mysqli :: get_warnings et mysqli :: error_list pour effectuer une analyse de journaux plus forte

gitbox 2025-05-28

1. Comprendre Mysqli :: get_warnings et mysqli :: error_list

1.1 MySQLI :: get_warnings ()

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());
}

1.2 MySQLI :: ERROR_LIST

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;
    }
}

2. Intégrer la logique de journalisation

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.

2.1 Structure du code de base

 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);
    }
}

2.2 Comment utiliser

 $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);

3. Manifestation de valeur dans les scénarios typiques

3.1 Avertissement de défaillance de l'indice

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.

3.2 Avertissement de troncature des données

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.


4. Intégrer au service de journal distant

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);
}