8722 sujets

Développement web côté serveur, CMS

Bonjour,

cela fait 4 jours que je suis sur ce problème que je n'arrive pas à comprendre et qui me parait pourtant anodin mais quand on a la tête dedans.... Smiley confused


$reponse = $bdd->query("SELECT * FROM `chien` WHERE nom = 'François Premier des Adrilines d\'Opale'");
				
			while ($donnees = $reponse->fetch())


François Premier des Adrilines d\'Opale était biensur à la base dans une variable, je l'ai écrit complètement pour pouvoir tester et même comme ça, ça ne marche pas. Lorsque je met un nom sans quote cela fonctionne parfaitement. Il doit y avoir une " ou un ' qui m'échappe, c'est pourquoi je viens ici réclamé un œil neuf.

PS:En copiant directement le contenu de query dans mysql, la requête s'éxécute.

Merci d'avance.
Berew
Modifié par berew (03 Apr 2012 - 18:03)
si tu echo ta variable, elle est écrite réellement comment ? (suis prête à parier que c'est elle qui écrit ton \' en ' )
elle s'écrit ---------> François Premier des Adrilines d\'Opale.

Ce que je n'arrive pas à comprendre c'est que même en écrivant en dur, ça marche dans le SGBD mais pas dans le code.
Modifié par berew (03 Apr 2012 - 18:21)
SQL et PHP sont des langages différents, l'échappement est donc différent aussi.

$reponse = $bdd->query("SELECT * FROM `chien` WHERE nom = 'François Premier des Adrilines d''Opale'");


Note le plus sur reste de faire une requête préparée :

$reponse = $bdd->prepare('SELECT * FROM `chien` WHERE nom = :nom');
$reponse->bindValue('nom','François Premier des Adrilines d\'Opale',PDO:;PARAM_STR);
$reponse->execute();

(:; est :: problème de smilie)

