J'ai une requête où l'utilisateur tape un bloc de texte dans un champ de textarea. Ils sont capables de sauvegarder cette information dans une base de données. Le problème est que s'ils n'ont pas changé les informations ou si les informations correspondent aux données déjà dans la base de données, je reçois un '0' pour les lignes affectées. Habituellement, j'affiche une erreur qui indique que la requête a échoué quand il n'y a pas de lignes affectées. Comment est-ce que je «saurais» que les 0 lignes affectées sont parce que les données existent déjà, de sorte que je puisse montrer une erreur plus spécifique?Comment savoir si une requête MySQL UPDATE échoue parce que les informations fournies correspondent aux données déjà dans la base de données?
Répondre
Une autre raison pour laquelle vous obtiendriez 0 lignes affectées est si l'instruction UPDATE
ne correspond à aucune ligne. Par exemple:
UPDATE MyTable SET field = 'content' WHERE id = 1234;
0 lignes affectées Donne si aucune ligne existante avec id = 1234
. Ce n'est pas une erreur non plus, c'est juste un UPDATE
qui ne correspond à aucune ligne.
La façon de détecter ce cas est d'utiliser SELECT
pour vérifier qu'il existe une telle ligne. Si vous pouvez confirmer que la ligne existe, mais que UPDATE
a indiqué qu'elle affectait 0 lignes, alors vous savez que les valeurs que vous avez essayé de modifier étaient en fait les lignes déjà présentes dans la base de données.
SELECT COUNT(*) FROM MyTable WHERE id = 1234;
Mais la distinction peut ne pas être importante. Vous pouvez signaler une erreur si mysql_error()
indique qu'il y en a un, comme le suggère @BoltClock. * S'il n'y a pas d'erreur, vous pouvez simplement signaler "pas de changement" à l'utilisateur.
* Note: vous ne pas doivent signaler le message littéral retourné par
mysql_error()
. Les messages peuvent être déroutants pour les utilisateurs, c'est donc une bonne idée de signaler quelque chose de plus convivial pour eux.
Étant donné que la requête est réussie, MySQL ne doit renvoyer aucun numéro d'erreur (dans le cas contraire, 0). Dans ce cas, vous pouvez vérifier si le nombre de lignes affectées est 0 et le numéro d'erreur retourné est 0.
Si vous codez en PHP, vous pouvez faire quelque chose comme ceci:
// ... mysql_query() with the UPDATE query
if (mysql_affected_rows() == 0 && mysql_errno() == 0)
{
// Data was not changed
}
La mise à jour pour utiliser maintenant "' mysqli' "comme" "mysql'" est dépréciée. –
Merci de souligner que la distinction peut ne pas être importante. J'ai fait une erreur générale comme vous l'avez suggéré. –