Problème rn base de donnée

Eléphanteau du PHP | 42 Messages

21 janv. 2012, 19:46

Bonsoir à vous,

J'essaie d'enregistrer un commentaire dans une bdd.

Au départ, j'avais cela:
$pseudo = mysql_real_escape_string($_POST['pseudo']));
Avec cela, a chaque fois que je mettais un ' dans un message ( coucou c'est bien ), j'avais un coucou c'/est bien à la place.

J'ai fait ceci ensuite:
$pseudo = stripslashes(mysql_real_escape_string($_POST['pseudo']));
Je n'ai plus les / mais maintenant, quand je saute une ligne avec la touche entrée, j'ai cela!

coucou rn c'est bien ( rn à la place du saut de ligne )

J'aimerai savoir qu'elle est la bonne méthode, je galère pas mal là.

Merci à vous

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 janv. 2012, 20:21

La méthode dépend de la configuration de ton serveur.. en fait il existe une directive dans ton php.ini nommée magic_quotes. Quand celui-ci est activé, les apostrophes et guillemets des valeurs que tu récupères en get, post et cookie sont automatiquement protégées par un antislash.

Du coup, si ensuite tu fais un mysql_real_escape_string(), tu vas protéger aussi bien l'apostrophe que l'antislash que php a ajouté.

Une bonne pratique consiste donc à vérifier la configuration du serveur avec get_magic_quotes_gpc() pour savoir si php protège ou non tes variables. Si c'est le cas, tu peux alors faire un stripslahes de ta variables avant de faire un mysql_real_escape_string(). Si celle-ci n'est pas activée, il faut appliquer le mysql_real_escape_string() directement.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 42 Messages

22 janv. 2012, 11:52

Cela marche niquel ! Merci beaucoup !

J'ai une dernière question, quelle est la difference entre:
$pseudo = stripslashes(mysql_real_escape_string(($_POST['pseudo'])));
et
$pseudo = stripslashes(mysql_real_escape_string(($_POST['pseudo']));

$pseudo2 = mysql_real_escape_string($pseudo);
Cela marche parfaitement dans le second cas mais pas le premier.
Je n'ai pas vraiment compris pourquoi on ne peut pas mettre les deux instructions en même temps :(

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 janv. 2012, 13:12

Affiche les valeurs obtenues, ce sera plus clair :)
$chaine = " L'apostrophe "; // si les magic quotes ne sont pas activées, pas de protection automatique par php

$pseudo = mysql_real_escape_string($chaine); // => L\'apostrophe

$pseudo = stripslashes(mysql_real_escape_string($chaine); // => L'apostrophe
$pseudo2 = mysql_real_escape_string($pseudo);  // => L\'apostrophe
$chaine = " L\'apostrophe "; // si les magic quotes sont activées, protection automatique par php

$pseudo = mysql_real_escape_string($chaine); // => L\\\'apostrophe

$pseudo = stripslashes(mysql_real_escape_string($chaine); // => L\'apostrophe
$pseudo2 = mysql_real_escape_string($pseudo);  // => L\\\'apostrophe
Sachant que dans ta requête tu dois obtenir quelque chose du genre " ... ton_champ = 'L\'apostrophe' ... " :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 42 Messages

22 janv. 2012, 15:58

Merci beaucoup pour la réponse :)

J'ai encore une question désolé d'insister c'est vraiment pour bien comprendre.

Le fait d'avoir un rn dans la bdd à la place du saut de ligne de la touche entrée, c'est influencé par quoi ?

ViPHP
xTG
ViPHP | 7331 Messages

22 janv. 2012, 20:06

\r\n c'est un saut de ligne via entrée. ^^
Après si ton problème est d'avoir rn au lieu de \r\n cela vient de ton stripslashes().