Bonjour !

J'essais de mettre en place un formulaire d'inscription et de connexion (inscription c'est fait, et tout fonctionne).

Par contre, pour la connexion, cela ne fonctionne pas, et me retourne 2 erreurs :

Notice: Undefined variable: pdo

Fatal error: Call to a member function prepare() on null

Voici mon code :

 if(!empty($_POST) && !empty($_POST['name']) && !empty($_POST['password']))
  {
    require_once '../functions/functions.php';

    $req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
    $req->execute(['username' => $_POST['name']]);
    $user = $req->fetch();

    if($user == null)
    {
        $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';

    }

    elseif(password_verify($_POST['password'], $user->password))
    { 
        require_once '..functions/db-connect.php';
        $_SESSION['auth'] = $user;
        $_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
        header('Location: ../index');
        exit();
    }

    else
    {
        $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
    }
}

J'ai donc pensé à un problème de variable non déclarée, et j'ai donc fait ça :

$pdo = 0;
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');

Mais là du coup, il me reproche d'avoir tenté d'intégrer un entier.

Donc j'ai essayé ça :

$pdo = NULL;
$req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');

Mais même problème, l'erreur en sortie est que je dois pas avoir de variable NULL :/

Quelqu'un aurait une solution, ou pourrait m'expliquer le soucis, que je ne refasse pas la même erreur à l'avenir ?

Merci d'avance pour vos futures réponses ;)

5 réponses


JeremieMeunier
Réponse acceptée

Donc en fait il faut que fasse :

$req = $db->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');

Il faut utiliser la variable que as nommé qui est $db et non $pdo

Bonjour,

Je suppose que $pdo est définie dans functions.php ?

Tiiix
Auteur

Bonsoir, merci de ta réponse ;)

Alors non, le pdo est appelé dans mon db-connect.php

le voici :

<?php

session_start();

$dbhost = 'localhost'; //Hôte
$dbname = 'site_wekod';     //Nom de la base
$dbuser = 'root';     //Utilisateur
$dbpswd = '';         //Mot de passe

try
{
    $db = new PDO('mysql:host='.$dbhost.';dbname='.$dbname,$dbuser,$dbpswd, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

}
catch(PDOexception $e)  
{
    die('Une erreur est survenue lors de la connexion avec la base de données');
}

???

ben... attends est-ce que tu demandes pourquoi ce genre de code ne fonctionne pas ?

$pdo = 0;
// donc :
$req = 0->prepare('SELECT...');

ou encore ?

$pdo = NULL;
// donc :
$req = NULL->prepare('SELECT...');

Quand même... :'(

Alors non, le pdo est appelé dans mon db-connect.php

Attention, s'il est défini seulement dans "db-connect.php", il ne le sera pas ailleurs,
il faut que tu arrives à "appeler" ton objet PDO depuis n'importe où.

J'ai donc pensé à un problème de variable non déclarée

en même temps... : "Notice: Undefined variable: pdo"

En tous cas ici, effectivement tu as raison.
Comme l'a montré @JeremieMeunier

Tiiix
Auteur

Bonjour, merci pour vos réponses. J'ai pas encore suffisamment d'expérience en orienté objet pour avoir la logique dans la construction de mon code, désolé :/

Je crois avoir compris mon erreur, en effet je n'appellais pas $db mais $pdo qui n'était pas déclaré dans mon db-connect.php

J'essais ça