Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

les "," dans une requete SQL

26 réponses
Avatar
laurent sturm
Bonjour,

Lorsque un utilisateur s'inscrit sur mon site, et qu'il a saisie des ","
dans son adresse (ou autre champ), cela cause une erreur SQL.

exemple de requete SQL:
$SQL="INSERT INTO tb_user ('','$_POST[nom]','$_POST['adresse']')";

Si $_POST['adresse'] = "6, rue blabla" cela donne la requete SQL suivante :
$SQL="INSERT INTO tb_user ('','moi','6, rue blabla')";
La "," aprés le 6 cause une erreur de requete.

Existe t il un moyen simple pour accepter les "," dans un champ SQL,
mis à part un str_replace(","," ",$_POST['adresse'])

Merci

10 réponses

1 2 3
Avatar
Patrice Labracherie
Il faut utiliser mysql_escape_string

"laurent sturm" a écrit dans le message de
news:429b26af$0$6860$
Bonjour,

Lorsque un utilisateur s'inscrit sur mon site, et qu'il a saisie des ","
dans son adresse (ou autre champ), cela cause une erreur SQL.

exemple de requete SQL:
$SQL="INSERT INTO tb_user ('','$_POST[nom]','$_POST['adresse']')";

Si $_POST['adresse'] = "6, rue blabla" cela donne la requete SQL suivante
:

$SQL="INSERT INTO tb_user ('','moi','6, rue blabla')";
La "," aprés le 6 cause une erreur de requete.

Existe t il un moyen simple pour accepter les "," dans un champ SQL,
mis à part un str_replace(","," ",$_POST['adresse'])

Merci


Avatar
Damien
(snip)

Si $_POST['adresse'] = "6, rue blabla" cela donne la requete SQL suivante :
$SQL="INSERT INTO tb_user ('','moi','6, rue blabla')";
La "," aprés le 6 cause une erreur de requete.
(snip)


Quelle erreur exactement ? Chez moi une requête d'insertion complète
n'en génère pas :

INSERT INTO tb_user VALUES ('','moi','6, rue blabla')

ou

