Mysql, apostrophe

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

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

        foreach ($_POST as $index => $value) {
          $$index = mysql_real_escape_string(stripslashes(trim($value)));
    }
    1. J'ai aussi essayé à tout hasard d'ajouter un htmlentities() après le trim mais ça ne change rien...
      1. Ma ligne de code me semble pourtant correct et il me semble qu'en théorie du moins je devrais obtenir le resultat souhaité...
        1. C'est une bonne question! Ça me rendrait également grand service!
          Merci de vos réponses!
          1. 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.
            1. 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.
              1. 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.
                1. 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.
                  1. 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 :-(
                    1. 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é.
                      1. 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']); ?>" />
                        1. 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.
                          1. 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...
                            1. Errata dans la valeur affichéer pour abc " toto, c'est abc \\ (sans le guillement final)
                              1. 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...
                                1. 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
                                  1. 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!
                                    1. 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) . "&param2=" . 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) . "&param2=" . 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.
                                      • 1
                                      • 2