Position actuelle: Accueil> Derniers articles> Utilisez MySqli :: Get_Warnings dans le cadre de l'analyse de code statique

Utilisez MySqli :: Get_Warnings dans le cadre de l'analyse de code statique

gitbox 2025-05-29

1. Comprendre le rôle de mysqli :: get_warnings

MySQLI :: Get_Warnings est utilisé pour obtenir l'avertissement généré par l'opération MySQL la plus récente. Par rapport aux erreurs, les avertissements n'affectent souvent pas l'exécution des instructions SQL, mais peuvent masquer les exceptions de données, les problèmes de performances ou les défauts logiques potentiels.

 $mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
    die("Échec de la connexion:" . $mysqli->connect_error);
}

$result = $mysqli->query("YOUR SQL QUERY");
if ($result) {
    if ($warnings = $mysqli->get_warnings()) {
        do {
            echo "Code d'avertissement: " . $warnings->errno . " - " . $warnings->message . "\n";
        } while ($warnings->next());
    }
}

La capture et la gestion rationnellement de ces avertissements peuvent empêcher l'accumulation de dangers cachés.


2. Problèmes rencontrés dans l'analyse statique

Les outils d'analyse statique (tels que PHPSTAN, PSALM) vérifient généralement les erreurs de type, les exceptions potentielles et les variables inutilisées dans le code, mais par défaut, ils ne prêtent pas attention aux avertissements de base de données générés au moment de l'exécution. Étant donné que GET_WARNINGS renvoie un objet complexe, si ces avertissements ne sont pas bien vérifiés et utilisés dans le code, il peut y avoir les risques suivants:

  • L'avertissement n'est pas inspecté, ce qui conduit à la négligence des risques potentiels.

  • L'objet d'avertissement n'est pas traversé correctement ou libéré.

  • Le résultat Get_Warnings est mal utilisé ou ignoré.


3. Comment intégrer le processus d'analyse statique

3.1 Rédaction de règles personnalisées ou de plugins d'extension

Certains outils d'analyse statique prennent en charge les règles définies par l'utilisateur. Les problèmes typiques suivants peuvent être détectés en écrivant des plugins:

  • Que Get_warnings soit appelé après que chaque requête a été exécutée.

  • La question de savoir si l'objet renvoyé par get_warnings a été traversé et enregistré.

  • Y a-t-il une situation où le retour de l'objet d'avertissement est ignoré?

Par exemple, pour PhpStan, vous pouvez définir une règle pour vérifier si l'appel à get_warnings est suivi de l'appel à MySQLI :: Query .

3.2 Exige clairement dans la spécification du code

Développer des spécifications de code d'équipe qui nécessitent toutes les opérations de base de données pour gérer explicitement les avertissements:

  • Après avoir exécuté l'instruction SQL, appelez $ mysqli-> get_warnings () .

  • Itérer et sortir ou loger des avertissements.

  • Pour les avertissements qui ne peuvent pas être ignorés, lancez des exceptions ou enregistrez des erreurs critiques.

3.3 Couverture des tests unitaires

Écrivez un scénario où les tests unitaires simulent une base de données pour générer des avertissements, vérifiez que le code est capturé correctement et géré:

 // Exemple d'exemple de test d'avertissement de base de données
class DatabaseWarningTest extends \PHPUnit\Framework\TestCase
{
    public function testGetWarningsHandled()
    {
        $mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
        $mysqli->query("YOUR SQL QUERY THAT CAUSES WARNING");

        $warnings = $mysqli->get_warnings();
        $this->assertNotNull($warnings, 'Les avertissements devraient être capturés');
        while ($warnings) {
            $this->assertIsInt($warnings->errno);
            $this->assertIsString($warnings->message);
            $warnings = $warnings->next();
        }
    }
}

4. Démonstration du code: un processus complet de traitement d'avertissement

 $mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
    die("Échec de la connexion:" . $mysqli->connect_error);
}

$query = "INSERT INTO users (name, email) VALUES ('Zhang San', '[email protected]')";
$result = $mysqli->query($query);

if ($result === false) {
    // Gestion des erreurs
    echo "SQLerreur:" . $mysqli->error;
} else {
    $warnings = $mysqli->get_warnings();
    if ($warnings) {
        do {
            // Enregistrer les informations d'avertissement,Ou y faire face en fonction des exigences du projet
            error_log("数据库Code d'avertissement: {$warnings->errno}, information: {$warnings->message}");
        } while ($warnings->next());
    }
    echo "L'opération est réussie,Et l'avertissement a été traité";
}

5. Résumé

L'incorporation de MySqli :: Get_Warnings dans le processus d'analyse statique est l'objectif principal de s'assurer que tous les avertissements de fonctionnement de la base de données sont correctement capturés et traités. En personnalisant les règles d'analyse statique, en renforçant les spécifications de l'équipe et en améliorant les tests unitaires, la qualité du code peut être considérablement améliorée et les risques cachés peuvent être réduits. En combinant une bonne gestion des exceptions et une journalisation, les développeurs peuvent maintenir le code d'interaction de la base de données plus calmement pour éviter les problèmes potentiels causés par l'ignorance des avertissements.