[RESOLU] verification de champs

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] verification de champs

Re: verification de champs

par moimeme30 » 08 mai 2014, 20:39

ok c'est fait et ca fonctionne.. formidable.
merci de votre aide

Re: verification de champs

par xTG » 07 mai 2014, 17:22

Non, plutôt un if/else pour insérer une valeur par défaut.

Re: verification de champs

par moimeme30 » 07 mai 2014, 16:27

plutot l'utilisation de binValue alors?

Re: verification de champs

par xTG » 07 mai 2014, 16:12

C'est plutôt dans le sens où si quelqu'un pointe vers ta page depuis un formulaire de sa création tu ne sais pas ce qui est défini ou non.
Il ne faut donc jamais partir du principe que telle ou telle variable existe.

Re: verification de champs

par moimeme30 » 07 mai 2014, 14:41

ca y est, j'ai enfin réussi.
Voici le code si ça intéresse quelqu'un
//Vérifie que les champs obligatoires soient remplis
function verifChampsRemplis($field) {
    $retour = false;
    if (empty($_POST[$field])) {
        $retour = true;
    }
    return $retour;
}

//Vérifie le format de l'email
function formatMail($mail){
	$retour = false;
		$regex = "/([a-z0-9_]+|[a-z0-9_]+\.[a-z0-9_]+)@(([a-z0-9]|[a-z0-9]+\.[a-z0-9]+)+\.([a-z]{2,4}))/i"; 
		$mail = $_POST['mail'];
		if(!preg_match($regex, $mail)) {
			$retour = true;
		}
		return $retour;
}

//Vérifie le format du num de tel
function formatTel($tel1){
	$retour = false;
		$regex = '#(0|\+33)[1-9]( *[0-9]{2}){4}#'; 
		$tel1 = $_POST['tel1'];
		if(!preg_match($regex, $tel1)){
			$retour = true;
		}
		return $retour;
}

//Vérifie que les 2 mots de passe soient identiques
function mdpVerif($field) {
    $retour = false;	
	if($_POST['mdp'] != $_POST['mdp2']){
        $retour = true;
    }
    return $retour;
}

//Vérifie que les 2 emails soient identiques
function mailVerif($field) {
    $retour = false;	
	if($_POST['mail'] != $_POST['mail2']){
        $retour = true;
    }
    return $retour;
}

//Vérifie si l'email existe dans la BDD	
function mailExist($field) {	
$retour = false;	
	if (isset($_POST['mail'])){
		$mail = htmlentities($_POST['mail']);
		$resultat = Cnx::connectCnx()->prepare('SELECT mail FROM users WHERE mail = \''.$mail.'\';');
		$resultat->execute(array('.$mail.' => $_POST['mail']));
		$res = $resultat->fetch();
			if ($res){
			$retour = true;
			}
	}
	return $retour;
}	
	

function checkForm() {
    $erreur = array();
    if (verifChampsRemplis('nom')) {
        $erreur[] = 'Vous devez renseigner votre nom';
    }
    if (verifChampsRemplis('prenom')) {
        $erreur[] = 'Vous devez renseigner votre prénom';
    }
    if (verifChampsRemplis('adresse')) {
        $erreur[] = 'Vous devez renseigner votre adresse';
    }
    if (verifChampsRemplis('cp')) {
        $erreur[] = 'Vous devez renseigner votre code postal';
    }
    if (verifChampsRemplis('ville')) {
        $erreur[] = 'Vous devez renseigner votre ville';
    }
    if (verifChampsRemplis('tel1')) {
        $erreur[] = 'Vous devez renseigner votre numéro de téléphone';
    }
	if (formatTel('tel1')) {
        $erreur[] = 'Numéro de téléphone non valide';
    }
	if (formatMail('mail')) {
        $erreur[] = 'Format d\'email non valide';
    }
    if (verifChampsRemplis('mail')) {
        $erreur[] = 'Vous devez renseigner votre email';
    }
	if (verifChampsRemplis('mail2')) {
        $erreur[] = 'Vous devez confirmer votre email';
    }
	if (mailVerif('mail')) {
        $erreur[] = 'Les emails sont différents';
    }
	if (mailExist('mail')) {
        $erreur[] = 'Email déja enregistré';
	}
    if (verifChampsRemplis('mdp')) {
        $erreur[] = 'Vous devez renseigner un mot de passe';
    }
	if (verifChampsRemplis('mdp2')) {
        $erreur[] = 'Vous devez confirmer votre mot de passe';
    }
	if (mdpVerif('mdp')) {
        $erreur[] = 'Les mots de passe sont différents';
    }
    return $erreur;
}


