Mysql, apostrophe

Fermé
Rafaeli - 16 févr. 2008 à 19:28
 Rafaeli - 20 févr. 2008 à 17:26
Bonjour,
Il y a qqch que je comprends pas avec ma base de données mysql.....
Comment ça se fais que j'obtienne "L\\\\\\\\\\\\\\\'heure" quand je met "L'heure" dans mon champ texte?
Merci!!

24 réponses

J'ai pourtant la ligne suivante qui devrait me les enlever...

    foreach ($_POST as $index => $value) {
      $$index = mysql_real_escape_string(stripslashes(trim($value)));
}
0
J'ai aussi essayé à tout hasard d'ajouter un htmlentities() après le trim mais ça ne change rien...
0
Personne ?
0
Ma ligne de code me semble pourtant correct et il me semble qu'en théorie du moins je devrais obtenir le resultat souhaité...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
C'est une bonne question! Ça me rendrait également grand service!
Merci de vos réponses!
0
Pourtant, j'ai fait de nombreuses recherches sous google, mais je n'ai rien trouvé...
À noter encore que je n'utilise php/mysql que pour remplir ma base de données que j'exporte ensuite en excel pour la traiter.
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
17 févr. 2008 à 23:07
Bonjour,

Ton champ passe sans doute par des paramètres get ou post et ta version de php "échappe" les caractères comme la quote ou le backslash.

Au premier passage en paramètre "l'heure " devient "l\'heure", au coup d'après "l\\\'heure" au troisième "l\\\\\\\'heure" etc...

La solution consiste donc à tester si ton php a ce comportement et à appeler une fonction comme :

function getEscapedString( $nomParametre )
{
if( get_magic_quotes_gpc() )
return $_GET[ $nomParametre ]; // ce PHP ne protège pas les car. spéciaux
else
return mysql_escape_string( $_GET[ $nomParametre ] ); // ce PHP protège les car. spéciaux
}

J'utilise cela en entrée dans un nouveau script pour récupérer les param susceptibles de contenir des caractères échappables.
0
En fait, c'est un formulaire sur plusieurs pages. A la fin de chaque page, je stocke toutes les valeurs $_POST dans des champs hidden et une fois que toutes mes pages sont remplies, j'écris le tout dans ma base.

Par contre, j'ai ajouté mysql_escape_string(...) autour de chaqu'un de mes champs avant de les stocker dans un champ caché, mais je me retrouve encore avec une quantité énorme de backslashes...

Merci.
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
18 févr. 2008 à 18:23
C'est donc bien ce que je supposais, à chaque passage dans une page de formulaiire les backslashes se multiplient.

Suit ma suggestion ci-dessus et ça marchera.
0
En fait c'est ce que j'ai fait... je crois du moins. Disons que j'ai un champ 'champ1' dans ma page1. Dans ma page 2, je fais

<input type="hidden" value="<?php echo mysql_real_escape_string($_POST['champ1']); ?>">

