Position actuelle: Accueil> Derniers articles> Pourquoi les données renvoyées par MySQL_INFO sont-elles parfois inexactes? Causes et solutions derrière elle

Pourquoi les données renvoyées par MySQL_INFO sont-elles parfois inexactes? Causes et solutions derrière elle

M66 2025-06-27

Lorsque vous utilisez PHP pour développer des applications impliquant MySQL, certains développeurs utiliseront mysql_info () ou mysqli_info () pour obtenir des informations supplémentaires après avoir effectué certaines opérations SQL, telles que le nombre de lignes affectées par l'insertion par lots, la mise à jour ou la suppression des instructions. Cependant, vous pouvez parfois constater que les données renvoyées sont inexactes et renvoie même des chaînes fausses ou vides directement après certaines opérations. Que se passe-t-il avec ce comportement "peu fiable"? Cet article commencera de son principe de travail, analysera les raisons et fournira des stratégies d'adaptation.

1. Que fait mysql_info () ?

mysql_info () est principalement utilisé pour obtenir une brève description de l'état d'exécution après avoir exécuté certaines instructions non sélectionnées, telles que:

 $link = mysqli_connect("localhost", "user", "pass", "testdb");
mysqli_query($link, "UPDATE users SET status = 1 WHERE id < 100");
echo mysqli_info($link);

Le contenu de retour peut être:

 Rows matched: 100 Changed: 100 Warnings: 0

Ces informations de sortie sont très utiles lors du débogage des opérations par lots, telles que la détermination du nombre de lignes correspondant et du nombre de lignes modifiées. Mais cela dépend des informations d'état renvoyées par le MySQL sous-jacent.

2. Pourquoi parfois inexact?

1. Toutes les déclarations ne rendront pas les informations d'informations

Toutes les opérations non sélectionnées ne génèrent pas d'informations sur les informations , et la documentation officielle MySQL indique également clairement que seuls les types d'énoncés suivants peuvent fournir ces informations:

  • Insérer dans ... SELECT ...

  • MISE À JOUR

  • SUPPRIMER

  • Charger des données

Des déclarations telles que l'insert ordinaire, le remplacement , etc., en particulier dans les scénarios où les données ne sont pas insérées via des sous-requêtes, ne remplissent souvent pas le cache d'information.

2. Impact du comportement axé sur le client

La bibliothèque client MySQL (LibMysQL ou MySQLND) utilisée par PHP affectera également l'acquisition d'informations. Lorsque vous utilisez MySQLND (MySQL Native Driver), le contenu renvoyé par MySQLI_INFO () est plus fiable. S'il s'agit de libmysql, certaines informations ne peuvent pas être enregistrées ou retournées.

3. Informations sur l'exécution multi-statement

Si plusieurs instructions SQL sont exécutées dans une connexion (par exemple, le traitement par lots), MySQLI_INFO () ne renvoie que les informations d'information de la dernière instruction. C'est-à-dire:

 mysqli_query($link, "UPDATE table1 SET name = 'A'; UPDATE table2 SET name = 'B';");
echo mysqli_info($link); // Ne reviendra que table2 Informations sur l&#39;exécution

Cela fait croire à tort à de nombreux développeurs que les opérations précédentes n'ont pas été exécutées ou n'ont aucun effet.

4. Configuration MySQL et restrictions de version

Différentes versions MySQL Server ont des différences dans le rendement du contenu des informations. Par exemple, les versions plus anciennes peuvent ne pas compter les lignes correspondantes ou les avertissements , ou il y a un bug qui renvoie le mauvais numéro de lignes. De plus, une logique statistique peut être ignorée si certaines options d'optimisation des performances sont activées.

3. Comment utiliser correctement et éviter les erreurs de lecture?

1. Utilisez les pilotes MySQLI et MySqlnd

Assurez-vous que le pilote MySqlnd est activé dans l'environnement PHP. Vous pouvez le vérifier comme suit:

 if (function_exists('mysqli_get_client_stats')) {
    echo "mysqlnd Activé";
}

MySqlnd fournit un support d'informations plus complet et standardisé, qui est plus recommandé pour les environnements de production que LibMysQL.

2. Évitez de s'appuyer sur des informations dans plusieurs déclarations

Ne comptez pas sur le retour des informations dans plusieurs instructions (Multi_Query). Chaque instruction doit être exécutée séparément et les informations d'informations correspondantes doivent être lues immédiatement pour l'empêcher d'être écrasée par des instructions suivantes.

 mysqli_query($link, "DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY");
$logInfo = mysqli_info($link);
echo "Résultats du nettoyage des journaux:" . $logInfo;

3. Statistiques des données clés par vous-même en fonction de la sémantique

Pour certaines opérations SQL importantes, il est recommandé de ne pas s'appuyer entièrement sur la description du texte renvoyée par mysql_info () , mais de la vérifier en faisant une requête ou une journalisation supplémentaire en fonction de la logique métier. Par exemple, nettoyez la différence de nombre de lignes avant et après, ou assurez-vous une exécution précise via le contrôle des transactions.

4. Évitez l'affichage du nombre de lignes trompeuse

Remarque qui a changé: 0 ne signifie pas que SQL n'a pas été exécuté avec succès, il peut se faire que les données elle-même n'ont pas changé (par exemple, mise à jour à la même valeur). Ce scénario est très courant dans la mise à jour et explique également pourquoi vous voyez des lignes correspondantes mais modifiées: 0 .

4. Compétences de débogage

Afin de déboguer et d'enregistrer plus efficacement, les informations d'informations peuvent être écrites pour se connecter ou affichées à l'interface d'arrière-plan à l'aide des méthodes suivantes:

 $sql = "UPDATE users SET status = 0 WHERE active = 0";
mysqli_query($link, $sql);
file_put_contents("/var/log/mysql_ops.log", date('Y-m-d H:i:s') . " " . $sql . " => " . mysqli_info($link) . "\n", FILE_APPEND);

Ces enregistrements de fonctionnement peuvent également être envoyés au système de surveillance à distance via l'interface: