Erreur SQL sur le web, mais pas dans PHPMyAdmin

VaN
Mammouth du PHP | 1107 Messages

12 janv. 2008, 03:55

Bonsoir,

un problème peu commun se pose à moi.

Lors d'un UPDATE de table, ma page web me renvoie une erreur assez commune, à savoir :

Code : Tout sélectionner

Erreur de syntaxe pr�s de 'WHERE user_mail = '[email protected]'' � la ligne 1
Je vais donc tester dans PHPMyAdmin, et là, stupeur, la requête est parfaitement comprise, et interprétée.

Voici la requete qui pose problème :
$sql = sprintf("UPDATE ".$prefixe."users SET user_pass = '".md5($newPass)."' WHERE user_mail = '%s'", 
mysql_real_escape_string($mail));
ce qui donne :

Code : Tout sélectionner

UPDATE users SET user_pass = '83af51ded532f53346a6270ad34d3c5e' WHERE user_mail = '[email protected]'
Et la structure de la table :

Code : Tout sélectionner

CREATE TABLE `users` ( `user_id` int(11) NOT NULL auto_increment, `user_login` text character set latin1 collate latin1_general_cs NOT NULL, `user_pass` text character set latin1 collate latin1_general_cs NOT NULL, `user_mail` text NOT NULL, `user_level` tinyint(4) NOT NULL, `user_activated` tinyint(4) NOT NULL, `user_activation_key` text character set latin1 collate latin1_general_cs NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
Comment se fait-il que ma requête passe sous PHPMyAdmin, mais pas sur le web ?

Merci d'avance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 janv. 2008, 11:07

Cette requête ne fonctionne jamais dans ton script ?

Est-ce que la requête que tu nous montres a fonctionnée correctement ou est-ce qu'elle a plantée aussi en prod ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

VaN
Mammouth du PHP | 1107 Messages

12 janv. 2008, 16:48

Cette requête ne fonctionne jamais dans ton script ?

Est-ce que la requête que tu nous montres a fonctionnée correctement ou est-ce qu'elle a plantée aussi en prod ?
Je ne comprends pas bien la question. C'est le seul endroit où j'utilise cett requête (c'est le script qui permet de renouveller un password, lorsque celui-ci a été égaré.)

Je reçois ce msg d'erreur aussi bien sur serveur local que sur serveur distant.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

12 janv. 2008, 17:58

En fait, vu que la requête que tu nous montres semble valide, je me demande si l'erreur n'est pas due à une variable spécifique.

De plus, comme tu nous dit que cette requête marche dans PhpMyAdmin, je me demandais si l'exécution de cette requête via le script avait fonctionnée
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

VaN
Mammouth du PHP | 1107 Messages

13 janv. 2008, 20:55

Bin nan, ce msg d'erreur apparait sur le web, et uniquement sur le web (donc quand la totalité du script est lancé), et ce, dès sa première utilisation.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

13 janv. 2008, 22:48

À tout hasard, fais un
echo bin2hex($sql);
...pour qu'on voit de quoi est faite ta requête exactement telle qu'elle est exécutée. Ne l'édite sous aucun prétexte. (à toi d'effectuer la requête avec une adresse email invalide si tu ne veux pas la publier)

Tant que tu y es, exécute cette requête dans ton script et dans phpMyAdmin et copie/colle le résultat entre des balises

Code : Tout sélectionner

[code]SHOW VARIABLES

VaN
Mammouth du PHP | 1107 Messages

14 janv. 2008, 00:02

À tout hasard, fais un
echo bin2hex($sql);
...pour qu'on voit de quoi est faite ta requête exactement telle qu'elle est exécutée. Ne l'édite sous aucun prétexte. (à toi d'effectuer la requête avec une adresse email invalide si tu ne veux pas la publier)
Voilà ce qu'un bin2hex($sql) me renvoie :
53454c45435420757365725f6c6f67696e2046524f4d757365727320574845524520757365725f6d61696c203d20276c6f67696e40686f73742e636f6d27
Je ne connais pas du tout cette fonction, donc je ne sais pas du tout si c'est normal ou pas. j'imagine que oui, car le nom de la fonction me fait penser à une transformation en hexadecimal.
Tant que tu y es, exécute cette requête dans ton script et dans phpMyAdmin et copie/colle le résultat entre des balises

Code : Tout sélectionner

[code]SHOW VARIABLES
Pas bien compris ce que tu voulais que je fasses. Tu peux etre plus explicite sur ce point ?

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 janv. 2008, 00:26

Je voulais que tu exécutes la requête dans phpMyAdmin pour voir les variables de ton serveur, mais oublie ça, ce sera inutile.

Ta requête est telle que suit

Code : Tout sélectionner

SELECT user_login FROMusers WHERE user_mail = '[email protected]'
Il n'y a pas d'espace entre "FROM" et "users", donc la chaine "FROMuser" est considérée comme un alias, comme si tu avais utilisé

Code : Tout sélectionner

SELECT user_login AS FROMusers WHERE user_mail = '[email protected]'
Tout simplement, ta requête ne contient pas de clause FROM et MySQL s'étonne donc d'y trouver un WHERE. D'ailleurs, je viens de m'apercevoir que ce n'était pas du tout la même requête que dans ton premier post.

VaN
Mammouth du PHP | 1107 Messages

14 janv. 2008, 01:37

Rah, effectivement.

j'utilise un prefixe pour mes tables sur le serveur distant (une seule db autorisé par mon hebergeur), d'où le
FROM ".$prefixe."users
qui en fait, était un
FROM".$prefixe."users
. Et j'ai deux requetes, l'une en dessous de l'autre, je n'ai pas fait attention à laquelle des deux renvoyait cette erreur. Je me demande encore comment j'ai pu passer à coté de ça..

En tout cas, merci.