Bonjour,

C'est mon tout premier projet de site.

J'ai suivi une vidéo de GrafikArt sur le système d'inscription : [https://www.youtube.com/watch?v=YNbPMm08jcw]()
Malheureusement, je rencontre un problème que je n'arrive pas à résoudre et à comprendre aussi.

Pourriez-vous m'expliquer ?

Merci

Ce que je fais

Je test mon formulaire d'inscription, mais je ne comprend pas l'erreur:

<?php
/Ici on vérifi si les données ont-été insérées dans les champs (!empty = est différent de vide)/
if(!empty($_POST)){
/Si oui, phase de traitement/

    /*VERIFICATION DES CHAMPS*/
    if(empty($_POST['sexe'])){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['sexe'] = "Veuillez saisir votre sexe !";
    }

    if(empty($_POST['anniversaire'])){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['anniversaire'] = "Veuillez indiquer votre date de naissance !";
    }

    if(empty($_POST['pseudo']) || !preg_match('/^[a-zA-Z_-]+$/', $_POST['pseudo'])){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['pseudo'] = "Veuillez saisir un pseudo composé de lettres (ex.: Jean, jean_c, Pierre-Alain, etc) !";
    }

    /*VERIFICATION DU FORMAT DE L'EMAIL ET AUSSI SI C'EST IDENTIQUE AU CHAMPS MAILCONFIRM*/
    if(empty($_POST['mail']) || $_POST['mail'] != $_POST['mailconfirm'] || !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL)){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['mail'] = "L'email n'est pas valide !";
    }

    /*VERIFICATION AVEC LE CHAMPS PASSWORDCONFIRM*/
    if(empty($_POST['password']) || $_POST['password'] != $_POST['passwordconfirm']){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['password'] = "Le mot de passe n'est pas valide !";
    }

    /*VERIFICATION D'ACCEPTATION DES CONDITIONS*/
    if(empty($_POST['acceptcondition'])){
        /*Si la case n'est pas cochée, indiquer l'erreure à l'utilisateur*/
        $errors['acceptcondition'] = "Vous devez lire et accpeter nos conditions pour utiliser notre réseau !";
    }

    /*Si plus d'erreurs démarrage de l'insertion des données*/
    if(empty($errors)){
        /*Appel du fichier de connexion à la BDD */
        require_once('includes/bdd/connexionbdd.php');

        /*Préparation de la requête d'insertion des données */
        $req = $pdo->prepare("INSERT INTO utilisateurs SET sexe = ?, anniversaire = ?, pseudo = ?, mail = ?, password = ?");

        /*Hashage du mot de passe */
        $password = password_hash($_POST['password'], PASSWORD_BCRYPT);

        /*Dès que la requête est prêt, démarrage de la requête d'insertion */
        $req->execute([$_POST['sexe'], $_POST['anniversaire'], $_POST['pseudo'], $_POST['mail'], $_POST['password']]);

        /*Message de réussite de la création du compte*/
        die('Votre compte à bien été créé !');
    }
    var_dump($errors);
}   

?>

Ce que je veux

Pouvez-vous me dire ce qui ne va pas ?

Ce que j'obtiens

( ! ) Fatal error: in C:\wamp64\www\marencontre\includes\script-fonction\script-inscription.php on line 52
( ! ) PDOException: in C:\wamp64\www\marencontre\includes\script-fonction\script-inscription.php on line 52
Call Stack

Time Memory Function Location

1 0.0002 411632 {main}( ) ...\inscription.php:0
2 0.0006 412576 include_once( 'C:\wamp64\www\marencontre\includes\script-fonction\script-inscription.php' ) ...\inscription.php:3
3 0.0464 461496 execute ( ) ...\script-inscription.php:52

12 réponses


Carouge10
Réponse acceptée

le DSN est faux
ce n'est bddname mais dbname

montre nous ce que les lignes 51 et 53 contienent