Théoriquement ça devrait marcher je crois. Mais ça marche pas :-(
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
18 févr. 2008 à 18:53
Tu ne suis pas toute ma suggestion. Essaye :
if( get_magic_quotes_gpc() ) <<<<<<<
return $_POST[ 'champ1' ]; <<<<<<<<
else
return mysql_escape_string( 'champ1' );

Pour comprendre ce qui se passe, ajoute des echo '<br>...' . $_POST[ 'champ1' ];
et analyse ce qui est affiché.
0
J'ai changé comme tu me l'as indiqué, mais ma base stocke toujours les entrées avec apostrophe comme suit (la flèche symbolise le passage dans la base):

L'heure => L\\\\\\\\\\\\\\\'heure
Et encore plus bizarre: abc " bla => abc \\\\\\\\

Je ne comprends plus rien... qu'est-ce que je peux bien faire faux ?!?
J'ai fait une fonction:
fonction my_escape_string($value) {
       if( get_magic_quotes_gpc() )
               return $value;
       else
               return mysql_escape_string($value); 
}

Et je l'appelle comme suit: <input type="hidden" value="<?php my_escape_string($_POST['champ1']); ?>" />
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
18 févr. 2008 à 22:52
Pour analyser ton pb, rien de tel que

$champ1 = $_POST['chap1'];
echo '<br>111:' . $champ1;
$champ1 = my_escape_string($value);
echo '<br>222:' . $champ1;
echo '<input type="hidden" value="' . $champ1 . '">';

Intègre ça dans deux pages consécutives de ton formulaire, observe ce qui s'affiche, analyse et donne moi le tout pour aide.
0
Merci.
Alors dans la première page j'ai ça:

L\'heure
abc \" toto

Et dans la deuxieme:
L\\\'heure
abc \\"

C'est bizarre, la fin de ma chaine abc " toto disparait dans la deuxième page...
Je viens de penser à quelquechose... est-ce que je devrais employer les fonctions suivantes

mysql_real_escape_string, stripslashes et trim

Avant de stocker chaque valeur de POST?
Là je ne le fait qu'au moment d'écrire toutes les valeurs dans ma base...
0
Je voulais dire les fonctions stripslashes et trim...
0
Errata dans la valeur affichéer pour abc " toto, c'est abc \\ (sans le guillement final)
0
Je m'auto répond... l'ajout du stripslashes et du trim avant de récolter chaque variable via POST ne change rien... et encore plus bizarre, trim ne semble pas fonctionner... si j'entre (sans les guillemets) : " toto " j'ai en sortie: " toto ", soit exactement la meme chaine...
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
19 févr. 2008 à 08:08
Pourrais-tu

1. isoler ton pb dans deux pages consécutives (isoler voulant dire que tu élimines la plupart du code pour ne conserver que ce qui nous intéresse. En particulier, ne garde qu'une variable - par exemple celle qui contient "l'heure" - et ne met pas le code mysql)
2.bien intégrer dans ces deux codes ce que je t'ai dit :

$champ1 = $_POST['chap1'];
echo '<br>111:' . $champ1;
echo '<br>222:' . my_escape_string($value);;
echo '<input type="hidden" value="' . $champ1 . '">';

note la modif introduite

3.envoyer ces deux bouts de code ainsi ce qu'ils affichent sur ton système
0
Une fois que je clique sur le OK de mon premier mini-formulaire, j'obtiens (texte entré: #L'heure " toto# sans les dièses)
:
none: L\'heure \" toto
trim: L\'heure \" toto
mysql_escape_string: L\\\'heure \\\" toto
my_escape_string: L\'heure \" toto
stripslashes: L'heure " toto


Lorsque je clique sur le OK de mon deuxième formulaire:
none: L\\\'heure \\
trim: L\\\'heure \\
mysql_escape_string: L\\\\\\\'heure \\\\
mysql_escape: L\\\'heure \\
stripslashes: L\'heure \


Voici la façon dont je stocke mes champs cachés:

<input type="hidden" maxlength="255" name="champ1" value="<?php echo my_escape_string($_POST['champ1']); ?>" />


Et l'en-tete de mes pages de formulaires:

<?php
  include 'verifie.php';
  if (!page1OK()) {
    header('Location: page1.php');
  } else {
    include 'header.php';
?>

<form id="formulaire1" action="page2.php" method="post">


Et pour finir ma fonction de my_escape_string:

 
   function mysql_escape($value) {
    if(get_magic_quotes_gpc())
      return $value;
    else
      return mysql_escape_string($value); 
  }


Merci encore!
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
19 févr. 2008 à 18:13
Considère les trois scripts temp.php, temp1.php et temp2.php :

<?php // script temp.php
$leParam1 = "L'heure \" toto1";
$leParam2 = "L'heure \" toto2";

$lUrl = "temp1.php?param1=" . urlencode($leParam1) . "¶m2=" . urlencode($leParam2);

echo '<a href="' . $lUrl . '">cliquez ici pour afficher temp1.php</a>';
?>

<?php // script temp1.php
$leParam1 = urldecode( $_GET[ 'param1' ] );
$leParam2 = urldecode( $_GET[ 'param2' ] );

$lUrl = "temp2.php?param1=" . urlencode($leParam1) . "¶m2=" . urlencode($leParam2);

echo '<a href="' . $lUrl . '">cliquez ici pour afficher temp2.php</a>';
?>

<?php // script temp2.php
$leParam1 = urldecode( $_GET[ 'param1' ] );
$leParam2 = urldecode( $_GET[ 'param2' ] );

echo '<br>...param1=' . $leParam1;
echo '<br>...param2=' . $leParam2;
?>

temp.php appelle temp1.php avec deux param, temp1.php appelle temp2.php avec les deux mêmes paramètres

Tu constateras que ca fonctionne.

Pour faire ta requête sql, il faudra utiliser mysql_escape_string : mais seulement dans le troisième script.
0