Apostrophes maudites (encore)

Le
Pascale
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
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
slambert
Le #33236
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

CrazyCat
Le #33237
Pascale wrote:
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

$nomregion=$_POST['region'];
// Et oui, c'est là que ça coince...
$region=?????????????????($nomregion);
echo ' $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
Le #32746
slambert news:473d86d7$0$18754$:

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
Le #32745
CrazyCat news:473d8886$0$21143$:

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"

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";


Et zut, ça ne change rien, aucun enregistrement n'est trouvé... )-:

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

Pascale
Le #32743
Pascale news::

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
Le #32255
Bonjour.

"Pascale"
Pascale news::

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; (-:



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
Le #42113
"Patrick 'Zener' Brunet" news:fi8v4p$bc7$:

Le # suivi d'un chiffre peut poser problème en SQL:
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. (-:

$region=$_POST['region'];
$region=str_replace("'","&#039;",$region);

--
Pascale

Publicité
Poster une réponse
Anonyme