Discussion:
Apostrophes maudites (encore)
(trop ancien pour répondre)
Pascale
2007-11-16 11:56:37 UTC
Permalink
Je butte sur un problème agaçant.

Je suis en train de réécrire une application, ce qui veut dire que j'ai
récupéré des données anciennes issues de la version précédente.
Les gens qui s'inscrivent précisent leur région et leur pays. Dans la
version précédente du site, les données étaient enregistrées sans
mysql_real_escape_string, donc par exemple, on trouve dans la table, dans
le champ région : Côte d\'Azur.
Avec la nouvelle version, où l'entrée de données est protégée par
mysql_real_escape_string, cela donne bien sûr : Côte d'Azur.
Je propose aux visiteurs du site de visualiser les fiches de différentes
manières : toutes les fiches (aucun problème), pour un pays déterminé, et
pour une région déterminée. Dans ces deux derniers cas, ils choisissent
dans une liste déroulante.
Pour la région, par exemple, j'ai :

$sel2="SELECT region FROM fiches WHERE critere1='1' GROUP BY region";
$req2 = mysql_query($sel2) or die('<CENTER>Erreur SQL
!'.$sel2.'<br>'.mysql_error().'</CENTER>' );
<form name="formb" action=listereg.php method="post">
<h3>Sélection d\'une région</h3>
<p><select name="region" size="1">
<option selected value="0">Choisissez une région dans la liste</option>';
while ($data2=mysql_fetch_assoc($req2))
{$region=$data2['region'];
echo '<option value="'.$region.'">'.stripslashes($region).'</option>';}
echo '</select></p>
<p><input type="submit" name="envoi" value="Voir les fiches"></p></form>';

Et c'est après que ça se gâte, dans le programme listereg.php.

$nomregion=$_POST['region'];
// Et oui, c'est là que ça coince...
$region=?????????????????($nomregion);
echo '<h1>LISTE DE LA RÉGION '.stripslashes($nomregion).'</h1>
$sel3="SELECT id,prenom,region,descr from fiches WHERE critere1='1' AND
region='$region' ORDER BY id ASC";
$req3 = mysql_query($sel3) or die('<CENTER>Erreur SQL
!'.$sel3.'<br>'.mysql_error().'</CENTER>' );

(suivent les en-têtes du tableau et le while
($data3=mysql_fetch_assoc($req3)) permettant d'extraire toutes les fiches
correspondantes.

Mon souci est que je n'arrive pas à extraire les fiches correspondant à une
région enregistrée à la « nouvelle » manière. J'ai mis une série de points
d'interrogation dans le code pour bien montrer ma perplexité : par
exemple, écrire
$region=mysql_real_escape_string($nomregion); ne fonctionne pas, j'ai
essayé d'autres trucs sûrement pas plus logiques, et rien ne convient :
je ressors sans problème les vieux enregistrements (sur le mode « Côte
d\'Azur »), mais je n'arrive pas à extraire ceux qui sont enregistrés sur
le mode Côte d&#039;Azur. Je n'ai pas de message d'erreur, simplement
aucune donnée n'est retournée.
J'allais oublier : les magic quotes sont désactivées.
Un peu d'aide serait la bienvenue...
--
Pascale
slambert
2007-11-16 13:46:24 UTC
Permalink
Post by Pascale
le champ région : Côte d\'Azur.
mysql_real_escape_string, cela donne bien sûr : Côte d&#039;Azur.
solution bourrine mais très efficace : tu parcours toute ta base et tu fais
des rechercher remplacer. Si tu es sur de ton coup...


$resultA = mysql_list_tables($myDb);
$num_rows = mysql_num_rows($resultA);
for ($i = 0; $i < $num_rows; $i++)
{
$table = mysql_tablename($resultA, $i);
$result=mysql_list_fields($config['db'], $table);
$nb_champs=mysql_num_fields($result);
for ($k=0 ; $k < $nb_champs ; $k++)
$tabBD[$table][]=mysql_field_name($result,$k);
}

// à ce stade tu as dans $tabBD toutes tes tables et les colonnes rattachées

foreach ($tabBD as $table => $colonnes)
{
foreach ($colonnes as $colonne)
{
$query = "update $table SET $colonne = REPLACE($colonne ,'\\'','&#039;')
";
$req = mysql_query($query);
$nb = mysql_affected_rows();
}
}


voi,a c'est brutal, mais ca résoudra ton soucis.

@++

Stef
Pascale
2007-11-16 19:51:22 UTC
Permalink
Post by slambert
Post by Pascale
le champ région : Côte d\'Azur.
mysql_real_escape_string, cela donne bien sûr : Côte d&#039;Azur.
solution bourrine mais très efficace : tu parcours toute ta base et tu
fais des rechercher remplacer. Si tu es sur de ton coup...
voilà c'est brutal, mais ca résoudra ton soucis.
Je vois qu'il faut que je le fasse. Heureusement, pour cette application,
il n'y a qu'une table de concernée.
--
Pascale
Pascale
2007-11-17 16:51:07 UTC
Permalink
Post by Pascale
Je vois qu'il faut que je le fasse. Heureusement, pour cette
application, il n'y a qu'une table de concernée.
C'est fait, merci beaucoup pour ton aide, Stef.
Bon, maintenant, le problème c'est d'arriver à récupérer toutes ces belles
données nanties de &#039; (-:
--
Pascale
Patrick 'Zener' Brunet
2007-11-24 16:53:38 UTC
Permalink
Bonjour.
Post by Pascale
Post by Pascale
Je vois qu'il faut que je le fasse. Heureusement, pour cette
application, il n'y a qu'une table de concernée.
C'est fait, merci beaucoup pour ton aide, Stef.
Bon, maintenant, le problème c'est d'arriver à récupérer toutes
Le # suivi d'un chiffre peut poser problème en SQL:
http://developer.mimer.com/documentation/html_92/Mimer_SQL_Mobile_DocSet/Syn
tax_Rules3.html#wp1112633
(rafistoler le lien si coupé)

Quand j'ai ce genre de problème en général, je me replie sur un échappement
perso mais fiable (collision improbable et interprétation parasite
impossible), quitte à réencoder les données après extraction.
Par exemple on pourrait stocker (/039/) dans la base, et faire un replace
systématique en entrée et sortie.

--
Cordialement.
--
/**************************************************\
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
\**************************************************/
Pascale
2007-11-29 00:57:44 UTC
Permalink
Post by Patrick 'Zener' Brunet
http://developer.mimer.com/documentation/html_92/Mimer_SQL_Mobile_DocSe
t/Syn tax_Rules3.html#wp1112633
(rafistoler le lien si coupé)
Quand j'ai ce genre de problème en général, je me replie sur un
échappement perso mais fiable (collision improbable et interprétation
parasite impossible), quitte à réencoder les données après extraction.
Par exemple on pourrait stocker (/039/) dans la base, et faire un
replace systématique en entrée et sortie.
En fait, je ne sais pas d'où exactement venait le problème, mais je l'ai
résolu d'une façon légèrement primitive et bestiale. (-:

J'ai écrit :
$region=$_POST['region'];
$region=str_replace("'","&#039;",$region);
--
Pascale
CrazyCat
2007-11-16 13:46:24 UTC
Permalink
Post by Pascale
Avec la nouvelle version, où l'entrée de données est protégée par
mysql_real_escape_string, cela donne bien sûr : Côte d&#039;Azur.
Déjà, il faut que tu re-encode toutes les données pour être sûre de ne
pas avoir \' et &#039; dans ta base
Post by Pascale
$nomregion=$_POST['region'];
// Et oui, c'est là que ça coince...
$region=?????????????????($nomregion);
echo '<h1>LISTE DE LA RÉGION '.stripslashes($nomregion).'</h1>
$sel3="SELECT id,prenom,region,descr from fiches WHERE critere1='1' AND
region='$region' ORDER BY id ASC";
A quoi ressemble $_POST['region'] (avec un var_dump() ou un print_r())?
ensuite, je referais la requète de cette manière:
$sel3="SELECT id,prenom,region,descr from fiches WHERE critere1='1' AND
region='".mysql_real_escape_string($region)."' ORDER BY id ASC";

Il vaut toujours mieux utiliser mysql_real_escape_string() au sein d'une
requète plutôt que de manière "externe".
--
Réseau IRC Francophone: http://www.crazy-irc.net
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Pascale
2007-11-16 19:51:23 UTC
Permalink
Post by CrazyCat
A quoi ressemble $_POST['region'] (avec un var_dump() ou un print_r())?
Par exemple avec var_dump($region) : string(11) "Côte d'Azur"
Post by CrazyCat
$sel3="SELECT id,prenom,region,descr from fiches WHERE critere1='1' AND
region='".mysql_real_escape_string($region)."' ORDER BY id ASC";
Il vaut toujours mieux utiliser mysql_real_escape_string() au sein d'une
requête plutôt que de manière "externe".
OK pour ça.
--
Pascale
Continuer la lecture sur narkive:
Loading...