Bonjour,

Voila je rencontre un petit problème avec mon code.

je suis actuellement le tuto de grafikart pour la création d'un site internbet et surtout la partie compte utilisateur.
Plus précisément la partie finale quand l'absence d'eereur est chekée et que l'on exécute la requête préparée pour insérer toutes les données
<?php
require_once'inc/functions.php';
session_start();

if(!empty($_POST)){

$errors=array();
require_once 'inc/db.php';

if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/',$_POST['username'])){
    $errors['username']="Votre Pseudo n'est pas valide";
} else {
$req = $pdo->prepare('SELECT id FROM users WHERE username = ?');
$req->execute([$_POST['username']]);
$user=$req->fetch();
if($user);{
$errors['username'] = "ce pseudo est déjà pris";
}
}

if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
    $errors['email']="Votre Email n'est pas valide";
}   
if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirmed']) {
    $errors['password']="Votre mot de passe n'est pas valide";
}   else {
$req = $pdo->prepare('SELECT id FROM users WHERE email = ?');
$req->execute([$_POST['email']]);
$user=$req->fetch();
if($user);
$errors['email'] = "cet email est déjà utilisé par un autre compte ";
}
}
if(empty($errors)){

$req = $pdo->prepare('INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?');

$password = password_hash($_POST['password'],PASSWORD_BCRYPT);
$token = str_random(60);
$req->execute([$_POST['username'], $password, $_POST['email'],$token]);
if(empty($errors)){
$_SESSION['flash']['success'] = 'un Email de confirmation vous a été envoyé pour valider votre compte';
mail($_POST['email'],'Confirmation de votre compte STELLAR',"Afin de valider votre compte, merci de cliquer sur ce lien\n\nhttp://localhost/index.php,id=$user_id,$token=$token");
header('location: index.php');
exit();
}
$user_id = $pdo->LastInsertId();

}

?>

Je rencontre cette erreur citée en titre
( ! ) Notice: Undefined variable: pdo in E:\phpmyadmin\STELLAR\projet\register.php on line 47
( ! ) Fatal error: Uncaught Error: Call to a member function prepare() on null in E:\phpmyadmin\STELLAR\projet\register.php on line 47
Pour moi le problème vien de la ligne entre étoile mais je ne trouve pas la solution depuis 1 semaine
Merci pour votre aide
Cordialement
Jonathan.

11 réponses


Carouge10
Réponse acceptée

c'est ça

<?php
session_start();
require_once'inc/functions.php';

if(!empty($_POST)){

    $errors=array();
    require_once 'inc/db.php';

    if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/',$_POST['username'])){
        $errors['username']="Votre Pseudo n'est pas valide";
    } else {
        $req = $pdo->prepare('SELECT id FROM users WHERE username = ?');
        $req->execute([$_POST['username']]);
        $user=$req->fetch();
        if($user);{
            $errors['username'] = "ce pseudo est déjà pris";
        }
    }

    if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        $errors['email']="Votre Email n'est pas valide";
    }   
    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirmed']) {
        $errors['password']="Votre mot de passe n'est pas valide";
    }   else {
        $req = $pdo->prepare('SELECT id FROM users WHERE email = ?');
        $req->execute([$_POST['email']]);
        $user=$req->fetch();
        if($user);
        $errors['email'] = "cet email est déjà utilisé par un autre compte ";
    }

    if(empty($errors)){
        $req = $pdo->prepare('INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?');

        $password = password_hash($_POST['password'],PASSWORD_BCRYPT);

        $token = str_random(60);

        $req->execute([$_POST['username'], $password, $_POST['email'],$token]);
        if(empty($errors)){
        $_SESSION['flash']['success'] = 'un Email de confirmation vous a été envoyé pour valider votre compte';
        mail($_POST['email'],'Confirmation de votre compte STELLAR',"Afin de valider votre compte, merci de cliquer sur ce lien\n\nhttp://localhost/index.php,id=$user_id,$token=$token");
        header('location: index.php');
        exit();
        }
        $user_id = $pdo->LastInsertId();

    }
}

J'ai modifié ton code, mais il reste des erreurs.... surtout à la fin de ligne de certain "if".....

jjr
Auteur
Réponse acceptée

Bravo merci je n'ai plus que des erreurs de parsage je vais essayer de les réctifier seul car je débute. je vais également essayer d'étudier de plus près ce que tu as modifié, ouf une semaine de perdu mais 10 de retrouvées.
A+

Bonsoir,
Peut-on avoir le fichier "inc/db.php" car l'edrreur viens de là ?

Merci

jjr
Auteur

bien sûr voici:
<?php

$pdo = new PDO('mysql:dbname=stellar;host=localhost','root','');
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);

autant pour moi,
difficile à lire le code quand le bouton "</>" de l'éditeur n'est pas bien utiliser

Tu as fais ton require_once uniquement si les données $_POST ne sont pas vide. Alors à le test de "$errors" , il ne connais pas $pdo
Sors le de cette conditions et ça sera bon

jjr
Auteur

tu as l'air d'avoir trouvé la solution mais j'ai rien compris à la réponse qu'entends tu par sors le de cette condition je supprime la condition ou je ferme et j'ouvre une nouvelle balise php?????

non, tu as inclus ton fichier seulement si tu as des données.
Le test que tu fais sur $errors (d'ailleurs tu fais 2 fois le même test) doit être remis juste après avoir fait le test sur $user.

jjr
Auteur

Ecoute je suis navré et embêter je vais essayer de te dire ce que je comprende de ta réponse: je "require" DB.php seulement si j'ai posté des données. soit le pseudo, le mail et le password. Ok je comprends
Le test que je fais sur $errors c'est bien ça: if(empty($errors)){
je dois faire ce test juste après le if de $user. mais alors également après le if de $password et de $email, non??
Arf je suis largué!

bon courage

Salut,

Quand on dit " sortir de " c'est tout simplement prendre le morceau de code et le retirer de la condition ( if () { ... } else { ... } ). Le problème relevé par Carouge10 est que tu as besoin de faire des requêtes SQL sur ton site, pour faire ces requêtes il te faut le fichier " inc/db.php ". Mais en fait, ce fichier tu ne l'importes qu'après que quelqu'un ait cliqué pour lancer le formulaire.

Nous te conseillons de " sortir " la ligne require_once 'inc/db.php'; du if (!empty($_POST)){ et donc en encore plus clair, le coller en dessous de require_once'inc/functions.php'; ! ;)

Bon apprentissage !

jjr
Auteur

Merci pour tous ces conseils je vais les mettre en