Certains pourraient dire, « poster un formulaire c’est très simple et ce n’est pas en rapport avec PHP ». On l’entend souvent sur le fciwap.

Mais poster un formulaire pour enregistrer son contenu dans une base de données, puis réutiliser ce même formulaire pour modifier le contenu de la base, précharger ce formulaire avec les données de la table et tester chaque champs du formulaire pour vérifier s’ils sont valides...c’est plus compliqué. Mais nous ne verrons pas tout ça. ;-))

Le but de cet article c’est de montrer comment éviter les problèmes lors du post d’un formulaire et du réaffichage de celui-ci en utilisant les fonctions htmlentities(), stripslashes() et addslashes().

Ici je suppose que Magic_Quotes_GPC est à OFF. Tout d’abord faisont un test avec htmlentitites().

Je sélectionne mes données de la base normalement aucun slash n'est en trop (il n'y a pas eu de POST) donc je remplis mon FORM avec mes données. Pour tous les champs de type TEXTAREA, TEXT, et SELECT, je fais un htmlentitites() sauf si je sais que ce sera une valeur de type numerique ou une chaine très simple.

<FORM method=POST>
...
<INPUT type=text name=champ1 value="< ? print htmlentities($champ1) ?>">
<TEXTAREA name=champ2>
< ? print htmlentities($champ2) ?>
</TEXTAREA>
...
</FORM>
Le htmlentities() a placé tout les é, à, û etc... en code html é etc. Le formulaire POSTé, on recois les valeurs en claire avec du é, à, û et non le code html.

Si l'utilisateur a oublié quelque chose je reprends les valeurs qu'il a posté et remplis mon formulaire en faisant encore une fois un htmlentities();

Comme Magic_Quotes_GPC est à OFF, je n'ai pas besoin de faire de stripslashes().

Si Magic_Quotes_GPC est ON, il faut faire un stripslashes(), mais pas n’importe où.

Il suffit d'en faire un avant l'affichage ou au début du script si et seulement si $HTTP_POST_VARS existe (c’est à dire si le formulaire a été POSTé par un internaute).

Proposition de fonction pour supprimer l’effet du Magic_Quotes_GPC s’il est ON :

if(get_magic_quotes_gpc()==1)
{
	if (isset ($HTTP_POST_VARS) )
	{
	  while (list($key,$value) = each($HTTP_POST_VARS))
	$$key = stripslashes($value);
	}
	if (isset ($HTTP_GET_VARS) )
	{
	  while (list($key,$value) = each($HTTP_GET_VARS))
	  	$$key = stripslashes($value);
	}
}
L’internaute modifie son erreur et reposte une bonne fois pour toutes.
Je me retrouve dans la situation du premier POST mais là pas d’erreur de saisie.

Magic_Quotes_GPC est OFF donc il faut que je rajoute donc mes \ avec addslashes(), pour construire ma requête SQL. Je le fait uniquement sur les champs qui seraient susceptibles de contenir des caractères indésirables.
Je fais mon mysql_query() et le tour est joué.

En espérant que cet article éclaira l’esprit des petits et des grands.

Consulter le lien