Page 1 sur 1

validation de formulaire

Posté : 22 août 2007, 09:11
par mosquitout
Bonjour,

Je mets en place ma toute première fonction de validation d'un formulaire. Après avoir fait x recherche, voilà ce que ca donne
function form_validator($post_data)
{   //prend les données d'un form pour les tester et les nettoyer
    foreach($post_data as $cle => $val)
    {
        if(!get_magic_quotes_gpc())
        {
            $val = addslashes($val);
        }
	switch ($cle)
       {
		case "nomprod":
            $test[$cle] = test_de_la_donnee($val, 'string', 45);
			break;
		case "prixHT":
            $data_ok[$cle] = test_de_la_donnee($val, 'int', 5, 0);
			break;
	}
    }
    return $test;
}

// fonction de test sur les données transmises par formulaire
function test_de_la_donnee($contenu, $type, $taille_max, $defaut ='') 
{
   	if( empty($contenu) ) return $defaut;
  
  	switch( $type ) {	
	  	case 'int': // Test si c'est un nombre. Renvoie defaut si ce n'est pas le cas
  			if( is_numeric( $contenu ))
			{
				if (strlen($contenu) > $taille_max)
				{
					return 'saisie trop longue';
				}
				else
				{
					return 'Ok';
				}
			} 
			else
			{
				return 'non numerique !';
			}
  			break;
  
  		case 'string': // Enleve les caractères non autorisés dans une chaine de caracteres
  			if( is_string( $contenu ))
			{
				if (strlen($contenu) > $taille_max)
				{
					return 'saisie trop longue';
				}
				else
				{
		  			$contenu = eregi_replace("[^a-zA-Z0-9_&~@/,\.'()?! éèàêâôîûùç-]","",$contenu);
					return 'Ok';
				}
			} 
			else
			{
				return 'pas une chaine !';
			}
  			break;
  
  		default : // Si le type n'est pas répertorier $defaut est renvoyé
  			return $defaut;
  	}
  	return $contenu;
}
et ds le prg ou il y a mon formulaire j'appelle la fonction comme ceci:
$resultat_validation = form_validator($_POST);
var_dump ('$resultat_validation');
				
	// si = ok => traitement, sinon => afficher messages contenu dedans 
	if ($resultat_validation == 'Ok')

        else 
Pour tester j'ai saisi en entrée: prixHT = "gf*)". Ma super fonction ne me renvoie rien :(
je pensai recevoir 'non numerique !' . Débutant, je ne vois pas ou est le pb ! pourriez-vous m'aider ?
:lol:

Posté : 22 août 2007, 09:28
par zeus
déjà, pas la peine de mettre des quotes de partout. Pour afficher, une variable, pas besoin.
De plus, quand tu encadres une variables par des simles quotes ('), la variable n'est pas interprété ;)

donc, remplace
var_dump ('$resultat_validation'); 
par
var_dump($resultat_validation); 
et dit nous si ça change quelque chose

Posté : 22 août 2007, 09:52
par mosquitout
Oui, effectivement c'est mieux ;)
Plusieurs questions. D'abord, j'ai beau tester en mettant n'importe quoi ds mon champ "nomprod", le test "is_string" renvoi tj Ok, alors que pourrais-je saisir pour que ce ne soit pas une string ? car dans le cas présent je me dis que ce test ne sert pas à grand chose!

Ensuite ds mon exemple, je teste d'abord un champs "string" puis un champs numeric. Le premier me retourne "Ok" mais le second rien :? pourtant ils passent tout les deux par la même fonction !?

Mon var dump me retourne ca
array
'nomprod' => string 'Ok' (length=2)

string '$resultat_validation' (length=20)
Pourtant dans le second là aussi je rentres n'importe quoi comme donnée et il devrait me retourner une erreur.

Posté : 22 août 2007, 09:59
par zeus
Est-ce que tu es sûr du nom du champ "prixHT" ? la valeur de l'attribut name ...