if (isset($_POST['inscription'])) {
    $erreur = checkForm();
    // pas d'erreur
    if (empty($erreur)) {
									//Protection par captcha
									//if($_POST['captcha'] == $_SESSION['captcha']){
									//Crypte le MdP
									$_POST['mdp'] = sha1($_POST['mdp']);
        try {
            $resultat = Cnx::connectCnx()->prepare('INSERT INTO users (societe, nom, prenom, adresse, cp, ville, tel1, tel2, mail, mdp) 
                                                    VALUES(:societe, :nom, :prenom, :adresse, :cp, :ville, :tel1, :tel2, :mail, :mdp)');
            $resultat->bindParam(':societe', $_POST['societe']);// Attention tu ne sais pas si ce champs existe
            $resultat->bindParam(':nom', $_POST['nom']);
            $resultat->bindParam(':prenom', $_POST['prenom']);
            $resultat->bindParam(':adresse', $_POST['adresse']);
            $resultat->bindParam(':cp', $_POST['cp'], PDO::PARAM_INT);
            $resultat->bindParam(':ville', $_POST['ville']);
            $resultat->bindParam(':tel1', $_POST['tel1'], PDO::PARAM_INT);
            $resultat->bindParam(':tel2', $_POST['tel2'], PDO::PARAM_INT); // Attention tu ne sais pas si ce champs existe
            $resultat->bindParam(':mail', $_POST['mail']);
            $resultat->bindParam(':mdp', $_POST['mdp']);
            $resultat->execute();

            echo 'Enregistrement réussi';
            exit();
			echo 'Erreur, Recommencez';
        } catch (PDOException $e) {
            echo '<div class="error">Erreur SQL : ' . $e->getMessage().'</div>';
        }
		/* } */
    } else {
        echo '<div class="error">';
		
        foreach ($erreur as $e) {
            echo $e, '<br />';
        }
        echo '</div>';
    }
}
?>
Une dernière chose, qu'entends tu par "attention tu ne sais pas si ce champs existe"?
Sachant qu'il n'est pas obligatoire, il peut tout de même poser problème?

Re: verification de champs

par moimeme30 » 07 mai 2014, 13:53

Merci, je galerai:)
et en fait il fallait aussi supprimer le "!" du empty dans la fonction.
Maintenant tout fonctionne nikel.

Par contre, dans ma precedente façon de faire, j'avais ajouter plusieurs autres conditions dont des regex pour verifier les formats d'email num de tel....
J'essais donc de mettre ces regex dans une fonction, mais ça ne marche pas.
function testMail($mail){
$retour = false;
//verifie le format de l'email
	$regex = "/([a-z0-9_]+|[a-z0-9_]+\.[a-z0-9_]+)@(([a-z0-9]|[a-z0-9]+\.[a-z0-9]+)+\.([a-z]{2,4}))/i"; 
	$mail = $_POST['mail'];
	if(!preg_match($regex, $mail)) 
	{$retour = true;}
}
Rigolez pas svp :)

Re: verification de champs

par yann18 » 07 mai 2014, 13:14

si tu avais bien compris le message suivant, tu ne devrais pas rencontré ce type d'erreurs:
Perso j'utiliserais un tableau dans lequel j'ajouterais les messages d'erreurs et ensuite, dans le else, un simple affichage du tableau.
Il y a moyen de faire quelque chose de plus générique afin d’alléger, un peu le code).
/**
 * @return array
 */
