Page inscription.php

Résolu
Bonsoir,

Je suis étudiant de dev en 1ère année. J'essaye d'implémenter un formulaire d'inscription. Mais je bloque. Je regarde partout sur internet mais en vain. Une aide serait un plus pour mon apprentissage et le bienvenue.

Je vous montre mon code :


<?php
session_start();
require_once "connexiondb.php";

if(isset($_SESSION["id"])) {
header('Location: index.php');
exit;
}

if(!empty($_POST)) {
$valid = true;
// On se place sur le bon formulaire grâce au "name" de la balise "input"
if (isset($_POST['inscription'])) {
$nom  = htmlentities(trim($_POST['nom'])); // On récupère le nom
$prenom = htmlentities(trim($_POST['prenom'])); // on récupère le prénom
$mail = htmlentities(strtolower(trim($_POST['mail']))); // On récupère le mail
$mdp = trim($_POST['mdp']); // On récupère le mot de passe 
$confmdp = trim($_POST['confmdp']); //  On récupère la confirmation du mot de passe

//  Vérification du nom
if (empty($nom)) {
$valid = false;
$er_nom = "Le nom d' utilisateur ne peut pas être vide";
}

//  Vérification du prénom
if(empty($prenom)){
$valid = false;
$er_prenom = "Le prenom d' utilisateur ne peut pas être vide";
}

// Vérification du mail
if(empty($mail)){
$valid = false;
$er_mail = "Le mail ne peut pas être vide";

// On vérifit que le mail est dans le bon format
} else if(!preg_match("/^[a-z0-9\-_.]+@[a-z]+\.[a-z]{2,3}$/i", $mail)){
$valid = false;
$er_mail = "Le mail n'est pas valide";

} else {
// On vérifit que le mail est disponible
$query = $bdd->query("SELECT mail FROM Utilisateur WHERE mail = ?", $fetch_style = PDO::FETCH_COLUMN);
$query = $query->fetch();
if ($query['mail'] <> "" ) {
$valid = false;
echo "existe déjà";
}
}

// Vérification du mot de passe
if(empty($mdp)) {
$valid = false;
$er_mdp = "Le mot de passe ne peut pas être vide";

} else if($mdp != $confmdp){
$valid = false;
$er_mdp = "La confirmation du mot de passe ne correspond pas";
}

// Si toutes les conditions sont remplies alors on fait le traitement
if($valid){

$mdp = crypt($mdp, "$6$rounds=5000$macleapersonnaliseretagardersecret$");
$date_creation = date('Y-m-d H:i:s');

// On insert nos données dans la table utilisateur
$res = $bdd->insert("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)",
array($nom, $prenom, $mail, $date_creation));
header('Location: index.php');
exit;
} else {
echo "invalide";
}
}
}
?>

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Inscription</title>
</head>
<body>   
<div>Inscription</div>
<form method="post">
<?php
if (isset($er_nom)) {
?>
<div><?php $er_nom ?></div>
<?php
}
?>
<input type="text" placeholder="Votre nom" name="nom" value="<?php if(isset($nom)){ echo $nom; }?>" required>
<?php
if (isset($er_prenom)){
?>
<div><?= $er_prenom ?></div>
<?php
}
?>
<input type="text" placeholder="Votre prénom" name="prenom" value="<?php if(isset($prenom)){ echo $prenom; }?>" required>
<?php
if (isset($er_mail)){
?>
<div><?= $er_mail ?></div>
<?php
}
?>
<input type="email" placeholder="Adresse mail" name="mail" value="<?php if(isset($mail)){ echo $mail; }?>" required>
<?php
if (isset($er_mdp)){
?>
<div><?= $er_mdp ?></div>
<?php
}
?>
<input type="password" placeholder="Mot de passe" name="mdp" value="<?php if(isset($mdp)){ echo $mdp; }?>" required>
<input type="password" placeholder="Confirmer le mot de passe" name="confmdp" required>
<button type="submit" name="inscription">Envoyer</button>
</form>
</body>
</html>



Voici le rendu :

