<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
$sql = "INSERT INTO users (username, email) VALUES ('testuser', '[email protected]')";
$mysqli->query($sql);
echo "Nombre de lignes affectées:" . $mysqli->affected_rows;
?>
Dans le code ci-dessus, une nouvelle donnée est insérée et $ affecte_rows doit retourner 1, indiquant qu'une ligne est insérée.
Cause : si vous exécutez l'insert ... sur l'instruction de mise à jour des clés en double et ne mettez pas à jour les données, $ affecte_rows peut renvoyer 2 ou 0, selon la version MySQL.
illustrer :
Dans MySQL 5.1 et plus tôt, le nombre de lignes affectées par la mise à jour de clé en double est 1 (insert) ou 2 (mise à jour).
Après MySQL 5.7, si aucune donnée n'est réellement mise à jour, 0 sera renvoyé.
résoudre :
Vous pouvez vérifier $ mysqli-> info pour plus de détails, ou ajuster la logique en fonction de vos besoins.
<?php
$sql = "INSERT INTO users (username) VALUES ('user1');";
$sql .= "INSERT INTO users (username) VALUES ('user2');";
$mysqli->multi_query($sql);
do {
if ($result = $mysqli->store_result()) {
$result->free();
}
echo "Nombre de lignes affectées:" . $mysqli->affected_rows . "\n";
} while ($mysqli->more_results() && $mysqli->next_result());
?>
Remarque : $ affecte_rows est une requête qui a été exécutée pour la dernière fois. Si vous exécutez plusieurs instructions par lots, vous devez traiter les résultats un par un pour obtenir avec précision le nombre de lignes affectées pour chaque instruction.
$ affecté_rows n'est valable que pour les opérations d'écriture (insérer, mettre à jour, supprimer). L'instruction SELECT n'affectera aucun nombre de lignes et renvoie -1.
Si vous souhaitez savoir combien de résultats une requête sélectionnée renvoie, vous devez utiliser $ result-> num_rows .
Transaction non engagée : si la transaction est activée et non engagée, $ affecte_rows reflète toujours le nombre réel de lignes affectées, mais les données ne sont pas engagées dans la base de données.
Impact de déclenchement : la modification des lignes pendant l'exécution du déclencheur MySQL ne modifiera pas la valeur de $ affecte_rows en php.
État de la connexion : assurez-vous que la connexion MySQLI est normale, $ affecte_rows peut renvoyer -1 par erreur.
Utilisez $ mysqli-> Erreur pour vérifier les erreurs SQL.
Utilisez $ mysqli-> Info pour afficher les détails de la dernière instruction exécutée.
Allumez les journaux MySQL ou utilisez des outils pour voir si le SQL exécuté est cohérent avec celui attendu.
MySQLI :: $ affecte_rows est un outil efficace pour détecter le nombre de lignes qui affectent l'opération d'écriture, mais il est facile d'être confus dans les situations suivantes:
Lorsque vous utilisez SQL complexe (comme sur la mise à jour de la clé en double ), une attention particulière doit être accordée aux règles de valeur de retour.
Lorsque plusieurs lots SQL sont exécutés, les résultats doivent être traités un par un.
L'instruction SELECT n'affecte pas le nombre de lignes, utilisez à la place $ result-> num_rows .
Les transactions, déclencheurs, etc. peuvent également affecter les performances réelles.
Tant que vous comprenez son principe de travail et ses conditions aux limites, $ affecte_rows peut vous aider à juger avec précision l'effet de fonctionnement de la base de données et à améliorer la robustesse du code.