MySQL 5.5 et mysqli_affected_rows()

Zax
Eléphanteau du PHP | 22 Messages

10 avr. 2019, 12:11

Bonjour,

Depuis que j'ai changé d'hébergeur (mutualisé), j'ai des résultats étonnants avec mysqli_affected_rows() : suite à un UPDATE d'une ligne qui ne modifie aucune valeur, il m'affirme que cette ligne a été modifiée (et me renvoit 1).

Avant, j'étais en MySQL : 5.0.11 (50011) et les résultats étaient corrects. Maintenant, je suis en 5.5.62 (50562). La version de PHP n'a pas changé : 5.5.38.


Exemple :

Code : Tout sélectionner

DROP TABLE IF EXISTS table_test; CREATE TABLE table_test ( id INTEGER, test_entier INTEGER ) ENGINE=MyISAM;

Code : Tout sélectionner

INSERT INTO table_test (id, test_entier) VALUES(1,5);
--> mysqli_affected_rows() renvoit 1 : normal

Code : Tout sélectionner

UPDATE table_test SET test_entier = 4 WHERE id = 1;
--> mysqli_affected_rows() renvoit 1 : normal

Code : Tout sélectionner

UPDATE table_test SET test_entier = 4 WHERE id = 1;
--> mysqli_affected_rows() renvoit 1 : bizarre !


Merci de votre aide.

Mammouth du PHP | 1560 Messages

10 avr. 2019, 13:38

je dirais que c'est logique, c'est à toi de gérer si il y a modification ou pas.

à partir du moment ou tu as un UPDATE, une ligne sera modifié même si la valeur ne change pas.

Tu peux vhercher dans les changelog de mysql pour confirmation.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Zax
Eléphanteau du PHP | 22 Messages

10 avr. 2019, 15:31

Logique ou pas, c'est discutable, vu que, d'après la doc officielle MySQL 5.5
For UPDATE statements, the affected-rows value by default is the number of rows actually changed.
...
An integer greater than zero indicates the number of rows affected or retrieved. Zero indicates that no records were updated for an UPDATE statement,
Ce qui n'est en aucun cas logique, c'est que que son comportement change de la 5.0 à la 5.5.

c'est à toi de gérer si il y a modification ou pas.
Que veux-tu dire ? Y a-t-il un paramètre ou une otpion que j'ignore et qui modifierait le comportement de cette fonction ?

Mammouth du PHP | 1560 Messages

11 avr. 2019, 08:09

je pense que le nombre de ligne modifié dépendra plus de la clause WHERE que des champs.

Si tu fais un update des données, tu connais à priori les valeurs précédente tuu peux donc en php comparer les anciennes et nouvelles données.

donc dans tous les cas tu peux te passer de cette info.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Zax
Eléphanteau du PHP | 22 Messages

28 avr. 2019, 14:12

Après d'autres recherches, je pense avoir trouvé la cause de ce comportement étrange : il s'agit d'une option que l'on peut spécifier lors de la connection :

https://dev.mysql.com/doc/refman/5.5/en ... -rows.html
https://www.php.net/manual/fr/mysqli.real-connect.php

Le souci est que le paramètre MYSQLI_CLIENT_FOUND_ROWS, qui ne devrait pas affecter le comportement de mysqli_affected_rows() lorsqu'il est omis, est parfois mal passé :
https://bugs.php.net/bug.php?id=53425