A voir également:
- Mysql, apostrophe
- Mysql community download - Télécharger - Bases de données
- Apostrophe inversée - Forum Word
- Touche apostrophe clavier azerty - Forum PC portable
- Mysql error 2002 ✓ - Forum Linux / Unix
- Mysql a répondu : documentation connexion impossible : paramètres incorrects. - Forum Bases de données
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.
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.
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 :-(
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']); ?>" />
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...
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!
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.