Bonjour
J’ai créé une table dans laquelle j’enregistre via un formulaire les données suivantes : « prenom » , « email » , et « age »
Pour les enregistrer dans la table, j’ai essayé au début de mon code de mettre quelques filtres, afin d’empêcher que les utilisateurs n’introduisent n’importe quoi dans ma table, jusque-là tout fonctionne nickel , ensuite dans une deuxième étape je vérifie d’abord si ce nouveau enregistrement se trouve déjà inscrit dans la table si tel est pas le cas je n’autorise pas l’enregistrement au cas contraire je l’autorise dans une troisième étape. Maintenant mon problème se situe au niveau de cette dernière étape c’est-à-dire que je me suis rendu compte que même si l’enregistrement existe déjà dans la table ceci n’empêche pas son enregistrement dans la table.
Voici mon code
<html >
<body>


<html > 
<body> 


<form action='validation_enregistrement_bd.php' method='POST'>
    Prénom : 
    <input type="text" name="prenom"/><br/>
    Adresse de messagerie : 
    <input type="text" name="email"/><br/>
    Âge : 
    <input type="INT" name="age"/><br/>
    <input type="submit" value="Envoyer"/>
</form>

<?php
   //Filtrer toutes les données du formulaire

$options = array(
 //Enlever les balises.
    'prenom' => FILTER_SANITIZE_STRING,
	//Valider l'adresse de messagerie.
    'email' => FILTER_VALIDATE_EMAIL,       
    'age' => array(
                                   'filter' => FILTER_VALIDATE_INT, //Valider l'entier.
                                   'options' => array(
                                                              'min_range' => 0 //Minimum 0.
                                                               )
                                  )
                          );
						  
$resultat = filter_input_array(INPUT_POST, $options);