Ou quelques autres variantes (histoire de savoir qu'elles existent) :
$reponse = $bdd->prepare('SELECT * FROM `chien` WHERE nom = :nom');
$reponse->execute(array('nom'=>'François Premier des Adrilines d\'Opale'));

$reponse = $bdd->prepare('SELECT * FROM `chien` WHERE nom = ?');
$reponse->execute(array('François Premier des Adrilines d\'Opale'));

$reponse = $bdd->prepare('SELECT * FROM `chien` WHERE nom = ' . $bdd->quote('François Premier des Adrilines d\'Opale'));

Modifié par KyleKatarn (03 Apr 2012 - 19:27)
Merci de votre aide mais le résultat reste le même, je n'arrive pas à rentrer dans ma boucle...

Ne faudrait-il pas chercher du coté de l'encodage?
Modifié par berew (03 Apr 2012 - 19:48)
Pourquoi ne pas essayer de modifier directement le jeu de caractères de la base ?
par "latin" au lieu de "iso", par exemple ?
J'ai déjà pu résoudre ce problème de cette façon !
Modifié par jytest (03 Apr 2012 - 21:22)
L'encodage de l'apstrophe ??
À moins que ce soit une apostrophe courbe, l'apostrophe fait partie des 128 premiers caractères donc codé de la même manière dans tous les encodages. Et même aucun problème d'encodage ne ferait échouer la requête.

Si tu nous donnais le message d'erreur renvoyé par SQL plutôt, on avancerait, si ça se trouve c'est un simple problème de nom de colonne :

$reponse = $bdd->query("SELECT * FROM `chien` WHERE nom = 'François Premier des Adrilines d''Opale'") or exit(@end($sql->errorInfo()));


Un dentiste n'opère pas les yeux fermés.

Un codeur ne développe pas sans messages d'erreur.
Modifié par KyleKatarn (03 Apr 2012 - 21:24)
Je n'ai pas de message d'erreur. Je débute en pdo et je ne sais pas du tout comment l'afficher. Tout ce que je sais c'est que ma requête ne fonctionne pas dans le navigateur et qu'en la copiant collant dans le SGBD elle fonctionne.
Modérateur
Bonjour, je ne pense pas qu'il ait de message d'erreur mais plutôt aucun résultat.

L'apostrophe est peut-être responsable de ce problème, si en effet une apostrophe est utilisée dans la bdd et que tu utilises une simple quote pour rechercher cela ne fonctionnera pas en effet, car ce n'est pas le même caractère.

Peux-tu montrer la ligne de la db désirée?

** edit: bah non ce n'est pas ça si cela fonctionne dans un autre système. les deux quotes ne fonctionnent pas non plus? ce devrait être ça la source du problème : ''
Modifié par kustolovic (04 Apr 2012 - 09:34)
Le or exit(...) doit suffire à afficher l'erreur s'il y en a une, si tu as mis ce code (le or exit) après chaque requête, et que tu n'as pas de message, alors c'est qu'il n'y a pas d'erreur SQL.

Maintenant, essayons de voir de proche en proche :
$reponse = $bdd->query("SELECT * FROM `chien` WHERE nom LIKE 'François Premier des Adrilines d%Opale'") or exit(@end($sql->errorInfo()));


Ici, on recherche les nom qui ressemble à "François Premier des Adrilines d[...]Opale"
Le symbole % signifiant (avec LIKE) un ou plusieurs ou aucun caractères.

Si une ligne est retournée, alors, c'est qu'on a bien un problème d'échappement.

Il faudra également regarder si l'entrée est "transformée", par exemple si tu as fait un htmlspecialchars ou htmlentities avec ENT_QUOTES, tu n'as plus d'apostrophe, tu as ' à la place.

Si tu as laissé les magic_quotes, alors au lieu de l'apostrophe, tu as \' dans la base et là du coup, il faut faire \\'' dans la requête. \\ donne un \ en PHP et '' donne un ' en SQL. C'est un peu tordu donc le mieux, c'est encore de faire en sorte que le contenu de la base de données soit clean : ... d'Opale sans anti-slashes ni transformation. Ce n'est peut-être pas le cas, ce qui expliquerait le bug.
Bonsoir,

J'ai testé de mettre le or exit mais aucune erreur ne s'est affiché. Je ne pense pas qu'il y est d'erreur SQL puisque le copier coller de ma requête fonctionne dans SQL.

Je suis presque sûr que c'est au niveau de l'échappement que se trouve la source de mon problème. J'ai testé ta requête avec LIKE mais sans succès encore une fois.

Je laisse de coté pour l'instant toute ton histoire de transformation, je voudrais déjà que ça fonctionne en dur avant de repasser en variable^^ Smiley lol .

Dans ma table, le nom est celui-ci: François Premier des Adrilines d'Opale.
Idée idiote, et en inversant simple et dubble quote ?

$reponse = $bdd->query('SELECT * FROM `chien` WHERE `nom` = "François Premier des Adrilines d'Opale"');

ça passerait pas ?
Non ça ne marche pas, je suis vraiment dégouté de passer tant de temps sur un truc comme ça... Smiley bawling
Lothindil a écrit :
Idée idiote, et en inversant simple et dubble quote ?


Sauf que du coup, il faut également échapper la simple quote autrement c'est la fin de la query qui est trouvé

$reponse = $bdd->query('SELECT * FROM `chien` WHERE `nom` = "François Premier des Adrilines d\'Opale"');

Modifié par Apoooo (05 Apr 2012 - 19:50)
D'après mes tests, il ne s'agirait même pas de l'échappement, j'ai fait un test conditionnel pour vérifier qu'un nom existe bien dans la base et à ma grande surprise je n'arrive pas à entrer dans mon if.


if ($_GET['nom'] == htmlentities($donnees['nom']))



Je soupçonne cet erreur d'être la même que celle qui m'a amené ici. N'y a-t-il pas un problème de transition de données entre mon fichier et la base?
Ok je viens de trouver ton problème...

Le fait que ta query ne renvoi rien n'est pas dû à la simple quote mais à "François", plus précisément au "ç" du mot qui lui est un caractère spécial.

Tu peux tester par toi même en réduisant ta recherche grâce à LIKE :

'SELECT * FROM `chien` WHERE `nom` LIKE "%Premier des Adrilines d\'Opale%"'

'SELECT * FROM `chien` WHERE `nom` LIKE "%François Premier des Adrilines d\'Opale%"'


La première il trouve, la seconde non. En modifiant le "ç" en "c" de ton entrée dans la table (et la requete aussi biensur..), cela fonctionne bien.

Donc soit tu faits en sorte que les encodages correspondent, soit tu encodes tes accents en HTML &ccedil par exemple... Ou peut être d'autres solutions te seront proposées.
Modifié par Apoooo (05 Apr 2012 - 20:16)
Une semaine que j'attends ça, merci beaucoup apoooo !!! Par contre j'aimerais que tu m'expliques parce que pour moi tout est en utf-8 donc je ne comprends pas qu'il y est des problèmes d'encodage.
Merci pour tout apoo je viens de résoudre le problème. Tout résidais dans le fichier de connexion à ma bdd ou je ne précisais l'encodage. En ajoutant cette petite ligne dans mon fichier, tout est rentré dans l'ordre.

array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')


Merci encore de ton aide et bonne continuation.
Modifié par berew (05 Apr 2012 - 21:37)
Merci pour tout apoo je viens de résoudre le problème. Tout résidais dans le fichier de connexion à ma bdd ou je ne précisais l'encodage. En ajoutant cette petite ligne dans mon fichier, tout est rentré dans l'ordre.

array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')


Merci encore de ton aide et bonne continuation.