Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, l'instruction de mise à jour est l'une des opérations SQL les plus couramment utilisées. Cependant, de nombreux développeurs ignorent souvent un détail clé lors de l'exécution des opérations de mise à jour : avant d'effectuer des mises à jour, ils ne vérifient pas qu'il existe en effet un enregistrement correspondant. Cette ignorance affectera directement la valeur de l'attribut mysqli :: $ affecte_rows , ce qui peut conduire à des erreurs de logique du programme ou à un comportement anormal.
Dans MySQLI, $ mysqli-> affecté_rows renvoie le nombre de lignes affectées chaque fois qu'une opération de modification des données (telle que l'insertion , la mise à jour ou la suppression ). Cette valeur est utilisée dans de nombreux scénarios d'application pour déterminer si l'opération est réussie ou est utilisée pour enregistrer le journal d'opération, etc.
Par exemple:
<code> $ mysqli = new mysqli ("localhost", "utilisateur", "pass", "base de données");$ mysqli-> query ("Update les utilisateurs set status = 'active' où last_login <maintenant () - intervalle 30 jours");
echo $ mysqli-> affecté_rows;
</code>
Ce code publie le nombre de lignes affectées, c'est-à-dire le nombre d'utilisateurs qui ont réussi à mettre à jour l'état.
$ mysqli-> affecté_rows renvoie 0 lorsque l'instruction de mise à jour exécutée ne correspond à aucun enregistrement. En effet, aucun enregistrement n'est modifié, que la syntaxe soit correcte ou si SQL s'exécute avec succès, le nombre de lignes affectées reste 0.
Remarque: Même si la syntaxe de l'instruction SQL est complètement correcte, affecte_rows est toujours 0 si la condition où ne frappe aucune donnée. Cela ne signifie pas que l'exécution de SQL a échoué.
Par exemple:
<code> $ mysqli = new mysqli ("localhost", "utilisateur", "pass", "base de données");$ mysqli-> query ("Update les utilisateurs set status = 'active' où id = 999999");
echo $ mysqli-> affecté_rows;
</code>
En supposant que l'utilisateur avec id = 99999 n'existe pas, la sortie sera 0 , indiquant qu'aucun enregistrement n'a été mis à jour.
De plus, il y a une autre situation qui est facilement mal comprise: même si un enregistrement est égalé, si la valeur mise à jour est la même que la valeur d'origine, elle ne sera pas comptée dans le nombre de lignes affectées.
Par exemple:
<code> $ mysqli = new mysqli ("localhost", "utilisateur", "pass", "base de données");$ mysqli-> query ("Update les utilisateurs set status = 'active' où status = 'active'");
echo $ mysqli-> affecté_rows;
</code>
Dans ce code, bien que de nombreuses lignes puissent être appariées, car le champ d'état est déjà «actif» , aucune action de modification des données réelle ne se produit. MySQL pensera qu'aucune ligne n'est "affectée" et renvoie 0 .
Si vous comptez sur PECTACT_ROWS pour déterminer si l'opération est réussie, assurez-vous de considérer les deux points suivants:
Que l'exécution de SQL soit réussie (peut être jugée par $ mysqli-> errno ou $ mysqli-> erreur )
La question de savoir si affecté_rows est une valeur positive signifie que les données ont en effet été modifiées
Exemple complet:
<code> $ mysqli = new mysqli ("localhost", "utilisateur", "pass", "base de données");$ result = $ mysqli-> query ("Update les utilisateurs set status = 'inactive' où last_login <maintenant () - intervalle 1 an");
if ($ result === false) {
Die ("Erreur SQL:". $ mysqli-> error);
} elseif ($ mysqli-> affecté_rows> 0) {
Echo "mis à jour avec succès l'enregistrement {$ mysqli-> affecté_rows}.";
} autre {
Echo "Aucun enregistrement n'est mis à jour.";
}
</code>
Lors de la création d'un système de gestion ou d'une interface, les développeurs peuvent vouloir vérifier que les conditions entrantes du client atteignent des données en renvoyant affecté_rows . Sans ce mécanisme à l'avance, cela peut amener le client à penser à tort que la mise à jour a échoué ou l'erreur du serveur.
Par exemple, une interface:
<code> post /api/update-status.php?user_id=123 http / 1.1 hôte: m66.net </code>Si l'ID utilisateur n'existe pas et que le code d'interface détermine uniquement si l'opération est réussie en fonction de affecte_rows , le client peut croire à tort que le système a une erreur. Il convient de noter qu'il s'agit de "pas d'enregistrement de correspondance" plutôt que de "défaillance de l'opération" via des informations de réponse plus explicites.
Dans l'opération MySQLI de PHP, $ mysqli-> affecte_rows est un moyen important de déterminer si les données changent réellement. Mais il est important de noter:
Lorsqu'il n'y a pas d'enregistrement correspondant, la valeur est 0
Correspondait à l'enregistrement mais les données avant et après la mise à jour sont les mêmes, et elle renvoie également 0
Les erreurs d'exécution de SQL ne seront pas reflétées dans affecté_rows , et un jugement supplémentaire est requis
Lorsque vous utilisez cet attribut, les développeurs doivent comprendre pleinement leur comportement et éviter les vulnérabilités logiques ou la mauvaise évaluation des résultats de mise à jour.