Bonjour à tous !
J'ai un petit problème avec une requête là, ca fait deux heures que je suis dessus, et pas moyen de voir ce qui merdouille :)
Je fais des tests, et dans mes tests, je tape un peu n'importe quoi pour voir ce qui passe.
Symptômes : Pour un champ texte tout con, limité à 64 caractères en base de données, j'entre 44 caractères :
)à'ç&é)"(ç_à&é"à'_&éà"'_é&à'"_éàç"_'àé"&'_)
Et la requête d'insertion de ce champ dans la base passe sans problème.
Le même champ texte, j'entre 57 caractères :
)à'ç&é)"(ç_à&é"à'_&éà"'_é&à'"_éàç"_'àé"&'_)àé"'_à'àé_"')
Ca merde.
Le code :$mysqli = $this->db;
$puName = $mysqli->real_escape_string($this->getName());
$queryInsert = "INSERT INTO publisher (pu_name) VALUES ('$puName');
if ($mysqli->query($queryInsert) === false)
throw new exceptionErrorDB(DB_UP,$queryInsert,__FILE__,__LINE__);
Vous l'aurez compris, je travaille dans la classe publisher et cette requete ajoute un éditeur à la base de données. Il n'y a aucun soucis entre le champ texte de mon formulaire et ce qui est renvoyé par getName(), c'est identique.
OUI, j'échappe bien les caractères spéciaux avec real_escape_string
Le driver MySQLi ne renvoie pas de message d'erreur !! ($mysqli->error == NULL !) par contre le sqlstate renvoie un code d'erreur : HY000 qui correspond a une erreur générique (on est avancé avec ca :) )
Le problème devient rééllement étrange lorsque j'observe les requêtes qui sont loggées.
Cette requete est la bonne requete :
INSERT INTO publisher (pu_name) VALUES (')à\'ç&é)\"(ç_à&é\"à\'_&éà\"\'_é&à\'\"_éàç\"_\'àé\"&\'_)');
Cette requête est la mauvaise requête :
INSERT INTO publisher (pu_name) VALUES (')à\'ç&é)\"(ç_à&é\"à\'_&éà\"\'_é&à\'\"_éàç\"_\'àé\"&\'_)àé\"\'_à\'àé_\"\')');
Elles semblent toutes les deux correctes, et pour cause, elles sont toutes les deux valides !!! Quand je les execute à la main, elles passent toutes les deux, mais en php, seule la première passe...
En résumé, dès que je flirte avec la limite de caractères, il semble impossible d'insérer un élément avec MySQLi :(
Je me suis dit que peut etre il comptait les \ dans le total de caractères, mais que nenni, lorsque j'insère 64 apostrophes ( simple quote ) il insère également 64 \ devant les apostrophes donc il y a 128 chars dans la requete, mais comme seulement 64 seront insérés, la requete passe comme une fleur ! Je n'y comprend rien du tout.
A tout les coups j'ai encore loupé un truc, mais quoi ? :(
Quelqu'un a une idée ?
Merci beaucoup et bonne fin de journée,
Guizmo
PS : si je ne suis pas clair dite le moi, je m'expliquerai autrement.