Problème mySQL avec apostrophe dans variable

Eléphanteau du PHP | 12 Messages

02 déc. 2010, 01:08

Bonjour à tous,

Je rencontre un problème lors d'une requête mySQL incluant une variable composée d'une apostrophe. Voici mon code (je le simplifie), on en reparle après...

Sachant que ça ne me retourne rien lorsque $album = "L\'éléphant" :

Code : Tout sélectionner

$req_album = mysql_query("SELECT * FROM albums ORDER BY id_album ASC, id ASC") or die ("Erreur sql : ".mysql_error()); while ($resultat_album = mysql_fetch_array($req_album)) { $req = mysql_query("SELECT * FROM photos WHERE album='$album' ORDER BY id_album ASC") or die ("Erreur sql : ".mysql_error()); $resultat = mysql_fetch_array($req); echo $resultat['album']; // Ça ne me retourne rien, même pas une erreur... }
Avez-vous une idée du problème sachant que ça devrait me retourner : L\'éléphant (oui, toutes mes variables ont un addslashes avant d'être intégrées à la base)

Tous les autres noms d'albums ne contenant pas d'apostrophe passent sans problème (Le lion, La tortue, etc...). Je suis en UTF-8.

devlop78
Invité n'ayant pas de compte PHPfrance

02 déc. 2010, 01:32

mySQL retourne une erreur ou non ??

Eléphanteau du PHP | 12 Messages

02 déc. 2010, 01:38

Comme je le disais dans mon message, mySQL ne retourne aucune erreur.

devlop78
Invité n'ayant pas de compte PHPfrance

02 déc. 2010, 01:42

<< L'éléphant >> existe bien dans ta table ? Si oui, vérifie que ta reqête "SET NAMES" correspond bien à l'encodage utilisé sur ta page HTML. Pour éviter les problèmes, je te conseille d'utiliser le même encodage pour tout : tables, SET NAMES, php et html. Je ne peux que t'encourager à utiliser UTF-8.

Cordialement,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 déc. 2010, 01:43

que ce passe t il lors que taffiche cette requete ?
$sql = 'SELECT * FROM photos WHERE album=\''.$album.'\' ORDER BY id_album ASC';
echo $sql;

est ce conforme à ce que t attend ?

le \ peut être viré par les mécanisme de php !

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 5462 Messages

02 déc. 2010, 01:49

active ton mysql.trace_mode : ini_set('mysql.trace_mode', true);
et essaye un var_dump($resultat);

Eléphanteau du PHP | 12 Messages

02 déc. 2010, 02:08

@ devlop78 :
<< L'éléphant >> existe bien dans ta table ? Si oui, vérifie que ta reqête "SET NAMES" correspond bien à l'encodage utilisé sur ta page HTML. Pour éviter les problèmes, je te conseille d'utiliser le même encodage pour tout : tables, SET NAMES, php et html. Je ne peux que t'encourager à utiliser UTF-8.
Oui L\'éléphant existe bien dans ma table. Tout est paramétré en UFT8, y compris avec SET NAMES.

@ moogli
que ce passe t il lors que taffiche cette requete ?
$sql = 'SELECT * FROM photos WHERE album=\''.$album.'\' ORDER BY id_album ASC';
echo $sql;

est ce conforme à ce que t attend ?
J'ai exactement le même problème, ça ne change rien.

@ stealth35
active ton mysql.trace_mode : ini_set('mysql.trace_mode', true);
et essaye un var_dump($resultat);
Je retrouve bien toutes mes données, dont L\'éléphant.

-----------------------

Par ailleurs, j'ai essayé de rajouter un addslashes à mon $album, ce qui donne désormais : L\\\'éléphant. Eh bien, c'est magique mais ça marche. Alors il faut que l'on m'explique là, parce que je n'y comprends plus rien... Voici donc le code qui passe :

Code : Tout sélectionner

$req_album = mysql_query("SELECT * FROM albums ORDER BY id_album ASC, id ASC") or die ("Erreur sql : ".mysql_error()); while ($resultat_album = mysql_fetch_array($req_album)) { $req = mysql_query("SELECT * FROM photos WHERE album='L\\\'éléphant' ORDER BY id_album ASC") or die ("Erreur sql : ".mysql_error()); $resultat = mysql_fetch_array($req); echo $resultat['album']; // Ça ne me retourne rien, même pas une erreur... }

ViPHP
ViPHP | 5462 Messages

02 déc. 2010, 02:12

problème de magic_quote et de mysql_real_escape string :wink:

Eléphanteau du PHP | 12 Messages

02 déc. 2010, 02:14

Plus de précisions ? 8-|

devlop78
Invité n'ayant pas de compte PHPfrance

02 déc. 2010, 02:20

Et bien j'imagine que tu avais fait quelquechose dans ce genre $album = 'l\'éléphant';

Ce qui donne au final l'éléphant. Donc erreur SQL (et c'est là que c'est étonnant si tu n'as pas d'erreur). Mais si tu tapes $album = 'l\\\'éléphant'; le résultat est l\'éléphant, donc ok pour SQL. De façon générale, il vaut mieux déléguer cette tâche à une fonction appropriée, car l''éléphant aurait tout aussi bien fonctionner (le double simple quote échappe le simple quote en SQL, je l'ai vérifié sur MySQL et sur PostgreSQL).

Eléphanteau du PHP | 12 Messages

02 déc. 2010, 02:26

Effectivement, en désactivant les magic_quotes ça marche nickel. Mais n'est-ce pas un peu dangereux de le désactiver ? (je pense aux injections SQL par exemple)

Que me conseilleriez-vous pour gérer au mieux une base qui va être amenée à contenir des accents, etc... Et sachant qu'il va y avoir un risque d'injection SQL du fait que je vais être amené à gérer des users/pass à l'avenir...

Enfin, dans quelle mesure dois-je mettre en place le mysql_real_escape ?

Merci pour votre aide chers amis du net !

devlop78
Invité n'ayant pas de compte PHPfrance

02 déc. 2010, 02:34

Les magic_quotes sont de faux amis. Ils sont même enlevés dans php6 et c'est une bonne chose. Pour les accents, et mêmes les caractères spéciaux en tout genre, pas de problème. Pour être sûr, utilise mysql_real_escape qui échappera tout ce qu'il faut (et ce sans avoir à t'en soucier), comme il faut.

Eléphanteau du PHP | 12 Messages

02 déc. 2010, 02:41

Bon eh bien voilà... j'apprends... Je vais suivre vos bons conseils et oublier les magic_quotes parce que ça fout vraiment la zone...

Merci pour votre aide et vos éclaircissements à une heure si tardive !

Amis codeurs, bonne nuit ! =D>

Administrateur PHPfrance
Administrateur PHPfrance | 149 Messages

29 janv. 2011, 15:37

magic_quotes c'est de la m*rde

utilisez pdo et prepare.

si vous n'y arrivez pas prenez la peine de sécuriser vos variables chaines avec des mysql_real_escape_string()
--
Moosh - ancêtre de la communauté
http://www.phpfrance.com