Bonjour,

je recontre une erreur lorsque j'ajoute plus d'une requete SQL, je recontre l'erreur:

Lorsque je met une seule requete préparé cela fonctionne, et lorsque j'en met plus d'une... L'erreur se produit.

UsersController.php

<?php
namespace App\Controller;

use \Core\Auth\DBAuth;
use \Core\HTML\Form;
use \App;

class UsersController extends AppController{

    public function login(){

        $errors = false;

        if(!empty($_POST)){

            $auth = new DBAuth(App::getInstance()->getDb());
            if($auth->login($_POST['username'], $_POST['password'])){

                $_SESSION['logged'] = true;
                header('Location:index.php?page=admin.posts.index');

            }else{

                $errors = true;

            }

        }

        $form = new Form($_POST);

        $this->render('users.login', compact('form', 'errors'));
    }

    public function register(){

        $errors = false;

        if(!empty($_POST)){

            $auth = new DBAuth(App::getInstance()->getDb());

            //TEST PASS == PASSREP et user pas utilisé et email pas utilisé
            $user = $auth->register($_POST['username'], $_POST['email'], $_POST['password'], $_POST['passwordrepeat']);

            if($user){

                header('Location:index.php?page=admin.posts.index');

            }else{

                $errors = var_dump($user);

            }

        } 

        $form = new Form($_POST);

        $this->render('users.register', compact('form', 'errors')); 

    }

    public function logout(){

        session_destroy();

        header("Location:?page=posts.index");

        exit();
    }

}

DBauth.php

<?php

namespace Core\Auth;

use Core\Database\Database;
use Core\Database\MysqlDatabase;
class DBAuth{

    private $db;

    public function __construct(Database $db){

        $this->db = $db;

    }

    public function getUserId(){

        if($this->logged()){

            return $_SESSION['auth'];
        }

        return false;
    }

    /**
    * @param $username
    * @param $password 
    * @return true
    */

    public function login($username, $password){

        $user = $this->db->prepare('SELECT * FROM users WHERE username = ?', [$username], null, true);

        if($user){

            if($user->password === sha1($password)){

                $_SESSION['auth'] = $user->id;

                return true;
            }

        return false;
        }

    }

    public function register($username, $email, $password, $passwordrepeat){

        $user = $this->inspect($username, $email);

        if($user){

            return false;

        }else{

            if($password === $passwordrepeat){

                $pass = sha1($password);

                $insertion = $this->db->prepare("INSERT INTO users SET (username, email, password) VALUES '?, ?, ?)", [$username, $email, $pass], null, true);

                $id = $this->getIdRegister();

                $_SESSION['auth'] = $id;

            }

        } 

        return true;
    }

    public function getIdRegister($username){

        $user = $this->db->query("SELECT * FROM users WHERE username = {$username}");

         $id = $user->id;
         $user->closeCursor();
         return $id;
    }

    public function inspect($username, $email){

        $match = $this->db->prepare("SELECT * FROM users WHERE username = ? AND email = ?", [$username, $email], null, true);
        $result = $match;
        $match = null;
        return $result;

    }

    public function logged(){

        return isset($_SESSION['auth']);
    }

}

MysqlDatabase.php

<?php
namespace Core\Database;
use \PDO;
class MysqlDatabase extends Database{

    private $dbName;
    private $dbUser;
    private $dbPass;
    private $dbHost;

    private $pdo;

    public function __construct($dbName, $dbUser = 'root', $dbPass = 'pass', $dbHost = 'localhost'){
        $this->dbName = $dbName;
        $this->dbUser = $dbUser;
        $this->dbPass = $dbPass;
        $this->dbHost = $dbHost;
    }

    private function getPDO(){

        if($this->pdo === null){

                $pdo = new PDO('mysql:dbname=....;host=localhost', 'root', '....');
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                return $this->pdo = $pdo;

        }else{

          return $this->pdo = $pdo;

        }
    }

    public function query($statement, $className = null, $one = false){

        $req = $this->getPDO()->query($statement);

        if(
            strpos($statement, 'UPDATE') === 0 || 
            strpos($statement, 'INSERT') === 0 ||
            strpos($statement, 'DELETE') === 0

        ){
            return $req;
        }

        if($className === null){

            $req->setFetchMode(PDO::FETCH_OBJ);

        }else{

            $req->setFetchMode(PDO::FETCH_CLASS, $className);

        }

        if($one){
            $datas = $req->fetch();
        }else{
            $datas = $req->fetchAll();
        }

        return $datas;
    }

    public function prepare($statement, $attributes, $className = null, $one = false){

        $req = $this->getPDO()->prepare($statement);

        $res = $req->execute($attributes);

        if(strpos($statement, 'UPDATE') === 0 || 
            strpos($statement, 'INSERT') === 0 || 
            strpos($statement, 'DELETE') === 0
        ){    
            return $res;

        }

        if($className === null){

            $req->setFetchMode(PDO::FETCH_OBJ);

        }else{

            $req->setFetchMode(PDO::FETCH_CLASS, $className);

        }

        if($one){

            $datas = $req->fetch();

        }else{

            $datas = $req->fetchAll();
        }

        return $datas;
    }
}

register.php

<?php if($errors): ?>

    <p>Identifiants Incorrect</p>

<?php endif; ?>
<form method='post'>

    <?= $form->input('username', 'Pseudo', ['type' => 'text']); ?>
    <?= $form->input('email', 'Email', ['type' => 'email']); ?>
    <?= $form->input('password', 'Password', ['type' => 'password']);?>
    <?= $form->input('passwordrepeat', 'Confirmation Password', ['type' => 'password']);?>

    <button style="width:100%; height:30px">Register</button>

</form>

En vous remerciant d'avance ! <3

2 réponses


Lartak
Réponse acceptée

Bonsoir.
Ton problème vient de ta fonction getPDO.

private function getPDO() {
    if ($this->pdo === null) {
        $pdo = new PDO('mysql:dbname=....;host=localhost', 'root', '....');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $this->pdo = $pdo;
    } else {
        return $this->pdo = $pdo;
    }
}

Tu commences par vérifier si la propriété pdo est définie, la première fois elle ne l'est pas tu la définie donc via une variable nommée pdo, jusque là pas de problème, par contre la seconde fois la propriété est définie, sauf que tu la redéfinie via la variable pdo qui n'est pas définie, du coup lorsque tu retournes la propriété pdo elle n'est plus définie.
C'est d'ailleurs ce que te dit le message d'erreur :

Undefined variable pdo in ...MysqlDatabase.php on line 30

Je te recommenderais donc plutôt de remplacer le code de la fonction par ce qui suit :

if ($this->pdo === null) {
    $pdo = new PDO('mysql:dbname=....;host=localhost', 'root', '....');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $this->pdo = $pdo;
}
return $this->pdo;    
Yeypiz
Auteur

je te remercie j'essaye des ce soir et je te tiens au courant !