Fatal error: Uncaught ArgumentCountError: PDO::query() expects exactly 3 arguments for the fetch mode provided, 2 given in /Applications/MAMP/htdocs/mini-shop_grp6/inscription.php:44 Stack trace: #0 /Applications/MAMP/htdocs/mini-shop_grp6/inscription.php(44): PDO->query('SELECT mail FRO...', 7) #1 {main} thrown in /Applications/MAMP/htdocs/mini-shop_grp6/inscription.php on line 44

Je vous remercie ;)

Configuration: Macintosh / Chrome 84.0.4147.105

7 réponses

  1. Modérateur
    Au niveau du html, il faut indiquer l'action dans le form
    Si le PHP se trouve dans la même page que ton code html
      <form method="post" action="">
    


    Si le code PHP se trouve dans un autre fichier
      <form method="post" action="chemin/vers/ton/fichier.php">
    


    A noter, que pour que le code php s'exécute, il faut que l'extension de ton fichier soit bien .php
    (sauf à faire du paramétrage au niveau du serveur... )

    Côté php
    1 - Activer l'affichage des erreurs PHP ( à placer TOUT AU DEBUT de ton code php )
    <?php
    //démarrage des sessions
    session_start();
    
    // Affichage des erreurs PHP
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    
    // puis la suite de ton code
    


    Ensuite, tu pourrais aussi vérifier si ta variable $_POST te retourne bien ce que tu as entré dans tes champs.

    Pour ça, avant ton premier IF, tu pourrais faire un print_r
    print_r($_POST);
    


    Au niveau de tes requêtes ... tu as ajouté l'utilisation du beginTransaction();
    ... j'ai l'impression que tu copies/colle bêtement des codes trouvés au hasard sur le net ...
    Tu sais à quoi ça sert au moins ??
    Et donc.. ben.. si tu utilises cette instruction... il ne faut pas oublier de commit() pour que les modifs soient prises en compte !!
     $query->commit();
    

    Mais.. ça n'a d'utilité que si tu gères un eventuel rollback ....

    PS: La fonction htmlentities ne doit s'utiliser que pour de l'affichage ... jamais pour le stockage des données en BDD.

    1. Voila une autre implémentation en m'appuyant sur les derniers conseils :

      connexion_db.php



      <?php

      try {
      $bdd = new PDO('mysql:host=localhost;dbname=db_gaming;charset=utf8', 'root', 'root');
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      } catch (Exception $e) {
      die('Erreur'.$e->getMessage());
      }

      ?>



      inscription.php



      $sql = "SELECT * FROM Utilisateur WHERE mail = ?";
      $datas = array(':mail' => $mail);

      //Execution de la requete
      try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute($datas) ;
      }catch(Exception $e){
      // en cas d'erreur :
      echo " Erreur ! ".$e->getMessage();
      echo " Les datas : " ;
      print_r($datas);
      }



      ça affiche une autre erreur :

      Erreur ! SQLSTATE[HY093]: Invalid parameter number: parameter was not defined Les datas : Array ( [:mail] => ***@*** ) invalide
      1. Modérateur
        Avec cette syntaxe là il ne faut pas mettre un point d'interrogation en guise de paramètre au niveau de la requête SQL mais le même nom que ce que tu as mis comme clé dans l'array que tu envoies dans le exécute
    2. En ce qui concerne le mail il n'ya plus ce problème. Mais il ne se passe rien.

      Voici le code php à jour :

      
      <?php
          session_start();
          require_once "connexion_db.php"; 
      
          if(isset($_SESSION["id"])) {
              header('Location: index.php');
              exit;
          }
      
          if(!empty($_POST)) {
              $valid = true;
          // On se place sur le bon formulaire grâce au "name" de la balise "input"
              if(isset($_POST['inscription'])) {
                  $nom  = htmlentities(trim($_POST['nom'])); // On récupère le nom
                  $prenom = htmlentities(trim($_POST['prenom'])); // on récupère le prénom
                  $mail = htmlentities(strtolower(trim($_POST['mail']))); // On récupère le mail
                  $mdp = trim($_POST['mdp']); // On récupère le mot de passe 
                  $confmdp = trim($_POST['confmdp']); //  On récupère la confirmation du mot de passe
       
                 //  Vérification du nom
                  if (empty($nom)) {
                   $valid = false;
                   $er_nom = "Le nom d' utilisateur ne peut pas être vide";
                  }      
       
                 //  Vérification du prénom
                 if(empty($prenom)){
                  $valid = false;
                  $er_prenom = "Le prenom d' utilisateur ne peut pas être vide";
                 }      
       
                 // Vérification du mail
                 if(empty($mail)){
                  $valid = false;
                  $er_mail = "Le mail ne peut pas être vide";
       
                  // On vérifit que le mail est dans le bon format
                 } else if(!preg_match("/^[a-z0-9\-_.]+@[a-z]+\.[a-z]{2,3}$/i", $mail)){
                  $valid = false;
                  $er_mail = "Le mail n'est pas valide";
       
                 } else {
                  // On vérifit que le mail est disponible
                  $query = $bdd->prepare("SELECT mail FROM Utilisateur");
                  $query->execute(array($mail));
                  $data = $query->fetch();
                  if ($data) {
                      $valid = false;
                      echo "existe déjà";
                  } 
               }
       
                 // Vérification du mot de passe
                 if(empty($mdp)) {
                  $valid = false;
                  $er_mdp = "Le mot de passe ne peut pas être vide";
       
                 } else if($mdp != $confmdp){
                  $valid = false;
                  $er_mdp = "La confirmation du mot de passe ne correspond pas";
                 }
       
                 // Si toutes les conditions sont remplies alors on fait le traitement
                 if($valid){
       
                  $mdp = crypt($mdp, "$6$rounds=5000$macleapersonnaliseretagardersecret$");
                  $date_creation = date('Y-m-d H:i:s');
       
                  // On insert nos données dans la table utilisateur
                  $bdd->insert("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)", 
                  array($nom, $prenom, $mail, $date_creation));
                  header('Location: index.php');
                  exit;
                 } /* else {
                     echo "invalide";
                  } */
              }
          } 
      ?>
      
      


      Edit: correctement des balises de code
      1. Modérateur
        @jordane45En plus tu as retiré le where dans ta requête select...
        Et tu n'as pas remis les try/catch ( A CHQUE REQUÊTE !)
    3. Merci pour l'information sur les balises.
      "insert" venait de PDO dans le fichier importé "connexion_db.php".
      Cela dit, j'ai fait quelques changement avec notamment les try-catch. Le problème est maintenant ailleurs et elle se trouve plutôt au niveau de la requête dans laquelle j'ai changé la structure. Mais, ça ne marche pas. Voici le code :

      <?php
          session_start();
          require_once "connexion_db.php"; 
      
          if(isset($_SESSION["id"])) {
              header('Location: index.php');
              exit;
          }
      
          if(!empty($_POST)) {
              $valid = true;
          // On se place sur le bon formulaire grâce au "name" de la balise "input"
              if(isset($_POST['inscription'])) {
                  $nom  = htmlentities(trim($_POST['nom'])); // On récupère le nom
                  $prenom = htmlentities(trim($_POST['prenom'])); // on récupère le prénom
                  $mail = htmlentities(strtolower(trim($_POST['mail']))); // On récupère le mail
                  $mdp = trim($_POST['mdp']); // On récupère le mot de passe 
                  $confmdp = trim($_POST['confmdp']); //  On récupère la confirmation du mot de passe
       
                  //  Vérification du nom
                  if (empty($nom)) {
                      $valid = false;
                      $er_nom = "Le nom d' utilisateur ne peut pas être vide";
                  }      
       
                  //  Vérification du prénom
                  if(empty($prenom)){
                      $valid = false;
                      $er_prenom = "Le prenom d' utilisateur ne peut pas être vide";
                  }      
                  
                  // Vérification du mail
                  if(empty($mail)) {
                      // On vérifit que le mail est dans le bon format
                      $valid = false;
                      $er_mail = "mail vide";
                  } else if(!preg_match("/^[a-z0-9\-_.]+@[a-z]+\.[a-z]{2,3}$/i", $mail)) {
                      $valid = true;
                      $er_mail = "Le mail invalide";
                  } 
      
                  // Vérification du mot de passe
                  if(empty($mdp)) {
                      $valid = false;
                      $er_mdp = "Le mot de passe ne peut pas être vide";
                  } else if($mdp != $confmdp){
                      $valid = false;
                      $er_mdp = "La confirmation du mot de passe ne correspond pas";
                  }
       
                  // Si toutes les conditions sont remplies alors on fait le traitement
                  if($valid) {
                      $mdp = crypt($mdp, "$6$rounds=5000$macleapersonnaliseretagardersecret$");
                      $date_creation = date('Y-m-d H:i:s');
       
                      // On insert nos données dans la table utilisateur
                      try {
                          //$bdd->insert("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)");
                          $query = $bdd->prepare("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)");
                          $query->bindValue(':nom', $nom);
                          $query->bindValue(':prenom', $prenom);
                          $query->bindValue(':mail', $mail);
                          $query->bindValue(':mdp', $mdp);
                          $query->bindValue(':date_creation', $date_creation);
                          $query->execute([$nom, $prenom, $mail, $mdp, $date_creation]);
                          header('Location: index.php');
                          exit;
                      } catch (Exception $e) {
                          echo $e->getMessage();
                      }
                  } 
              }
          } 
      ?>
      
      1. Modérateur
        Tu dis :

        Et donc.. quel est le problème ??
        Tu as un message d'erreur ? si oui.. ben... faut nous le donner.

        A savoir que
        Si tu fais du BIND ... il ne faut pas, en plus, passer les variables dans le execute ...

        Donc, soit tu fais :

        try {
                            //$bdd->insert("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)");
                            $query = $bdd->prepare("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (:nom, :prenom, :mail, :mdp, :date_creation)");
                            $query->bindValue(':nom', $nom);
                            $query->bindValue(':prenom', $prenom);
                            $query->bindValue(':mail', $mail);
                            $query->bindValue(':mdp', $mdp);
                            $query->bindValue(':date_creation', $date_creation);
                            $query->execute();
                            header('Location: index.php'); // je te conseille de le mettre en commentaire le temps de tes testes.. pour pouvoir lire les éventuelles erreurs ....
                            exit;
                        } catch (Exception $e) {
                            echo $e->getMessage();
                        }
        

        ou alors
        try {
                            //$bdd->insert("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)");
                            $query = $bdd->prepare("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)");
                            $query->execute([$nom, $prenom, $mail, $mdp, $date_creation]);
                            header('Location: index.php'); // // je te conseille de le mettre en commentaire le temps de tes testes.. pour pouvoir lire les éventuelles erreurs ....
                            exit;
                        } catch (Exception $e) {
                            echo $e->getMessage();
                        }
        
    4. Oui j'avais oublié de le dire qu'il ne se passait rien.

      J'ai tenté de faire ces changements que tu m'as dis de faire. Mais toujours la même chose.

      Voila le code ainsi que le code html de la page :

      
      <?php
          session_start();
          require_once "connexion_db.php"; 
      
          if(isset($_SESSION["id"])) {
              header('Location: index.php');
              exit;
          }
      
          if(!empty($_POST)) {
              $valid = true;
          // On se place sur le bon formulaire grâce au "name" de la balise "input"
              if(isset($_POST['inscription'])) {
                  $nom  = htmlentities(trim($_POST['nom'])); // On récupère le nom
                  $prenom = htmlentities(trim($_POST['prenom'])); // on récupère le prénom
                  $mail = htmlentities(strtolower(trim($_POST['mail']))); // On récupère le mail
                  $mdp = trim($_POST['mdp']); // On récupère le mot de passe 
                  $confmdp = trim($_POST['confmdp']); //  On récupère la confirmation du mot de passe
       
                  //  Vérification du nom
                  if (empty($nom)) {
                      $valid = false;
                      $er_nom = "Le nom d' utilisateur ne peut pas être vide";
                  }      
       
                  //  Vérification du prénom
                  if(empty($prenom)){
                      $valid = false;
                      $er_prenom = "Le prenom d' utilisateur ne peut pas être vide";
                  }      
                  
                  // Vérification du mail
                  if(empty($mail)) {
                      // On vérifit que le mail est dans le bon format
                      $valid = false;
                      $er_mail = "mail vide";
                  } else if(!preg_match("/^[a-z0-9\-_.]+@[a-z]+\.[a-z]{2,3}$/i", $mail)) {
                      $valid = true;
                      $er_mail = "Le mail invalide";
                  } 
      
                  // Vérification du mot de passe
                  if(empty($mdp)) {
                      $valid = false;
                      $er_mdp = "Le mot de passe ne peut pas être vide";
                  } else if($mdp != $confmdp){
                      $valid = false;
                      $er_mdp = "La confirmation du mot de passe ne correspond pas";
                  }
       
                  // Si toutes les conditions sont remplies alors on fait le traitement
                  if($valid) {
                      $mdp = crypt($mdp, "$6$rounds=5000$macleapersonnaliseretagardersecret$");
                      //$date_creation = date('Y-m-d H:i:s');
       
                      // On insert nos données dans la table utilisateur
                      try {
                          //$bdd->insert("INSERT INTO Utilisateur (nom, prenom, mail, mdp, date_creation) VALUES (?, ?, ?, ?, ?)");
                          $bdd->beginTranscation();
                          $query = $bdd->prepare("INSERT INTO Utilisateur (nom, prenom, mail, mdp, $date_creation) VALUES (?, ?, ?, ?, ?)");
                          // $query->bindValue(':nom', $nom);
                          // $query->bindValue(':prenom', $prenom);
                          //$query->bindValue(':mail', $mail);
                          //$query->bindValue(':mdp', $mdp);
                          //$query->bindValue(':date_creation', $date_creation);
                          $query->execute([$nom, $prenom, $mail, $mdp, $date_creation]);
                          //header('Location: index.php');
                          echo "Réussi";
                          exit;
                      } catch (Exception $e) {
                          echo $e->getMessage();
                      }
                  } 
              }
          } 
      ?>
      


      
      <!DOCTYPE html>
      <html lang="fr">
          <head>
          <meta charset="utf-8">
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <title>Inscription</title>
          </head>
          <body>      
          <div>Inscription</div>
          <form method="post">
                 <?php
                  if (isset($er_nom)) {
                  ?>
                     <div><?php $er_nom ?></div>
                  <?php    
                  }
                  ?>
                 <input type="text" placeholder="Votre nom" name="nom" value="<?php if(isset($nom)){ echo $nom; }?>" required>    
                 <?php
                  if (isset($er_prenom)){
                  ?>
                     <div><?= $er_prenom ?></div>
                  <?php    
                  }
                 ?>
                 <input type="text" placeholder="Votre prénom" name="prenom" value="<?php if(isset($prenom)){ echo $prenom; }?>" required>    
                 <?php
                  if (isset($er_mail)){
                  ?>
                     <div><?= $er_mail ?></div>
                  <?php    
                  }
                 ?>
                 <input type="email" placeholder="Adresse mail" name="mail" value="<?php if(isset($mail)){ echo $mail; }?>" required>
                 <?php
                  if (isset($er_mdp)){
                  ?>
                     <div><?= $er_mdp ?></div>
                  <?php    
                  }
                 ?>
                 <input type="password" placeholder="Mot de passe" name="mdp" value="<?php if(isset($mdp)){ echo $mdp; }?>" required>
                 <input type="password" placeholder="Confirmer le mot de passe" name="confmdp" required>
                 <button type="submit" name="inscription">Envoyer</button>
          </form>
          </body>
      </html>
      
      
      1. J'ai pu enfin régler le problème. Le problème plutôt de la base de données. Il y avait un problème avec le "nom". j'ai retiré l'affectation de $POST_nom à $nom. et dans la requête j'ai mis la valeur récupéré dans le formulaire dans le bindValue. Quand tout cela s'exécute, dans la base de données l'id commence à 2 je ne sais pas si ça a un lien. Mais en tout cas, je te remercie pour ta contribution à la résolution de mon problème.

        Oui, en effet, j'ai repris du code sur internet pour ne pas reprendre de zéro. Je ferai attention pour la prochaine fois. Quand tu vois que tu bloques, il faut tenter des choses. C'est vrai que j'ai implémenté du code inattendu parfois. Mais je savais la logique de ce code. Au final j'ai appris pour la suite. ;)