function checkForm() {
    $erreur = array();
    if (ckeckNotNullPostField('nom')) {
        $erreur[] = 'Vous devez renseigner votre nom';
    }
    if (ckeckNotNullPostField('prenom')) {
        $erreur[] = 'Vous devez renseigner votre prénom';
    }
    if (ckeckNotNullPostField('adresse')) {
        $erreur[] = 'Vous devez renseigner votre adresse';
    }
    if (ckeckNotNullPostField('cp')) {
        $erreur[] = 'Vous devez renseigner votre code postal';
    }
    if (ckeckNotNullPostField('ville')) {
        $erreur[] = 'Vous devez renseigner votre ville';
    }
    if (ckeckNotNullPostField('tel1')) {
        $erreur[] = 'Vous devez renseigner votre numéro de téléphone';
    }
    if (ckeckNotNullPostField('mail')) {
        $erreur[] = 'Vous devez renseigner votre email';
    }
    if (ckeckNotNullPostField('mdp')) {
        $erreur[] = 'Vous devez renseigner un mot de passe';

      //  return $erreur;
    }

    return $erreur;
}

Re: verification de champs

par moimeme30 » 07 mai 2014, 12:47

Merci Moogli de prendre un peu de temps pour moi,

Je viens de tester ton code, alors effectivement il est bien plus court que le mien:)
Par contre, il y a quelques erreurs que je ne comprend pas.
Si je ne rempli pas tous les champs, l'enregistrement se fait et l'erreur suivante apparait
 Warning: Invalid argument supplied for foreach()
foreach ($erreur as $e) {
et si je ne rempli aucun champs, l enregistrement se fait et l erreur suivante apparait
Undefined variable: erreur in
    if (ckeckNotNullPostField('mdp')) {
        $erreur = 'Vous devez renseigner un mot de passe';

        return $erreur;
    }

    return $erreur; //ici qu'apparait l'erreur
}
Tu peux m'en dire plus stp:)

Re: verification de champs

par moogli » 07 mai 2014, 09:55

salut,

Tu ne vérifie pas la présence de "société" ou "tel2" dans le tableau post tu t'expose à une erreur. (si les champs ne sont pas présent il y aura une erreur, il faut toujours vérifier la présence d'un champs avant de l'utiliser).
pour info PDO::PARAM_STR est inutile c'est le cas par défaut ;)

Perso j'utiliserais un tableau dans lequel j'ajouterais les messages d'erreurs et ensuite, dans le else, un simple affichage du tableau.
Il y a moyen de faire quelque chose de plus générique afin d’alléger, un peu le code).

par exemple
<?php
/**
 * Vérifie que le champs indiqué existe et ne soit pas vide (ni null, ni égal à false, zéro ou équivalent
 * (plus d'info dans la doc de empty)
 *
 * @param $field
 *
 * @return bool
 */
function ckeckNotNullPostField($field) {
    $retour = false;
    if (!empty($_POST[$field])) {
        $retour = true;
    }

    return $retour;
}

/**
 * @return string
 */
function checkForm() {
    if (ckeckNotNullPostField('nom')) {
        $erreur = 'Vous devez renseigner votre nom';
    }
    if (ckeckNotNullPostField('prenom')) {
        $erreur = 'Vous devez renseigner votre prénom';
    }
    if (ckeckNotNullPostField('adresse')) {
        $erreur = 'Vous devez renseigner votre adresse';
    }
    if (ckeckNotNullPostField('cp')) {
        $erreur = 'Vous devez renseigner votre code postal';
    }
    if (ckeckNotNullPostField('ville')) {
        $erreur = 'Vous devez renseigner votre ville';
    }
    if (ckeckNotNullPostField('tel1')) {
        $erreur = 'Vous devez renseigner votre numéro de téléphone';
    }
    if (ckeckNotNullPostField('mail')) {
        $erreur = 'Vous devez renseigner votre email';
    }
    if (ckeckNotNullPostField('mdp')) {
        $erreur = 'Vous devez renseigner un mot de passe';

        return $erreur;
    }

    return $erreur;
}

