Vérification des champs d'un formulaire en PHP

Petit nouveau ! | 5 Messages

11 juil. 2011, 20:00

Bonjour !

J'ai fais un formulaire, jusqu'ici pas de problème, les données sont traitées par du PHP et envoyées correctement dans ma base de donnée. Mais j'ai essayé de faire une vérification des champs de saisies (au début j'avais fais en JavaScript mais ça restreint des possibilités et c'est pas pratique) en PHP cependant ça ne marche pas je dois mal mis prendre :( .

Voici mon formulaire :
<form id="myForm" method="post" action="traitements.php">
<p>
      <label class="form_col" for="login">Pseudo :</label><br />
      <input name="login" id="login" type="text" tabindex="10" />
      <br /><br />

      <label class="form_col" for="pwd1">Mot de passe :</label><br />
      <input name="pwd1" id="pwd1" type="password" tabindex="20" />
      <br />

      <label class="form_col" for="pwd2">Mot de passe (confirmation) :</label><br />
      <input name="pwd2" id="pwd2" type="password" tabindex="30" />
      <br />
	  
      <label class="form_col" for="email">Addresse e-mail :</label><br />
      <input name="email" id="email" type="text" tabindex="40"/>
      <br />
</p>

<p>
      <span class="form_col"></span>
      <input name="valider" type="submit" value="M'inscrire" /> <input name="reset" type="reset" value="Réinitialiser" />
</p>

    </form>
Et voici la page traitements.php qui traite mon formulaire :
<?php
$affiche_formulaire=TRUE;
if (isset($_POST['valider']))
{
  $affiche_formulaire=FALSE;
  try
  {
    $options = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
    //connexion à la base de données
    $bdd = new PDO('mysql:host=localhost;dbname=ffa', 'root', '', $options);

    //hachage du mot de passe et définition des variables
    $pass_hache = sha1($_POST['pwd1']);
    $login = $_POST['login'];
    $email = $_POST['email'];
    $mdp = $_POST['pwd1'];
    $mdp2 = $_POST['pwd2'];
	
	//VERIFICATIONS BANALES
if(!$mdp || !$mdp2 || strlen($mdp) < 5)
	{
	echo'Votre mot de passe ou sa confirmation est inexistant ou votre mot de passe fait moins de 5 caracteres<br />';
return FALSE;
	}
if($mdp!=$mdp2)
	{
	echo'Votre mot de passe n\'est pas le meme que sa confirmation<br />';
return FALSE;
	}
if(!$login || strlen($login) > 10)
	{
	echo'Votre pseudo est inexistant ou fait plus de 10 caractères<br />';
return FALSE;
	}
if(!$email)
   	{
	echo'Votre e-mail est inexistant.<br />';
return FALSE;
   	}
	
	//VERIFICATIONS DES EXISTENCES
$reponse_mail=mysql_query("SELECT email FROM membre WHERE email='$email'") or die ('Erreur : '.mysql_error());	//verification si e-mail existe déjà
$count_mail=mysql_num_rows($reponse_mail);
if($count_mail == 1)
	{
	echo'Cet e-mail existe déjà.<br />';
return FALSE;
	}
$reponse_pseudo=mysql_query("SELECT login FROM membre WHERE login='$login'") or die ('Erreur : '.mysql_error());	//verification si pseudo existe déjà
$count_pseudo=mysql_num_rows($reponse_pseudo);
if($count_pseudo == 1)
	{
	echo 'Ce pseudo existe déjà.<br />';
return FALSE;
	}

    //Insertion des données du formulaire
    $req = $bdd->prepare('INSERT INTO membre(login, pass, email, date_inscription) VALUES(:login, :pwd1, :email, CURDATE())');
    $req->bindValue(':login',$login,PDO::PARAM_STR);
    $req->bindValue(':pwd1',$pass_hache,PDO::PARAM_STR);
    $req->bindValue(':email',$email,PDO::PARAM_STR);
    $req->execute();
	$bdd=NULL;
  }
  catch(PDOException $e)
  {
    // génération du message d'erreur
    $message = sprintf('Erreur MySQL %d<br />%s', $e->getCode(), $e->getMessage());
  }
}
?>
Donc les parties qui ne marchent pas sont '//VERIFICATIONS BANALES' et '//VERIFICATIONS DES EXISTENCES', sinon c'est correctement enregistré dans ma base. Je ne comprends pourquoi, pourriez vous m'aidez ? :D . Je vous remercie de votre attention déjà^^.

ViPHP
AB
ViPHP | 5818 Messages

11 juil. 2011, 20:57

C'est quoi ces "return FALSE"; ?