et evidement le 51 aussi

CHATJOUE
Auteur

Bonjour merciful,

Avez-vous besoin de la partie connexion à la BDD et aussi de la page du formulaire ?

Merci d'avance pour votre temps et aide.

Ci-dessous les lignes:

40-41
/Si plus d'erreurs démarrage de l'insertion des données/
if(empty($errors)){
42-43
/Appel du fichier de connexion à la BDD /
require_once('includes/bdd/connexionbdd.php');
44-45
/Préparation de la requête d'insertion des données /
$req = $pdo->prepare("INSERT INTO utilisateurs SET sexe = ?, anniversaire = ?, pseudo = ?, mail = ?, password = ?");
46-47
/Hashage du mot de passe /
$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
48-49
/Dès que la requête est prêt, démarrage de la requête d'insertion /
$req->execute([$_POST['sexe'], $_POST['anniversaire'], $_POST['pseudo'], $_POST['mail'], $_POST['password']]);
50-51
/Message de réussite de la création du compte/
die('Votre compte à bien été créé !');
52-53
}
var_dump($errors);

Bonsoir,
Avez-vous activé l'affichage des erreurs PDO lors de connexion à PDO ?

CHATJOUE
Auteur

Bonjour Carouge10,

Oui, j'ai mis $errors = array(); en deuxième ligne juste après l'ouverture de la balise <?php dans le fichier des vérifications des champs du formulaire.

Si c'est dans le fichier de connexion à la BDD, non il y est pas. Il y a uniquement les accès mysql.
Le Fatal errorm, PDOException apparait uniquement une fois que les champs sont remplis et après avoir cliqué sur le bouton submit qui fait appel à mon fichier de vérification des champs et de préparation de l'insertion à bdd.

CHATJOUE
Auteur

Voici la structure de ma page d'inscription.php :

<?php
include_once('includes/script-fonction/session-start.php');
include_once('includes/script-fonction/script-inscription.php');
?>

<!doctype html>
<html lang="fr">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<?php include_once('includes/bootstrap/bootstrap-head.php');?>
<link rel="stylesheet" href="/css/bootstrap/boot-style.css">
<title>Marencontre.ch</title>
</head>
<body>
<header>
<?php include_once('includes/php/header.php');?>
</header>

<main>
    <?php include_once('includes/php/form-inscription.php');?>
</main>

<footer></footer>
<?php include_once('includes/bootstrap/bootstrap-body.php');?>

</body>
</html>

Et la page de vérification des champs (scritp-inscription.php):

<?php
$errors = array();
/Ici on vérifi si les données ont-été insérées dans les champs (!empty = est différent de vide)/
if(!empty($_POST)){
/Si oui, phase de traitement/

    /*VERIFICATION DES CHAMPS*/
    if(empty($_POST['sexe'])){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['sexe'] = "Veuillez saisir votre sexe !";
    }

    if(empty($_POST['anniversaire'])){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['anniversaire'] = "Veuillez indiquer votre date de naissance !";
    }

    if(empty($_POST['pseudo']) || !preg_match('/^[a-zA-Z_-]+$/', $_POST['pseudo'])){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['pseudo'] = "Veuillez saisir un pseudo composé de lettres (ex.: Jean, jean_c, Pierre-Alain, etc) !";
    }

    /*VERIFICATION DU FORMAT DE L'EMAIL ET AUSSI SI C'EST IDENTIQUE AU CHAMPS MAILCONFIRM*/
    if(empty($_POST['mail']) || $_POST['mail'] != $_POST['mailconfirm'] || !filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL)){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['mail'] = "L'email n'est pas valide !";
    }

    /*VERIFICATION AVEC LE CHAMPS PASSWORDCONFIRM*/
    if(empty($_POST['password']) || $_POST['password'] != $_POST['passwordconfirm']){
        /*Si pas de donnée insérée, indiquer l'erreure à l'utilisateur*/
        $errors['password'] = "Le mot de passe n'est pas valide !";
    }

    /*VERIFICATION D'ACCEPTATION DES CONDITIONS*/
    if(empty($_POST['acceptcondition'])){
        /*Si la case n'est pas cochée, indiquer l'erreure à l'utilisateur*/
        $errors['acceptcondition'] = "Vous devez lire et accpeter nos conditions pour utiliser notre réseau !";
    }

    /*Si plus d'erreurs démarrage de l'insertion des données*/
    if(empty($errors)){

        /*Appel du fichier de connexion à la BDD */
        require_once('includes/bdd/connexionbdd.php');

        /*Préparation de la requête d'insertion des données */
        $req = $pdo->prepare("INSERT INTO utilisateurs SET sexe = ?, anniversaire = ?, pseudo = ?, mail = ?, password = ?");

        /*Hashage du mot de passe */
        $password = password_hash($_POST['password'], PASSWORD_BCRYPT);

        /*Dès que la requête est prêt, démarrage de la requête d'insertion*/            
        $req->execute([$_POST['sexe'], $_POST['anniversaire'], $_POST['pseudo'], $_POST['mail'], $password]);

        /*Message de réussite de la création du compte*/
        die('Votre compte à bien été créé !');
    }
    var_dump($errors);
}   

