Page inscription.php

Résolu
a.b -  
 a.b -
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. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    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
  2. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour

    A mon avis
    $query = $bdd->query("SELECT mail FROM Utilisateur WHERE mail = ?", $fetch_style = PDO::FETCH_COLUMN);
    
    a changer par

    $query = $bdd->prepare("SELECT mail FROM Utilisateur WHERE mail = ?",  PDO::FETCH_COLUMN);
    $query->execute(array($mail);
    


    Et je t'invite à lire ceci
    https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

    .
    0
  3. a.b
     
    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
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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
      0
  4. a.b
     
    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
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Elle vient d'où ta methode insert
      $bdd->insert(
      
      


      Ps: merci de préciser le langage dans les balises de code
      Explications à lire entièrement disponibles ici
      https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

      .
      0
      1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830 > jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention  
         
        En plus tu as retiré le where dans ta requête select...
        Et tu n'as pas remis les try/catch ( A CHQUE REQUÊTE !)
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. a.b
     
    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();
                    }
                } 
            }
        } 
    ?>
    
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      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();
                      }
      
      0
  7. a.b
     
    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>
    
    
    0
  8. a.b
     
    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. ;)
    0