Position actuelle: Accueil> Derniers articles> Détecter les problèmes de clés en double lors de l'utilisation de mysqli :: get_warnings

Détecter les problèmes de clés en double lors de l'utilisation de mysqli :: get_warnings

gitbox 2025-05-29

Pourquoi dois-je utiliser mysqli :: get_warnings () ?

Lors de l'exécution des opérations d'insertion par lots, si Insérer Ignore ou sur la mise à jour de la clé en double est utilisée, MySQL ne rapportera pas directement une erreur, mais générera des avertissements. Pour le moment, il nous est difficile d'obtenir des informations spécifiques sur les conflits grâce au mécanisme de capture d'erreur. MySQLI :: get_warnings () peut obtenir ces avertissements pour nous aider à comprendre quels enregistrements sont en conflit.

Exemple de code

Supposons qu'il y ait les utilisateurs de table de données suivants et qu'un e-mail clé unique est défini:

 CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(100) UNIQUE
);

Nous essayons d'insérer plusieurs données par lots avec des e-mails en double:

 <?php
$mysqli = new mysqli("localhost", "root", "password", "testdb");

if ($mysqli->connect_errno) {
    die("Échec de la connexion à la base de données: " . $mysqli->connect_error);
}

// Préparer l&#39;insertion des lotsSQLDéclaration
$sql = "INSERT IGNORE INTO users (name, email) VALUES 
        ('Alice', '[email protected]'), 
        ('Bob', '[email protected]'),
        ('Charlie', '[email protected]')";  // Faites attention auemailrépéter

if ($mysqli->query($sql)) {
    echo "Insérer complet。<br>";

    // passer get_warnings() 检测是否有répéter键冲突警告
    if ($warning = $mysqli->get_warnings()) {
        do {
            echo "Niveau d&#39;avertissement: " . $warning->get_errno() . "<br>";
            echo "Message d&#39;avertissement: " . $warning->get_message() . "<br>";
        } while ($warning->next());
    } else {
        echo "Aucun message d&#39;avertissement。";
    }
} else {
    echo "L&#39;insertion a échoué: " . $mysqli->error;
}

$mysqli->close();

Dans le code ci-dessus, nous utilisons INSERT IGNORE pour essayer d'insérer des données. Lorsqu'un e-mail en double est rencontré, MySQL ignore l'insertion de l'enregistrement, mais génère un avertissement. Ces informations d'avertissement peuvent être obtenues via $ mysqli-> get_warnings () pour savoir qu'il existe un conflit clé en double.

Explication détaillée de l'objet mysqli_warning

mysqli :: get_warnings () renvoie un objet mysqli_warning . Vous pouvez appeler la méthode suivante pour obtenir des informations détaillées:

  • get_errno () : Obtenez le code d'erreur pour l'avertissement

  • get_Message () : Obtenez le texte du message d'avertissement

  • Next () : Passez au prochain avertissement (le cas échéant)

Habituellement, le code d'avertissement pour les conflits de clés répétés est de 1062, et le message correspondant contiendra "l'entrée en double".

Choses à noter

  1. Si l'insertion d'ignore ou de stratégies similaires n'est pas utilisée, les conflits clés en double peuvent faire échouer directement la requête, renvoyant une erreur plutôt qu'un avertissement.

  2. get_warnings () renvoie une chaîne d'avertissement et nécessite une traversée de boucle pour obtenir tous les avertissements.

  3. Les informations d'avertissement sont relativement détaillées et peuvent être utilisées pour localiser avec précision les enregistrements contradictoires.


Grâce à mysqli :: get_warnings () , nous pouvons gérer les conflits clés en double plus élégamment pendant l'insertion des lots, ce qui assure non seulement la continuité de l'insertion des données, mais comprend également rapidement les problèmes de qualité des données et améliore la robustesse du programme.


 <?php
$mysqli = new mysqli("localhost", "root", "password", "testdb");

if ($mysqli->connect_errno) {
    die("Échec de la connexion à la base de données: " . $mysqli->connect_error);
}

$sql = "INSERT IGNORE INTO users (name, email) VALUES 
        ('Alice', '[email protected]'), 
        ('Bob', '[email protected]'),
        ('Charlie', '[email protected]')";

if ($mysqli->query($sql)) {
    echo "Insérer complet。<br>";

    if ($warning = $mysqli->get_warnings()) {
        do {
            echo "Niveau d&#39;avertissement: " . $warning->get_errno() . "<br>";
            echo "Message d&#39;avertissement: " . $warning->get_message() . "<br>";
        } while ($warning->next());
    } else {
        echo "Aucun message d&#39;avertissement。";
    }
} else {
    echo "L&#39;insertion a échoué: " . $mysqli->error;
}

$mysqli->close();