Apostrophes encore

Le
Pascale
Je suis perplexe à un point que c'est pas possible (:
D'un côté, je suis (encore) en train de travailler sur un site où j'essaie
de suivre les conseils qui m'ont été donnés ici (j'ai déjà posé des
questions concernant la gestion des apostrophes et autres caractères
spéciaux).
En résumé, pour le site en question, j'ai désactivé les magic_quotes_gpc
et, avant d'insérer ou de modifier une donnée, j'utilise par précaution
mysql_real_escape_string. Donc si une personne saisit : C'est ma demande,
je retrouve dans la table correspondante : C'est ma demande.
Rien de mystérieux ni de bizarre.

D'autre part, on a un autre site accessible au public qui, lui, a été
programmé avec les magic_quotes. Jusqu'à présent, ça marchait quand même,
mais un utilisateur est tombé sur un cas où, visiblement, les magic_quotes
ne font pas leur boulot (d'où une magnifique erreur de syntaxe SQL).
Je me suis dit que, quitte à y passer un peu de temps, autant virer ces
magic_quotes et utiliser mysql_real_escape_string, ce que j'ai donc fait
sur ma base de test.
J'ai donc par exemple :
$escchamp1=mysql_real_escape_string($champ1);
$escchamp2=mysql_real_escape_string($champ2);

Puis :
$upd = "UPDATE valinfo SET champ1='$escchamp1',champ2='$escchamp2' WHERE
numero='$numero'";

Et bien ce qui me surprend c'est que cette solution semble résoudre mon
problème MAIS les données insérés (ou modifiées) dans mes tables ne
semblent pas modifiées. Par exemple, si l'utilisateur saisit comme nom de
commune : VALLON PONT D'ARC, je retrouve dans ma table : VALLON PONT D'ARC
et non pas : VALLON PONT D'ARC.
Donc, j'ai l'impression qu'il ne s'est rien passé, mais mon UPDATE se fait
correctement alors qu'auparavant (sans mysql_real_escape_string et avec
magic_quotes_gpc sur on), j'avais une erreur SQL si le nom de la commune
contenait une apostrophe et qu'une autre donnée était modifiée.

Et il y a un autre truc bizarre : si je veux faire un SELECT, par exemple :
"SELECT numero,nom,adresse FROM matable WHERE ville='$ville'"; je me
ramasse une erreur SQL si jamais le nom de la ville contient une
apostrophe. Si je fais auparavant $ville=mysql_real_escape_string($ville);
le problème est résolu, certes, mais je trouve cela bizarre d'utiliser
cette commande pour cet usage : j'ai beau lire et relire la doc PHP à ce
sujet, je ne pige pas.
Je précise que les deux sites sont situés chez le même hébergeur. Le
.htaccess des 2 sites contient :
php_flag display_errors Off
php_flag expose_php Off
php_flag include_path Off
php_flag magic_quotes_gpc Off

Si quelqu'un peut éclairer ma lanterne, parce que là, j'ai du mal à y
voir clair

--
Pascale
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
jeremie fouche
Le #35236
$escchamp1=mysql_real_escape_string($champ1);
$escchamp2=mysql_real_escape_string($champ2);
...
Puis :
$upd = "UPDATE valinfo SET champ1='$escchamp1',champ2='$escchamp2' WHERE
numero='$numero'";

Et bien... ce qui me surprend c'est que cette solution semble résoudre mon
problème... MAIS les données insérés (ou modifiées) dans mes tables ne
semblent pas modifiées. Par exemple, si l'utilisateur saisit comme nom de
commune : VALLON PONT D'ARC, je retrouve dans ma table : VALLON PONT D'ARC
et non pas : VALLON PONT D'ARC.


C'est normal, mysql_escape_string ne fait que /protéger/ ta requête, le
manuel le dit :
mysql_real_escape_string() appelle la fonction mysql_escape_string() de
la bibliothèque MySQL qui ajoute un slashe aux caractères suivants :
NULL, x00, n, r, , ', " et x1a.

Et il y a un autre truc bizarre : si je veux faire un SELECT, par exemple :
"SELECT numero,nom,adresse FROM matable WHERE ville='$ville'"; je me
ramasse une erreur SQL si jamais le nom de la ville contient une
apostrophe.


"SELECT * FROM matable WHERE ville='VALLON PONT D'ARC'";
^^^^
Tu le vois mieux le problème ? La requête deviens effectivement
grammaticalement incorrect.

mysql_real_escape_string() transforme ta requête en :
"SELECT * FROM matable WHERE ville='VALLON PONT D'ARC'";

Et ça, c'est valide.

--
Jérémie

Publicité
Poster une réponse
Anonyme