if (isset($_POST['inscription'])) {
    $erreur = checkForm();
    // pas d'erreur
    if (empty($erreur)) {
        try {
            $resultat = Cnx::connectCnx()->prepare('INSERT INTO users (societe, nom, prenom, adresse, cp, ville, tel1, tel2, mail, mdp) 
                                                    VALUES(:societe, :nom, :prenom, :adresse, :cp, :ville, :tel1, :tel2, :mail, :mdp)');
            $resultat->bindParam(':societe', $_POST['societe']);// Attention tu ne sais pas si ce champs existe
            $resultat->bindParam(':nom', $_POST['nom']);
            $resultat->bindParam(':prenom', $_POST['prenom']);
            $resultat->bindParam(':adresse', $_POST['adresse']);
            $resultat->bindParam(':cp', $_POST['cp'], PDO::PARAM_INT);
            $resultat->bindParam(':ville', $_POST['ville']);
            $resultat->bindParam(':tel1', $_POST['tel1'], PDO::PARAM_INT);
            $resultat->bindParam(':tel2', $_POST['tel2'], PDO::PARAM_INT); // Attention tu ne sais pas si ce champs existe
            $resultat->bindParam(':mail', $_POST['mail']);
            $resultat->bindParam(':mdp', $_POST['mdp']);
            $resultat->execute();

            echo 'Enregistrement réussi';
            exit; // brutal non ? afficher un beau message dans une page complète avec possibilité de continuer a 
//            naviguer sur le site c'est mieux ;)
        } catch (PDOException $e) {
            echo '<div class="error">Erreur SQL : ' . $e->getMessage().'</div>';
        }
    } else {
        echo '<div class="error">';
        foreach ($erreur as $e) {
            echo $e, '<br />';
        }
        echo '</div>';
    }
}
les deux fonctions peuvent être déportées dans un fichier "librairie" sachant que la première est réutilisable.
Tu me diras, ben mes if avait le même résultat.
effectivement mais la tu va pouvoir modifier les règles de vérificatio des champs, pour tous le monde, au même en droit c'est quand même plus simple ;)
tu veux pouvoir tester des nombres qui peuvent être zéro ? tu ajoute un paramètre facultatif (isNumber par exemple) qu iest booleen (par défaut false) et plutôt que de faire un brutal empty, tu vérifie le isNumber et si true tu utilise isset et is_numeric, un test si différent,test de '' etc.

l'autre fonction c'est simplement pour dégager du code "utilitaire" de la gestion proprement dite du formulaire, cela évite 25 lignes de code qui au final n'apporte pas grand chose à la compréhension (même si c'est utile).

Bémols dans ce que je te propose : il faudrait passer le tableau $_POST en paramètre des fonctions afin d'être vraiment générique :)

@+

Re: verification de champs

par moimeme30 » 06 mai 2014, 20:20

