Page 1 sur 1

Fonction traitement de formulaire (input, textarea)

Posté : 19 févr. 2010, 14:15
par bunk
Bonjour,

Je suis en train de faire un formulaire de contact en php et je voudrais écrire une fonction qui me permet de formater correctement la valeur transmise avec un minimum de sécurité tout en pouvant réutiliser la fonction pour différents champ d'autres formulaires.

Je me souviens avoir eu plein de problème lors de précédent développement concernant le traitement de mes formulaires notamment pour les caractères spéciaux (< ' é etc...).

Ma base de donnée est au format utf8_general_ci
Mes pages en UTF-8
et voici mon en-tête :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
J'ai ajouté suite à la connexion (mysql.php) la ligne suivante :
mysql_query("SET NAMES UTF8");
Pour l'exemple avec le champ nom
<input type="text" name="nom" id="nom" size="27" />
<input type="submit" value="Envoyer" name="form-contact" />
J'effectue le contrôle de validation comme ceci :
	if(isset($_POST['form-contact'])){ //si le formulaire a été validé
		if(isset($_POST["nom"]) && !empty($_POST["nom"])){
			$nom = traitement_input($_POST["nom"], 5, 50, true, true, false);
			// insertion bdd
			echo $nom;
		}		
	}
et voici ma fonction :
	function traitement_input($champ, $mini, $maxi, $chaine, $majforce, $minforce){
		if($majforce = true){
			$champ = strtoupper($champ);
		}
		if($minforce = true){
			$champ = strtolower($champ);
		}
	
		if($chaine = true){ // Pour chaine de caractères
			$champ = sprintf("%s",$champ);
			$champ = trim($champ);
		}elseif($chaine = false){ // Pour un entier
			$champ = sprintf("%d",$champ);
			$champ = abs($champ);
			$champ = intval($champ);
		}
		
		$champ = mysql_real_escape_string($champ);
		$champ = strip_tags($champ);
		
		if(strlen($champ) < $mini) {
			$msg_error = $mini;
		}elseif(strlen($champ) > $maxi) {
			$msg_error = $maxi;
		}else{
			$msg_error = '';
		}

		return array($champ, $msg_error);
}
Pouvez-vous me donner votre avis qu'en au traitement de ce formulaire, si les contrôles sont suffisant et si ils ne poseront pas de problème à l'exploitation. Aurais-je des surprise concernant l'encodage des caractères ?

D'avance merci.

Re: Fonction traitement de formulaire (input, textarea)

Posté : 19 févr. 2010, 15:28
par Skikit
Aie aie aie, une comparaison en php s'effectue avec un double égal :
Lorsque tu fais if($majforce = true), tu affectes "true" à ta variable, il faut donc utiliser :
if($majforce == true)

Re: Fonction traitement de formulaire (input, textarea)

Posté : 19 févr. 2010, 18:17
par AB
strlen ne doit pas être employé. En utf-8, il faut employer mb_strlen et spécifier l'encodage. De même il faut utiliser mb_strtolower() et mb_strtoupper() en spécifiant l'encodage.

Un tuto sur l'encodage en utf-8 ici

Par ailleurs ce n'est pas judicieux d'utiliser systématiquement strip_tags car si je voulais dire dans un message comme actuellement qu'un bloc html peut être encadré par <div> et </div>ou <p> ou </p>, je ne pourrais pas le faire...

D'une manière générale il faut être assez permissif pour l'enregistrement des champs texte en dbb pour ne pas brider les possibilités d'utiliser tout type de caractère par le visiteur, et c'est lors de l'affichage que tu prendras les précautions nécessaires pour que du code ne soit pas exécuté en utilisant echo htmlspecialchars(texte). Ne pas utiliser htmlentities en utf-8 sans avoir spécifié l'encodage. Pour cette raison htmlspecialchars est recommandé en utf-8.

Pour info :
Un tuto et code complet d'enregistrement et connexion dans un espace membre codé en utf-8 ici