INSERT INTO tb_user (clef, champnom,champadresse) VALUES ('','moi','6,
rue blabla')

Il manque le "values" dans la tienne.

MYSQL n'interprète pas, à mon sens, la virgule comme séparateur de champ
à partir du moment où il est en train de lire une chaine.

Là où il y a problème potentiel, c'est avec les quotes... Pour ça, il y
a addslashes() qui "échappe" les quotes ( ' => ' ).

HTH,
--
Damien

Avatar
ftc
Bonjour,

Lorsque un utilisateur s'inscrit sur mon site, et qu'il a saisie des ","
dans son adresse (ou autre champ), cela cause une erreur SQL.

exemple de requete SQL:
$SQL="INSERT INTO tb_user ('','$_POST[nom]','$_POST['adresse']')";


Ne jamais utiliser des variables provenant directement de $_POST, $_GET
ou $_REQUEST dans des instructons sql ou lorsqu'on fait appel à une
commande externe.

Il faut toujours 'blanchir' la variable ( lui rétirer les caractères
dangereux ).

Pour une requête MySQL, on a mysql_escape_string ou
mysql_real_escape_string, pour les commandes on a escapeshellarg ou
escapeshellcmd ...

Avatar
Michel Gaudry
ftc wrote:

Bonjour,

Lorsque un utilisateur s'inscrit sur mon site, et qu'il a saisie des
"," dans son adresse (ou autre champ), cela cause une erreur SQL.

exemple de requete SQL:
$SQL="INSERT INTO tb_user ('','$_POST[nom]','$_POST['adresse']')";



Ne jamais utiliser des variables provenant directement de $_POST, $_GET
ou $_REQUEST dans des instructons sql ou lorsqu'on fait appel à une
commande externe.

Il faut toujours 'blanchir' la variable ( lui rétirer les caractères
dangereux ).

Pour une requête MySQL, on a mysql_escape_string ou
mysql_real_escape_string, pour les commandes on a escapeshellarg ou
escapeshellcmd ...


Dans un autre sens, si je souhaite afficher sur ma page web le contenu
d'un champ qui a été, avant son intertion, traité par
mysql_escape_string, comment faire pour que le navigateur n'affiche pas
du texte dans le genre "J' ai bien mangé, et j'ai bien bu" ?
Existe-t-il un fonction pour cela ou alors faut il simplement enlever
tous les "" avec un /while/ ?


Avatar
CrazyCat
Michel Gaudry wrote:
Dans un autre sens, si je souhaite afficher sur ma page web le contenu
d'un champ qui a été, avant son intertion, traité par
mysql_escape_string, comment faire pour que le navigateur n'affiche pas
du texte dans le genre "J' ai bien mangé, et j'ai bien bu" ?
Existe-t-il un fonction pour cela ou alors faut il simplement enlever
tous les "" avec un /while/ ?


Au risque d'être malpoli, RTFM.

Les fonctions addslashes() et stripslashes() sont la pour le plus grand
bonheur de tous.

Plus d'infos sur http://fr3.php.net/manual/fr/function.stripslashes.php

--
Découvrez Original War: http://www.original-war.org
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net

Avatar
ftc
Dans un autre sens, si je souhaite afficher sur ma page web le contenu
d'un champ qui a été, avant son intertion, traité par
mysql_escape_string, comment faire pour que le navigateur n'affiche pas
du texte dans le genre "J' ai bien mangé, et j'ai bien bu" ?
Existe-t-il un fonction pour cela ou alors faut il simplement enlever
tous les "" avec un /while/ ?


Normalement les données récupérées ne doivent pas contenir de ' ou
autre. S'ils y sont, ça veut dire qu'il y a eu un mécanisme qui a
échappé les données une seconde fois (magic quotes en général).

Une solution est de créer un fonction du genre:

function dbquote( $datas ) {
if ( ! get_magic_quotes_gpc() ) {
return mysql_real_escape_string( $datas );
}
else {
return $datas;
}
}

cette fonction sera appelée avant chaque insertion de données.

Maintenant, s'il y a déjà des données dans la base qui ont des ', il
faut utiliser la fonction stripslashes.

Avatar
Patrick Mevzek
Lorsque un utilisateur s'inscrit sur mon site, et qu'il a saisie des
"," dans son adresse (ou autre champ), cela cause une erreur SQL.

exemple de requete SQL:
$SQL="INSERT INTO tb_user ('','$_POST[nom]','$_POST['adresse']')";


Ne jamais utiliser des variables provenant directement de $_POST, $_GET
ou $_REQUEST dans des instructons sql ou lorsqu'on fait appel à une
commande externe.

Il faut toujours 'blanchir' la variable ( lui rétirer les caractères
dangereux ).


Cela ne suffit pas/n'est pas complétement approprié.

On peut faire une injection SQL sans utiliser le '

Exemple avec la requête SQL:
SELECT * FROM whatever WHERE id=$_POST[id]

il suffit d'envoyer dans $_POST[id]:
0 OR 1
pour élargir grandement la restriction initiale.


--
Patrick Mevzek . . . . . . Dot and Co (Paris, France)
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>


Avatar
Guillaume Bouchard
Michel Gaudry wrote:
Dans un autre sens, si je souhaite afficher sur ma page web le contenu
d'un champ qui a été, avant son intertion, traité par
mysql_escape_string, comment faire pour que le navigateur n'affiche pas
du texte dans le genre "J' ai bien mangé, et j'ai bien bu" ?
Existe-t-il un fonction pour cela ou alors faut il simplement enlever
tous les "" avec un /while/ ?


J'avais (mal ?) écrit un article il y a quelques siécles de cela.

http://guillaume.apinc.org/2003/aout/12/3-comment-gerer-correctement-les-magic-quotes

Il propose une technique pour gerer ce problème.

--
Guillaume.

Avatar
ftc
Cela ne suffit pas/n'est pas complétement approprié.

On peut faire une injection SQL sans utiliser le '

Exemple avec la requête SQL:
SELECT * FROM whatever WHERE id=$_POST[id]

il suffit d'envoyer dans $_POST[id]:
0 OR 1
pour élargir grandement la restriction initiale.



$query = 'SELECT * FROM table WHERE id=''.mysql_real_escape_string(
$_POST['password'] ).''';

Nécessaire et suffisant.

Avatar
Michel Gaudry
Michel Gaudry wrote:

Dans un autre sens, si je souhaite afficher sur ma page web le contenu
d'un champ qui a été, avant son intertion, traité par
mysql_escape_string, comment faire pour que le navigateur n'affiche
pas du texte dans le genre "J' ai bien mangé, et j'ai bien bu" ?
Existe-t-il un fonction pour cela ou alors faut il simplement enlever
tous les "" avec un /while/ ?



Au risque d'être malpoli, RTFM.

Les fonctions addslashes() et stripslashes() sont la pour le plus grand
bonheur de tous.

Plus d'infos sur http://fr3.php.net/manual/fr/function.stripslashes.php



Merci, même si c'était dur.


1 2 3