Position actuelle: Accueil> Derniers articles> mysqli :: get_warnings la bonne façon d'utiliser avec mysqli :: requête

mysqli :: get_warnings la bonne façon d'utiliser avec mysqli :: requête

gitbox 2025-06-04

Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, nous faisons généralement attention à la réussite de la requête et si une erreur a été lancée, mais il y a une situation qui est souvent ignorée:. Si ces avertissements ne sont pas spécifiquement traités, ils peuvent masquer des problèmes potentiels tels que la troncature du champ, les valeurs par défaut en cours de remplacement, etc. Cet article partagera comment utiliser MySqli :: Query () et MySqli :: get_warnings () en combinaison pour capturer ces avertissements et donner les meilleures pratiques.

Pourquoi avez-vous besoin de suivre les avertissements SQL?

Considérez un SQL comme ceci:

 $sql = "INSERT INTO users (username, email) VALUES ('this_is_a_very_long_username_that_will_be_truncated', '[email protected]')";

En supposant que la longueur maximale du champ de nom d'utilisateur est de 30 caractères, l'exécution réelle du SQL ci-dessus sera tronquée. Bien qu'aucune erreur ne soit lancée, un avertissement sera généré. Si nous l'ignorons, les données sont discrètement «traitées» sans que vous le sachiez.

Que fait MySqli :: Get_Warnings?

MySQLI :: get_warnings () est une méthode utilisée pour obtenir des informations d'avertissement SQL de l'opération précédente. Il renvoie un objet contenant des niveaux d'avertissement, du code et des messages qui peuvent être utilisés pour déboguer ou se connecter.

Exemples d'utilisation réels

Regardons d'abord un exemple minimal pour comprendre l'utilisation de base:

 <?php

$mysqli = new mysqli("localhost", "user", "password", "test");

if ($mysqli->connect_error) {
    die("Échec de la connexion: " . $mysqli->connect_error);
}

$sql = "INSERT INTO demo (name) VALUES ('Les déclencheurs de cordes extra-longues avertissent des déclencheurs de chaîne extra-longs avertissement des strings extra-longs déclencheurs avertissement')";

if ($mysqli->query($sql)) {
    echo "Insérer avec succès\n";

    // Vérifiez les avertissements
    $warning = $mysqli->get_warnings();
    while ($warning) {
        echo "avertir: [{$warning->errno}] {$warning->message}\n";
        $warning = $warning->next();
    }

} else {
    echo "La requête a échoué: " . $mysqli->error;
}

$mysqli->close();

Suggestions pratiques: avertissements en logarithme

Dans les projets réels, il n'est pas recommandé de produire des avertissements directement à l'utilisateur, mais de les enregistrer dans le journal. Par exemple:

 function log_warnings($mysqli) {
    $warning = $mysqli->get_warnings();
    while ($warning) {
        error_log("SQL Warning [{$warning->errno}]: {$warning->message}");
        $warning = $warning->next();
    }
}

$sql = "UPDATE users SET username='Les noms excessivement longs seront coupés' WHERE id=1";

if ($mysqli->query($sql)) {
    log_warnings($mysqli);
} else {
    error_log("SQL Error: " . $mysqli->error);
}

La connexion au journal aide non seulement à résoudre les problèmes plus tard, mais fournit également des commentaires sur la qualité SQL dans l'environnement de test.

Choses à noter

  1. get_warnings () ne fonctionne que pour la dernière requête;

  2. Il renvoie un objet similaire à une liste liée, traversé par Next () ;

  3. Tous les pilotes ne prennent pas en charge les avertissements entièrement et la configuration de la base de données doit être testée avant utilisation;

  4. mysqli_report () ne peut pas remplacer get_warnings () , le premier accorde plus d'attention aux erreurs;

  5. Utilisez des instructions de préparation ( Préparez ) pour déclencher et obtenir des avertissements comme ils le font lors de la liaison des paramètres.

Supplément: utilisé dans les environnements de production

Vous voudrez peut-être résumer les avertissements dans la production et les signaler régulièrement, ce qui peut être fait en encapsulant une classe d'assistant de base de données:

 class DB {
    protected $mysqli;

    public function __construct() {
        $this->mysqli = new mysqli("localhost", "user", "password", "appdb");
    }

    public function query($sql) {
        $result = $this->mysqli->query($sql);
        if ($result) {
            $this->logWarnings();
        } else {
            error_log("SQL Error: " . $this->mysqli->error);
        }
        return $result;
    }

    protected function logWarnings() {
        $warning = $this->mysqli->get_warnings();
        while ($warning) {
            error_log("[DBavertir] {$warning->errno} - {$warning->message}");
            $warning = $warning->next();
        }
    }
}

$db = new DB();
$db->query("UPDATE posts SET title='标题过长会触发avertir,Faites attention au contrôle de la longueur' WHERE id=42");

Résumer

MySQLI :: Query () est un outil puissant pour exécuter SQL, tandis que MySQLI :: get_warnings () est un supplément important pour assurer l'intégrité des données. N'ignorez pas ces messages d'avertissement, ils cachent souvent vos futurs bugs. Le développement de l'habitude de capturer et de gérer les avertissements dans un environnement de développement ou de test améliorera considérablement la robustesse et la maintenabilité de votre projet.

N'oubliez pas: si l'erreur provoque la parole du programme, l'avertissement vous fera perdre le piège.