Petit nouveau ! | 5 Messages

12 juil. 2011, 10:42

Ben je voulais je si la condition 'if' est remplie, ça n'envoie pas dans la base de données 8-| .

ViPHP
AB
ViPHP | 5818 Messages

12 juil. 2011, 17:41

Oui mais "return false" est à utiliser dans le contexte d'une fonction. Or là tes tests ne sont pas dans une fonction.

Tu peux regarder ce lien pour voir une méthode (parmi tant d'autre) de filtre avec enregistrement de message suivi ou non d'enregistrement dans une bdd. Le sujet est un peu différent du tiens mais le code php te donne un exemple.
Dans ce lien, l'enregistrement des variables en session sert pour afficher le retour des données pour correction après le reload du formulaire; tu n'es pas obligé d'utiliser les sessions, c'est juste un + par rapport à l'affichage direct des variables $_POST, en cas de rafraichissement de la page pour éviter d'avoir le désagréable message du navigateur : "...cette page nécessite un renvoi d'information...". Tu peux tester le fonctionnement en copiant directement tout le code et l'essayer en local chez toi dans une page séparée.
Donc en bref dans cet exemple le principe est d'enregistrer les erreurs dans un tableau. Et on enregistre en bdd que si ce tableau est vide.

Mais tu peux imaginer d'autres types de contrôle par exemple :

$verif = true;

if (!$condition1) {...; $verif =false; }
if (!$condition2) {...; $verif =false; }
...
if ($verif) { //enregistrement en bdd }

Dans l'exemple de mon lien le test est fait sur la longueur du tableau. C'est pour éviter, par rapport à l'exemple ci-dessus, d'avoir à écrire les "$verif =false;" dans chaque condition.

Petit nouveau ! | 5 Messages

12 juil. 2011, 21:02

D'accord j'ai compris merci.
Donc j'ai essayé avec ton exemple '$verif=true..." cependant quand je valide mon formulaire ça me met : "Erreur : No database selected", pourtant j'ai bien sélectionné ma database :o ...

Voici ma page "traitements.php" :
<?php
$affiche_formulaire=TRUE;
if (isset($_POST['valider']))
{
  $affiche_formulaire=FALSE;
  try
  {
    $options = array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
    //connexion à la base de données
    $bdd = new PDO('mysql:host=localhost;dbname=ffa', 'root', '', $options);

    //hachage du mot de passe et définition des variables
    $pass_hache = sha1($_POST['pwd1']);
    $login = $_POST['login'];
    $email = $_POST['email'];
    $mdp = $_POST['pwd1'];
    $mdp2 = $_POST['pwd2'];
    $verif = true;
	
	//VERIFICATIONS BANALES
if(!$mdp || !$mdp2 || strlen($mdp) < 5)
	{
	echo'Votre mot de passe ou sa confirmation est inexistant ou votre mot de passe fait moins de 5 caractères<br />';
$verif = FALSE;
	}
if($mdp!=$mdp2)
	{
	echo'Votre mot de passe n\'est pas le meme que sa confirmation<br />';
$verif = FALSE;
	}
if(!$login || strlen($login) > 10)
	{
	echo'Votre pseudo est inexistant ou fait plus de 10 caractères<br />';
$verif = FALSE;
	}
if(!$email)
   	{
	echo'Votre e-mail est innexistant.<br />';
$verif = FALSE;
   	}
	
	//VERIFICATIONS DES EXISTANCES
$reponse_mail=mysql_query("SELECT email FROM membre WHERE email='$email'") or die ('Erreur : '.mysql_error());	//verification si e-mail existe déjà
$count_mail=mysql_num_rows($reponse_mail);
if($count_mail == 1)
	{
	echo'Cet e-mail existe déjà.<br />';
$verif = FALSE;
	}
$reponse_pseudo=mysql_query("SELECT pseudo FROM membre WHERE login='$login'") or die ('Erreur : '.mysql_error());	//verification si pseudo existe déjà
$count_pseudo=mysql_num_rows($reponse_pseudo);
if($count_pseudo == 1)
	{
	echo 'Ce pseudo existe déjà.<br />';
$verif = FALSE;
	}

if($verif = true) 
    {
    //Insertion des données du formulaire
    $req = $bdd->prepare('INSERT INTO membre(login, pass, email, date_inscription) VALUES(:login, :pwd1, :email, CURDATE())');
    $req->bindValue(':login',$login,PDO::PARAM_STR);
    $req->bindValue(':pwd1',$pass_hache,PDO::PARAM_STR);
    $req->bindValue(':email',$email,PDO::PARAM_STR);
    $req->execute();
    $bdd=NULL;
    }
  }
  catch(PDOException $e)
  {
    // génération du message d'erreur
    $message = sprintf('Erreur MySQL %d<br />%s', $e->getCode(), $e->getMessage());
  }
}
?>

ViPHP
AB
ViPHP | 5818 Messages

12 juil. 2011, 21:55

if($verif = true) => dans une comparaison il faut une double égalité : if($verif == true)

Pour le reste tu devrais peut-être t'inspirer de la mise en tableau des messages. Pour plusieurs erreurs cela éviterait au visiteur de les recevoir une par une.

Petit nouveau ! | 5 Messages

13 juil. 2011, 10:22

Ok je vais essayer.
J'ai vu que dans l'exemple de ton lien (et dans beaucoup d'autre) il y a "session_start();" au début. Pourrais-tu m'expliquer à quoi cela sert-il ? Dois-je l'utiliser ?

ViPHP
AB
ViPHP | 5818 Messages

14 juil. 2011, 19:25

Tu dois utiliser session_start à chaque fois que tu utilise des variables de session (pour les définir ou pour les lire).

Dans l'exemple de mon lien je les utilise pour enregistrer les variables post, ce qui permet de les afficher pour correction par le visiteur (ex ligne : <input ... value="<?php echo (isset($_SESSION['post_form']['nom'])) ? $_SESSION['post_form']['nom'] : '' ?>") après rafraichissement de la page (lignes qui appellent la page en cours : header('Location: '.$_SERVER['PHP_SELF']);)

Pourquoi je rafraichis la page après l'enregistrement des variables post du formulaire ? parce que sinon, si le visiteur rafraichi la page suite à l'envoi d'un formulaire, ou la fait ré afficher ultérieurement par un retour arrière à l'aide du bouton de navigation, le navigateur va renvoyer dans ce cas un message du genre "cette page nécessite un renvoi d'information pour pouvoir être affichée etc." Alors que si la page s'affiche avec les variables de session (et non les variables post directement issues du formulaire), ce message ne s'affichera pas.

devlop78
Invité n'ayant pas de compte PHPfrance

15 juil. 2011, 06:11

S'illl vouuss plaaitt arrêtez de poster des questions comme ça dans PHP avancé ... :-({|= (j'ai pas trouvé le smiley qui pleure, alors je joue de la musique triste)

Petit nouveau ! | 5 Messages

15 juil. 2011, 09:59

Ok j'ai compris merci beaucoup AB.

ViPHP
AB
ViPHP | 5818 Messages

16 juil. 2011, 05:00

S'illl vouuss plaaitt arrêtez de poster des questions comme ça dans PHP avancé ... :-({|= (j'ai pas trouvé le smiley qui pleure, alors je joue de la musique triste)
Ah ben oui mais ça c'est l'éternel problème qu'il faut avoir du recul (de l'expérience) pour pourvoir en juger :) Et donc pas forcément compréhensible pour des "débutants" qui ont fait quelques requêtes ou autres fonctions qui fonctionnent correctement et qui leur font penser qu'ils ont déjà pas mal avancé. Comme dirait l'autre, tout est relatif :wink:

