Page inscription.php

Résolu/Fermé
a.b - 3 févr. 2021 à 19:25
 a.b - 4 févr. 2021 à 15:48
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
A voir également:

7 réponses

jordane45 Messages postés 38223 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 juillet 2024 4 683
Modifié le 4 févr. 2021 à 16:05
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
jordane45 Messages postés 38223 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 juillet 2024 4 683
3 févr. 2021 à 19:41
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
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
jordane45 Messages postés 38223 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 juillet 2024 4 683
3 févr. 2021 à 22:17
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
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
jordane45 Messages postés 38223 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 juillet 2024 4 683
4 févr. 2021 à 06:52
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
jordane45 Messages postés 38223 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 juillet 2024 4 683 > jordane45 Messages postés 38223 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 juillet 2024
4 févr. 2021 à 06:54
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
jordane45 Messages postés 38223 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 27 juillet 2024 4 683
4 févr. 2021 à 09:51
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
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
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