Merci de ton aide.
J'ai donc suivi tes explications mais de façon peut etre plus lourde que prevu.
Voici ce que j'ai fait
if(isset($_POST['inscription']))
{
  $erreur_nom = false;
  $erreur_prenom = false;
  $erreur_adresse = false;
  $erreur_cp = false;
  $erreur_ville = false;
  $erreur_tel = false;
  $erreur_mail = false;
  $erreur_mdp = false;
  
	if(empty($_POST['nom']))
	{$erreur_nom = true;}

	if(empty($_POST['prenom']))
	{$erreur_prenom = true;}

	if(empty($_POST['adresse']))
	{$erreur_adresse = true;}

	if(empty($_POST['cp']))
	{$erreur_cp = true;}

	if(empty($_POST['ville']))
	{$erreur_ville = true;}

	if(empty($_POST['tel1']))
	{$erreur_tel = true;}
	
	if(empty($_POST['mail']))
	{$erreur_mail = true;}

	if(empty($_POST['mdp']))
	{$erreur_mdp = true;}
	

	if(!$erreur_nom && !$erreur_prenom && !$erreur_adresse && !$erreur_cp && !$erreur_ville && !$erreur_tel && !$erreur_mail && !$erreur_mdp)
  {
      try
    {
      $resultat = Cnx::connectCnx()->prepare('INSERT INTO users (societe, nom, prenom, adresse, cp, ville, tel1, tel2, mail, mdp) VALUES(:societe, :nom, :prenom, :adresse, :cp, :ville, :tel1, :tel2, :mail, :mdp)');
      $resultat->bindParam(':societe', $_POST['societe'], PDO::PARAM_STR);
      $resultat->bindParam(':nom', $_POST['nom'], PDO::PARAM_STR);
      $resultat->bindParam(':prenom', $_POST['prenom'], PDO::PARAM_STR);
      $resultat->bindParam(':adresse', $_POST['adresse'], PDO::PARAM_STR);
      $resultat->bindParam(':cp', $_POST['cp'], PDO::PARAM_INT);
      $resultat->bindParam(':ville', $_POST['ville'], PDO::PARAM_STR);
      $resultat->bindParam(':tel1', $_POST['tel1'], PDO::PARAM_INT);
      $resultat->bindParam(':tel2', $_POST['tel2'], PDO::PARAM_INT);
      $resultat->bindParam(':mail', $_POST['mail'], PDO::PARAM_STR);
      $resultat->bindParam(':mdp', $_POST['mdp'], PDO::PARAM_STR);
      $resultat->execute();

      echo 'Enregistrement réussi';
      exit;
    }
    catch (PDOException $e)
    {
      echo 'Échec lors de la connexion : ' . $e->getMessage();
    }
 
  }
  else{
     if($erreur_nom){
       echo 'Vous devez renseigner votre nom <br />';
     }
     if($erreur_prenom ){
       echo 'Vous devez renseigner votre prénom <br />';
     }
	 if($erreur_adresse){
       echo 'Vous devez renseigner votre adresse <br />';
     }
     if($erreur_cp){
       echo 'Vous devez renseigner votre code postal <br />';
     }
	 if($erreur_ville){
       echo 'Vous devez renseigner votre ville <br />';
     }
     if($erreur_tel ){
       echo 'Vous devez renseigner votre numéro de téléphone <br />';
     }
	 if($erreur_mail){
       echo 'Vous devez renseigner votre email <br />';
     }
     if($erreur_mdp ){
       echo 'Vous devez renseigner un mot de passe <br />';
     }
  }
}
Tu en penses quoi?

Re: verification de champs

par xTG » 06 mai 2014, 18:28

En effet.
Le plus simple :
Il faut que ton if ne teste que le isset => le formulaire est-il posté ou non.
Tu initialises dedans une variable $erreur à 0.
Tu places tes trois if avec les messages d'erreur et dans chacun tu incrémentes la variable $erreur.
Puis tu termines avec un :
if( $erreur == 0 )
{
   // tous mes champs sont corrects, je fais ma requête
}

Re: verification de champs

par moimeme30 » 06 mai 2014, 17:49

j'ai bien essayé, mais le problème c'est que les "message d'avertissement" apparaissent des qu'on est sur la page sans même avoir commencé a remplir les champs

Re: verification de champs

par xTG » 06 mai 2014, 17:20

Ton premier if interdit d'aller plus loin si l'un des champs est vide.
Donc tes trois if dessous ne seront JAMAIS exécutés.

Ils faut les placer dans un else du premier if pour qu'ils le soient.

verification de champs

par moimeme30 » 06 mai 2014, 16:30

Bonjour,

Je suis sur un formulaire d'inscription et la je sèche sur la vérification des champs.
L'envoi n'est pas réalisé si les champs ne sont pas remplis mais le message d'erreur n’apparaît pas.
if(isset($_POST['inscription']) && !empty($_POST['societe']) && !empty($_POST['nom']) && !empty($_POST['prenom'])){
	extract($_POST);

if(empty($_POST['societe'])){
  echo "Indiquez le nom de votre société <br />";
}
if(empty($_POST['nom'])){
  echo "Indiquez votre nom <br />";
}
if(empty($_POST['prenom'])){
  echo "Indiquez votre prénom <br />";
}
    try
    {
      $resultat = Cnx::connectCnx()->prepare('INSERT INTO users (societe, nom, prenom) VALUES(:societe, :nom, :prenom)');
      $resultat->bindParam(':societe', $_POST['societe'], PDO::PARAM_STR);
      $resultat->bindParam(':nom', $_POST['nom'], PDO::PARAM_STR);
      $resultat->bindParam(':prenom', $_POST['prenom'], PDO::PARAM_STR);
      $resultat->execute();

      echo 'Inscription réussi';
      exit;
    }
    catch (PDOException $e)
    {
      echo 'Échec lors de la connexion : ' . $e->getMessage();
    }
  }
une idée svp?