par
Ryle » 15 déc. 2007, 14:05
La différence entre les deux est donnée dans la description de chacune des fonctions :
stripslashes() — Supprime les anti-slash d'une chaîne
mysql_real_escape_string() — Protège les caractères spéciaux d'une commande SQL
Je vais te donner un exemple pour essayer de t'illustrer ce qui se passe :
Dans ton formulaire tu vas saisir dans le champ "field" la valeur " L'Apostrophe "
Lorsque tu soumets le formulaire tu vas récuperer :
- si magic quotes est activé : $_POST['field'] == " L\'Apostrophe "
- si magic quotes est désactivé : $_POST['field'] == " L'Apostrophe "
Dans ta requête sql, tu vas délimiter ta chaine d'apostrophes, il te faut dont protéger les apostrophes éventuelles que contient ta chaine. Si magic quotes est activé, c'est déjà fait (mais ça ne protège pas nécessairement tous les caractères spéciaux SQL), sinon il faut le faire.
L'idée est donc de supprimer les antislashes ajoutés par magic quotes le cas échéant, pour pouvoir ensuite utiliser mysql_real_escape_string() (si tu ne vires pas les antislashes avant de l'utiliser, tu vas obtenir la chaine suivante : " L\\\'Apostrophe " dans laquelle l'antislash et l'apostrohe sont tous deux protéger d'un nouvel antislash)
Ta requête ressemblera donc à " INSERT INTO table (champ) VALUES (' L\'Apostrophe ') "
Et la valeur de "champ" dans ta base sera bien " L'Apostrophe ".
Si tu effectues un SELECT champ FROM table, tu vas bien obtenir cette valeur, dont il te faudra à nouveau protéger l'apostrophe si tu la ré-utilise dans un update ou dans une autre requête.
En résumé, quelqu'en soit sa provenance, dès que tu utilises une chaine dans une requête SQL, il faut la protéger

.
A noter par ailleurs que lorsque tes champs sont de type numérique, il ne faut pas mettre d'apostrophe autour des valeurs :
"SELECT * FROM rpg_objets WHERE id=".$id_objet;
MySQL le tolère, mais est obligé de faire des tests et des conversions pour pouvoir insérer ta chaine dans un champ de type numérique.
La différence entre les deux est donnée dans la description de chacune des fonctions :
stripslashes() — Supprime les anti-slash d'une chaîne
mysql_real_escape_string() — Protège les caractères spéciaux d'une commande SQL
Je vais te donner un exemple pour essayer de t'illustrer ce qui se passe :
Dans ton formulaire tu vas saisir dans le champ "field" la valeur " L'Apostrophe "
Lorsque tu soumets le formulaire tu vas récuperer :
- si magic quotes est activé : $_POST['field'] == " L\'Apostrophe "
- si magic quotes est désactivé : $_POST['field'] == " L'Apostrophe "
Dans ta requête sql, tu vas délimiter ta chaine d'apostrophes, il te faut dont protéger les apostrophes éventuelles que contient ta chaine. Si magic quotes est activé, c'est déjà fait (mais ça ne protège pas nécessairement tous les caractères spéciaux SQL), sinon il faut le faire.
L'idée est donc de supprimer les antislashes ajoutés par magic quotes le cas échéant, pour pouvoir ensuite utiliser mysql_real_escape_string() (si tu ne vires pas les antislashes avant de l'utiliser, tu vas obtenir la chaine suivante : " L\\\'Apostrophe " dans laquelle l'antislash et l'apostrohe sont tous deux protéger d'un nouvel antislash)
Ta requête ressemblera donc à " INSERT INTO table (champ) VALUES (' L\'Apostrophe ') "
Et la valeur de "champ" dans ta base sera bien " L'Apostrophe ".
Si tu effectues un SELECT champ FROM table, tu vas bien obtenir cette valeur, dont il te faudra à nouveau protéger l'apostrophe si tu la ré-utilise dans un update ou dans une autre requête.
En résumé, quelqu'en soit sa provenance, dès que tu utilises une chaine dans une requête SQL, il faut la protéger :).
A noter par ailleurs que lorsque tes champs sont de type numérique, il ne faut pas mettre d'apostrophe autour des valeurs :
[php]"SELECT * FROM rpg_objets WHERE id=".$id_objet;[/php]MySQL le tolère, mais est obligé de faire des tests et des conversions pour pouvoir insérer ta chaine dans un champ de type numérique.