Eléphant du PHP | 171 Messages

16 juil. 2011, 05:46

S'illl vouuss plaaitt arrêtez de poster des questions comme ça dans PHP avancé ... :-({|= (j'ai pas trouvé le smiley qui pleure, alors je joue de la musique triste)
Ah ben oui mais ça c'est l'éternel problème qu'il faut avoir du recul (de l'expérience) pour pourvoir en juger :) Et donc pas forcément compréhensible pour des "débutants" qui ont fait quelques requêtes ou autres fonctions qui fonctionnent correctement et qui leur font penser qu'ils ont déjà pas mal avancé. Comme dirait l'autre, tout est relatif :wink:
Je pense qu'en fait c'est la description des catégories qui trompe certains.

La mention "Pour ceux qui débutent" est peut être ambigu. Ils arrivent et se disent, ça fait plus de 3 mois que je fais du PHP, c'est bon je suis plus un débutant.
Et puis pour ce qui est de la description avancé, certains se prennent sûrement la grosse tête en se prenant pour des "gourous" :p après avoir réaliser une requête imbriquée. (ou après avoir fais leur premier phpinfo() :D )

Mais bon comme tu dis, c'est vraiment relatif :wink: et c'est vrai qu'avec de l'expérience on détermine plus le type de problème (facile ou avancé).

C'était mon moment troll de la soirée (euh ? matinée !! :shock: ... faut que j'aille me coucher :D )
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.