A voir également:
- Mysql, apostrophe
- Mysql community server - Télécharger - Bases de données
- Double apostrophe clavier ✓ - Forum Perl
- Error 2002 (hy000): can't connect to local mysql server through socket '/var/lib/mysql/mysql.sock' (2) ✓ - Forum Linux / Unix
- Mysql gratuit ou payant - Forum MySQL
- Espace après apostrophe word ✓ - Forum Word
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))); }
Ma ligne de code me semble pourtant correct et il me semble qu'en théorie du moins je devrais obtenir le resultat souhaité...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
À 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.
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
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.
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.
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.
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.
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
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.
Suit ma suggestion ci-dessus et ça marchera.
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 :-(
<input type="hidden" value="<?php echo mysql_real_escape_string($_POST['champ1']); ?>">
Théoriquement ça devrait marcher je crois. Mais ça marche pas :-(
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
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é.
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é.
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:
Et je l'appelle comme suit: <input type="hidden" value="<?php my_escape_string($_POST['champ1']); ?>" />
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']); ?>" />
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
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.
$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.
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...
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...
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...
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
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
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
Une fois que je clique sur le OK de mon premier mini-formulaire, j'obtiens (texte entré: #L'heure " toto# sans les dièses)
Lorsque je clique sur le OK de mon deuxième formulaire:
Voici la façon dont je stocke mes champs cachés:
Et l'en-tete de mes pages de formulaires:
Et pour finir ma fonction de my_escape_string:
Merci encore!
: 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!
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
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.
<?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.