if($resultat != null) 
              
			 { //Si le formulaire a bien été posté.

                     //Enregistrer des messages d'erreur perso.
                           
                             $messageErreur = array(
                             'email' => 'L\'adresse de messagerie n\'est pas valide.',
                             'age' => 'Veuillez entrer un nombre entier positif pour votre âge.'
                             );

                            $nbrErreurs = 0;
                           
						   foreach($options as $cle => $valeur) 
							
							{ //Parcourir tous les champs voulus.

                                    if(empty($_POST[$cle])) 
							                 { //Si le champ est vide.
                                                  echo 'Veuillez remplir le champ ' . $cle . '.<br/>';
                                                  $nbrErreurs++;
                                             }
                                     elseif($resultat[$cle] === false)
                                             { //S'il n'est pas valide.
                                              echo $messageErreur[$cle] . '<br/>';
                                              $nbrErreurs++;
                                              }
                            }
                                 
								 // Si les données saisies dans le formulaire respectent les formes exigées alors...
                                     if($nbrErreurs == 0)

									            {
													if ( isset( $_POST['prenom'] )) 
			                                                { 	
			  
			                                                         $rechpren = $_POST['prenom'];
			                                                         $rechadresse = $_POST['email'];
			                                                         $rechage = $_POST['age'];
																	 
                                                                    //	On verrifie d'abord l'eventuelle existence de l'enregistrement dans la table 
                                                                
                                                                     try 
                                                                          { 
                                                                              $bdd = new PDO('mysql:host=localhost;dbname=comptes','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
                                                                           } 
                                                                      catch(Exception $e) 
                                                                          { 
                                                                       die('Erreur : '.$e->getMessage()); 
                                                                           }


													               // On récupère d'abord l'engistrement liee a la fiche du client dans la table ''clients''

                                                                     $req = $bdd->prepare('SELECT prenom,email,age FROM clients WHERE prenom= [langue]renom ');  
		 
		                                                              $req-> execute(array(
 
                                                                              'prenom'=> $rechpren ,
						
        
                                                                              ));
																		          $count = $req->rowCount();
						 
						                                            //On affiche chaque entrée une à une


                                                                     while ($donnees = $req->fetch())

                                                                  if($count> 0)
                                                             //         {
                                                           //             echo 'Ce client a ete deja enregistre';
                                                          //           } 

                                                                   // Si le client existe dans la table on affichera
                                                                             {
						
                                                                                 echo 'Ce client a ete deja enregistre';
                                                                                  echo $donnees['prenom'].'.......'.$donnees['email'].'........................'.$donnees['age'].'<br><br/>';
                        
						                                                     }

                                                                     $req->closeCursor(); // Termine le traitement de la requête

		                                                        }
												else
													
													// L'enregistrement n'existe pas dans la table on l'effectue
													  try 
                                                                          { 
                                                                              $bdd = new PDO('mysql:host=localhost;dbname=comptes','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
                                                                           } 
                                                                      catch(Exception $e) 
                                                                          { 
                                                                       die('Erreur : '.$e->getMessage()); 
                                                                           }
													       
														   {
														 
												                     $req = $bdd->prepare('INSERT INTO clients (prenom, email,age) VALUES(:prenom, :email,:age)');

                                                                     $req->execute(array(

                                                                     'prenom' =>$rechpren ,

                                                                    'email' => $rechadresse,
													 
													                 'age' =>$rechage 
                                                                     ));
											                          
																	  {
									                                     echo 'Client enregistre';
												                      }
																	  
                                                                    $req->closeCursor(); 

															}
												}
			}	
else 
             {
                 echo 'effectuez votre premier enregistrement de cette session.';
             }
?>
</body> 
</html>



Bonjour,

Déjà, il manque des ":" dans les execute de tes requêtes, et dans un prepare (sauf si c'est le script de colorisation syntaxique qui les aurait viré)

Je vois que tu ne fais un test que sur le prénom, pas sur un ensemble.

C'est également une mauvaise idée de compter le nombre de ligne avec le rowCount et un select, il se peut qu'il ne te retourne pas ce que tu veux, utilise plutôt un select count(*)

Tu as un try...catch juste après un else, mais avant l'accolade !?
Également un if derrière un while (celui-là était peut-être voulu, mais attention quand même)

Et sauf erreur de ma part, mais j'ai l'impression que ton test d'enregistrement (ou non) ne consiste qu'à vérifier si l'on POST le prénom ou pas, non ?
Modifié par SolidSnake (22 May 2017 - 15:34)
Salut,

Tester des doublons avec le prénom est une mauvaise idée pour la simple et bonne raison que les homonyme existe. IDEM pour les noms de famille.

La solution la plus simple (et la plus commune) et de faire en sorte que l'email soit unique. Pour se faire, il suffit de définir la colonne email dans MySQL comme donnée unique et de catcher l'erreur dans ton PHP si jamais ta requête d'insertion te retourne une erreur.

Tu peux aussi tester en AJAX la présence de l'email dans ta base avant que l'utilisateur envoi le formulaire. C'est plus sexy qu'une erreur après l'envoi du formulaire.

Bon courage !
Bon alors, pour y voir plus clair dans ton code, il faut que tu changes ta façon d'indenter tes lignes. Tu avais beaucoup trop d'espaces. Tu n'es pas obligé de faire comme moi non plus.

Ensuite, tu démarrais la connexion à la base de données deux fois, une seule suffit. C'est pour cela que j'ai placé le code au début. De plus, comme dit plus haut, la deuxième connexion à la bdd était entre un else et une accolade.

Au début de ton code tu filtres tes variables POST, mais plus loin quand tu veux insérer le client dans la base de données, tu n'utilises pas ces variables "sécurisées". J'ai donc corrigé.

Ensuite il y avait un problème dans tes conditions, quand tu vérifies si le client existe déjà ou pas. Je t'invite à comparer les deux codes (l'ancien et celui ci-dessous).

Pas besoin de while pour afficher les résultats de la requête, étant donné que tu ne peux avoir q'un résultat maximum si le prénom est unique.

Je n'ai pas pu m'empecher de corriger et compléter ton html avec le minimum syndical ^^

Logiquement ce code devrait fonctionner, mais comme je ne l'ai pas testé, je ne garantis rien Smiley langue

<!DOCTYPE html>
<html lang="fr">
  <head>
    <meta charset="UTF-8" />
    <title>Formulaire</title>
    <link rel="stylesheet" media="screen" href="main.css" />
  </head>
  <body>
    <form action="validation_enregistrement_bd.php" method="post">
      <fieldset>
        <label>Prénom : </label><input type="text" name="prenom" /><br/>
        <label>Adresse de messagerie : </label><input type="text" name="email" /><br/>
        <label>Âge : </label><input type="number" name="age" min="0" step="1" /><br/>
        <input type="submit" value="Envoyer" />
      </fieldset>
    </form>

<?php

try{ 
  $bdd = new PDO('mysql:host=localhost;dbname=comptes', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}catch(Exception $e){ 
  die('Erreur : '.$e->getMessage());
}

//Filtrer toutes les données du formulaire
$options = array(
                  'prenom' => FILTER_SANITIZE_STRING,
                  'email'  => FILTER_VALIDATE_EMAIL,
                  'age'    => array(
                                    'filter' => FILTER_VALIDATE_INT,
                                    'options' => array('min_range' => 0)
                                   )
                );
						  
$resultat = filter_input_array(INPUT_POST, $options);

//Enregistrer des messages d'erreur perso.
$nbrErreurs    = 0;
$messageErreur = array(
                       'prenom' => 'Le prénom est invalide.',
                       'email'  => "L'adresse de messagerie n'est pas valide.",
                       'age'    => 'Veuillez entrer un nombre entier positif pour votre âge.'
                      );

//Parcourir tous les champs voulus.
foreach($options as $cle => $valeur){
  //Si le champ est vide.  
  if(empty($_POST[$cle])){
    echo 'Veuillez remplir le champ '.$cle.'.<br/>';
    $nbrErreurs++;
  //S'il n'est pas valide.
  }elseif($resultat[$cle] === false){
    echo $messageErreur[$cle] . '<br/>';
    $nbrErreurs++;
  }
}

//Si le formulaire a bien été posté ET si les données saisies dans le formulaire respectent les formes exigées alors...
if($resultat != null && $nbrErreurs == 0){
  //On verifie l'eventuelle existence de l'enregistrement dans la table et on récupère la fiche du client dans la table 'clients'
  $req     = $bdd->prepare("SELECT prenom, email, age FROM clients WHERE prenom =':prenom'");
  $req->execute($resultat);
  $count   = $req->rowCount();
  $donnees = $req->fetch();
  $req->closeCursor();

  if($count > 0)
    echo 'Ce client a ete deja enregistre '.$donnees['prenom'].'.......'.$donnees['email'].'........................'.$donnees['age'].'<br/><br/>';
  else{
    //L'enregistrement n'existe pas dans la table on l'effectue
    $req = $bdd->prepare('INSERT INTO clients (prenom, email, age) VALUES(:prenom, :email,:age)');
    $req->execute($resultat);
    $req->closeCursor();
    echo 'Client enregistre';
  }
}else
  echo 'effectuez votre premier enregistrement de cette session.';

?>

  </body> 
</html>

Modifié par taspeur (22 May 2017 - 23:08)