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.