Fait un echo "on passe dans le test prixHT"; dans le cas "prixHT" pour savoir si tu passes dedans ...

C'est ce qu'on appelle du débugage, essayer de déterminer où se trouve l'erreur en ne pensant pas que le programme marche, mais en testant s'il passe bien là où il devrait passer ;)

Posté : 22 août 2007, 10:41
par mosquitout
Merci Zeus et désolé pour ces erreurs trop bête. Bon j'ai revu mon code et voila ce que ca donne dans mon prog appelant:
$resultat_validation = form_validator($_POST);
var_dump ($resultat_validation);
// test de donnees_validees
for($i=0; $i<sizeof($resultat_validation); $i++)
{
	echo '$i ='.$i.'<br />';
	echo '$resultat_validation='.$resultat_validation[$i].'<br />';
	if ($resultat_validation[$i] == 'Ok')
	{
		$msgformulaire .= '';
	}
	else
	{
		$msgformulaire .= '<p style="color:red;">'. $resultat_validation[$i]. '</p>';
	}
}
echo '$msgformulaire = '.$msgformulaire;
En testant voici ce que j'obtiens au retour :
array
'nomprod' => string 'Ok' (length=2)
'prixHT' => string 'non numerique !' (length=15)

$i =0
$resultat_validation=
$i =1
$resultat_validation=
$msgformulaire =

Bon, déjà dans ma fonction, il a bien détecter que la saisie du prix n'était pas numerique, bien! mais au retour pourquoi il ne l'affiche pas, c'est ma syntaxe qui n'est pas bonne ?

Posté : 22 août 2007, 10:59
par zeus
Essaye de faire un var_dump() sur la valeur de retour de ta fonction.

Tu sautes les étapes, tu estimes que ta fonction te retourne une chaine de caractères alors que c'est pas encore 100% sûr ;)

Posté : 22 août 2007, 11:49
par mosquitout
Heu...un var_dump sur la valeur de retour de ma fonction, bah c'est pas ce que je fais avec mon
"var_dump ($resultat_validation);" !?

Et quand je lis le contenu
'nomprod' => string 'Ok' (length=2)
'prixHT' => string 'non numerique !' (length=15)

c'est bien des chaine de caractères !? non ?
aie aie aie, c'est dur de commencer ;)

Posté : 22 août 2007, 12:13
par zeus
Excuse moi, j'avais lu en diagonale, je pensais qu'on était dans la fonction form_validator, pas en dehors :?

Sinon, quand tu fait un var_dump($resultat_validation), tu peux voir que les clés de ton tableau sont 'nomprod' ou encore 'prixHT'.
Toi, tu essayes d'afficher $resultat_validation[$i] où $i est un entier (0, 1, ...).
Comme il n'existe aucune case $resultat_validation[0], c'est normal que rien ne soit affiché ;)

Plutôt que de parcourir un tableau de cette manière, utilise un foreach() qui te retourne la clé et la valeur courante de chaque case de ton tableau
$resultat_validation = form_validator($_POST);
var_dump ($resultat_validation);
// test de donnees_validees
foreach( $resultat_validation as $index => $contenu )
{
	echo 'index ='. $index .'<br />';
	echo 'resultat_validation='. $contenu .'<br />';
	if $contenu == 'Ok')
	{
		$msgformulaire .= '';
	}
	else
	{
		$msgformulaire .= '<p style="color:red;">'. $contenu . '</p>';
	}
}
echo '$msgformulaire = '.$msgformulaire;
Ne te contente pas de recopier le code, essaye de le comprendre ;)

Posté : 22 août 2007, 12:40
par mosquitout
Ok Zeus, effectivement c'est mieux mais ... je pensais quand même que je pouvais normalement utiliser $tab[0] et non spécifiquement $tab["nomprod"] et que par defaut bah il me rendrai le contenu de mon premier élément de tableau !
enfin, mille merci, ca marche je vais maintenant peaufiner mon traitement ;)

PS: il se peut que je revienne 'à l'attaque' d'ici à ce qu'il soit terminé ;)