Bonjour à tous,

Désolé pour le titre non explicite, j'ai du faire court à 3 reprises
Voila je rencontre un petit problème avec mon code.

Je suis entrain de suivre la formation "la POO en PHP" à la page suivante https://www.grafikart.fr/tutoriels/tp-backend-573
Je suis coincé au debut del a vidéo au niveau de l'identification. Au niveau de l'envoi du formulaire d'identification, j'ai la réponse suivante :
Fatal error: Uncaught Error: Call to a member function prepare() on null

J'ai fait différents var_dump et j'obtiens les résultats suivant :

object(App)#1 (2) {
  ["title"]=>
  string(37) "Nathurovie, la nature à tout compris"
  ["db_instance":"App":private]=>
  NULL
}
object(Core\Auth\DBAuth)#2 (1) {
  ["db":"Core\Auth\DBAuth":private]=>
  NULL
}

Fatal error:  Uncaught Error: Call to a member function prepare() on null in C:\EasyPHP\eds-www\blog\core\auth\DBAuth.php:28
Stack trace:
#0 C:\EasyPHP\eds-www\blog\pages\users\login.php(12): Core\Auth\DBAuth->login('demo', 'demo')
#1 C:\EasyPHP\eds-www\blog\public\index.php(22): require('C:\\EasyPHP\\eds-...')
#2 {main}
  thrown in C:\EasyPHP\eds-www\blog\core\auth\DBAuth.php on line 28

Voici mon code :
admin.php

<?php
define('ROOT', dirname(__DIR__));
require ROOT . '/app/App.php';
App::load();
use Core\Auth\DBAuth;

if(isset($_GET['p'])){
    $page = $_GET['p'];
}else{
    $page= 'home';
}

//Auth
$app =App::getInstance();
$auth = new DBAuth($app->getDb());
if (!$auth->logged()){
    $app->fordiben();
}

ob_start();
if ($page === 'home')
{
    require ROOT . '/pages/admin/posts/index.php';
}else if ($page === 'post.category'){
    require ROOT . '/pages/admin/posts/category.php';
}else if ($page === 'post.read'){
    require ROOT . '/pages/admin/posts/read.php';
}
$content = ob_get_clean();
require ROOT . '/pages/templates/default.php';

Login.php

<?php

use Core\Auth\DBAuth;
use Core\HTML\BootstrapForm;
if(!empty($_POST))
{
    $app =App::getInstance();
    echo '<pre>';var_dump($app); echo'</pre>';
    $auth = new DBAuth($app->getDb());
    echo '<pre>';var_dump($auth); echo'</pre>';
    echo '<pre>';var_dump($auth->login($_POST['username'], $_POST['password'])); echo'</pre>';
    die();
    if($auth->login($_POST['username'], $_POST['password'])){
        header ('location:admin.php');
    }else{
        echo'<div class="alert alert-danger"> Identifiants incorrects</div>';
    }
}
$form = new BootstrapForm($_POST);
?>
<form action="" method="post">
    <?= $form->input('username', 'Pseudo');?>
    <?= $form->input('password', 'Mot de passe', ['type' => 'password']);?>
    <button class="btn btn-primary">Envoyer</button>
</form>

DBAuth.php

<?php

namespace Core\Auth;
use Core\Database\Database;

class DBAuth{

    private $db;

    public function __construc(Database $db){

        $this->db=$db;
    }

    public function getUserId(){
        if($this->logged()){
            return $_SESSION['auth'];
        }
        return false;

    }
    /**
    * @param $username
    * @param $password
    * @return boolean
    */
    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;
    }

    /**
    * @return boolean
    */
    public function logged (){
        return isset($_SESSION['auth']);        
    }

MysqlDatabase.php

<?php

namespace Core\Database;
use \PDO;
/**
 * 
 */
class MysqlDatabase extends Database{

    private $db_name;
    private $db_user;
    private $db_pass;
    private $db_host;
    private $pdo;

    public function __construct($db_name,$db_user ='root', $db_pass ='', $db_host='localhost')
    {
        $this->db_name =$db_name;
        $this->db_user =$db_user;
        $this->db_pass =$db_pass;
        $this->db_host =$db_host;

    }

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

    public function query($statement, $class_name=null, $one=false){
        $req = $this->getPDO()->query($statement);
        if ($class_name === null){
            $req->setFetchMode(PDO::FETCH_OBJ);
        }else{
            $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        }
        if($one){
            $datas = $req->fetch();
        }else{
            $datas = $req->fetchAll();
        }
        return $datas;
    }

    public function prepare($statement, $attributes, $class_name=null, $one=false){
        $req=$this->getPDO()->prepare($statement);
        $req->execute($attributes);
        if ($class_name === null){
            $req->setFetchMode(PDO::FETCH_OBJ);
        }else{
            $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        }
        if($one){
            $datas = $req->fetch();
        }else{
            $datas = $req->fetchAll();
        }
        return $datas;
    }
}

Ca fait 2 jours que je cherche une solution, mais je n'arrive pas à trouver. Surement quelque chose de trop évident.
Quelqu'un pourrait m'aider ?
D'avance merci.

1 réponse


Bon pour une raison que je n'ai pas encore trouvée et après avoir réécris le code à plusieurs reprises, la connexion à la BD demandée pour les fonctions query et prepare de ma page DBAuth.php ne fonctionne pas. Le lastinster oui ....
Du coup j'ai tout mis dans la page Table.php et tout fonctionne.

Si quelqu'un a une idée, je suis preneur.

MErci.

Pour une raison