Posez votre question Signaler

Mysql, apostrophe

Rafaeli - Dernière réponse le 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!!
Lire la suite 

Mysql, apostrophe »

24 réponses
Réponse
+0
moins plus
J'ai pourtant la ligne suivante qui devrait me les enlever...

    foreach ($_POST as $index => $value) {
      $$index = mysql_real_escape_string(stripslashes(trim($value)));
}
Ajouter un commentaire
Réponse
+0
moins plus
J'ai aussi essayé à tout hasard d'ajouter un htmlentities() après le trim mais ça ne change rien...
Ajouter un commentaire
Réponse
+0
moins plus
Personne ?
Ajouter un commentaire
Réponse
+0
moins plus
Ma ligne de code me semble pourtant correct et il me semble qu'en théorie du moins je devrais obtenir le resultat souhaité...
Ajouter un commentaire
Réponse
+0
moins plus
C'est une bonne question! Ça me rendrait également grand service!
Merci de vos réponses!
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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 :-(
Ajouter un commentaire
Réponse
+0
moins plus
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é.
Ajouter un commentaire
Réponse
+0
moins plus
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']); ?>" />
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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...
Ajouter un commentaire
Réponse
+0
moins plus
Je voulais dire les fonctions stripslashes et trim...
Ajouter un commentaire
Réponse
+0
moins plus
Errata dans la valeur affichéer pour abc " toto, c'est abc \\ (sans le guillement final)
Ajouter un commentaire
Réponse
+0
moins plus
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...
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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!
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Ce document intitulé « mysql, apostrophe » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook
mysql, apostrophe - page 2