?>

Et aussi le fichier (connexionbdd.php):

<?php
$pdo = new PDO('mysql:bddname=marencontre;host=localhost', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
?>

CHATJOUE
Auteur

Effectivement, je n'avais pas fait attention au DNS, merci beaucoup
J'ai toujours une erreure, mais qui n'est plus identique:

(!) Erreur fatale: Uncaught PDOException: SQLSTATE [HY000]: Erreur générale: 1364 Le champ 'date_inscription' n'a pas de valeur par défaut dans C: \ wamp64 \ www \ marencontre \ includes \ script-fonction \ script-inscription.php en ligne 54
(!) PDOException: SQLSTATE [HY000]: Erreur générale: 1364 Le champ 'date_inscription' n'a pas de valeur par défaut dans C: \ wamp64 \ www \ marencontre \ includes \ script-fonction \ script-inscription.php en ligne 54

C'est vraie que j'ai deux champs dans ma bdd qui sont:

  • date_inscription en datetime
    -date_connexion aussi en datetime

Le champs date_inscription doit se mettre automatiquement et une seul fois lors de l'inscription.
Le champs date_connexion doit aussi se mettre automatiquement et se mettre à jour à chaque fois que l'utilisateur se reconnectera avec ses identifiants.

Dans mon formulaire de vérification des champs, je ne les ai pas indiqué puisque ces champs ne sont pas disponible aux visiteurs du site.

Dois-je les mettre dans la requête de préparation d'insertion des données ?
/Préparation de la requête d'insertion des données /
$req = $pdo->prepare("INSERT INTO utilisateurs SET sexe = ?, anniversaire = ?, pseudo = ?, mail = ?, password = ?", date_inscription = d M Y H:i:s, date_connexion = d M Y H:i:s);

Et aussi dans l'excute ?
/Dès que la requête est prêt, démarrage de la requête d'insertion/
$req->execute([$_POST['sexe'], $_POST['anniversaire'], $_POST['pseudo'], $_POST['mail'], $password, date_inscription, date_connexion]);

CHATJOUE
Auteur

Merci à vous deux pour votre aide.

J'y suis finalement arrivé à faire les dernières étapes.

parfait tu peux parser en résolu.
tu as changer la BDD pour mettre une valeur par défaut avec CURRDATE ? ou tu as ajouté la fonction sql "NOW()" dans ta requête ?

CHATJOUE
Auteur

Hello,

J'ai mis la date_inscription en type datetime et valeur par défaut en current_timestamp.

bien, n'oublie de passer le sujet en résolu en passant sur le commentaire qui t'a aider pour le mettre en "résolu"