Bonjour, j'ai un soucis avec l'affichage de mon tableau :
    <div class="col-sm-4">
        <ul>
            <?php foreach(\App\Table\Categorie::all() as $categorie): ?>
                <li><a href="<?= $categorie->url; ?>"><?= $categorie->titre; ?></a></li>
            <?php endforeach; ?>
        </ul>
    </div>


Erreur afficher Smiley decu Fatal error: Call to a member function query() on null in C:\wamp64\www\Blog\App\Table\Table.php on line 18).

Ma classe categorie:
<?php
namespace App\Table;

use App\App;
class Categorie extends Table{

    protected static $table ='categories';


    public function getURL(){
        return 'index.php?p=categorie&id='.$this->id;
    }


}


et enfin ma classe Table :
<?php
namespace App\Table;

use App\App;
class Table {

    protected static $table;

    private static function getTable(){
        if(static::$table === null){
            $class_name = explode('\\',get_called_class());
            static::$table = strtolower(end($class_name)).'s' ;
        }
        return static::$table;
    }

    public static function all(){
        return App::getDB()->query("
            SELECT *
            FROM  {static::getTable()} 
            ",get_called_class());
    }
    
    public function __get($key){
        $method = 'get' . ucfirst($key);
        $this->$key =$this->$method();
        return $this->$key;
    }


}
Bonsoir,
C'est plus du coté de App qu'il faudrait regarder, puisque c'est sa méthode static getDB qui retourne null et non une instance.
Ça ressemble à un framework, n'avez-vous pas accès, via une méthode ou un log, aux dernières erreurs ?
Merci de votre réponse. Je suis un tutoriel et j’apprends justement doucement a gérer les fonctions static. Aucune utilisation de framework.

voici le contenu de mon fichier App avec la méthode getDB :
<?php
namespace App;

class App{

    const DB_NAME = 'blog';
    const DB_USER = 'root';
    const DB_PASS = '';
    const DB_HOST = '127.0.0.1';

    private static $database;

    public static function getDB(){
        if(self::$database===null) {
            self::$database = new Database(self::DB_NAME,self::DB_USER,self::DB_PASS,self::DB_HOST);
            return self::$database;
        }


    }
}

Modifié par Max1911 (19 Apr 2017 - 17:45)
C'est du grafikart, non ?

Le return ne doit pas être dans le if, mais après (sans quoi, cela fonctionne au 1er appel, mais les appels suivants ne retournent rien).
Exact c'est du Grafikart.

Il me semble avoir déjà essayé mais malheureusement cela me retourne deux nouvelles exeptions :
Notice: Undefined variable: pdo in C:\wamp64\www\Blog\App\Database.php on line 27
et
Fatal error: Call to a member function query() on null in C:\wamp64\www\Blog\App\Database.php on line 31
cela correspond a ma function getPDO
    public function getPDO(){
        if($this->pdo === null) {
            $pdo = new PDO('mysql:dbname=blog;host=127.0.0.1', 'root', '');
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo = $pdo;
        }
        return $pdo;
    }



mon fichier Database :
<?php
namespace App;

use \PDO;
class 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_pass=$db_pass;
        $this->db_user=$db_user;
        $this->db_host=$db_host;
    }

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

    public function query($statement, $class_name){
        $req = $this->getPDO()->query($statement);
        $data = $req->fetchAll(PDO::FETCH_CLASS, $class_name);
        return $data;
    }

    public function prepare ($statement, $attributes, $class_name, $one = false){
        $req = $this->getPDO()->prepare($statement);
        $req->execute($attributes);
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        if($one){
            $data=$req->fetch();
        }else{
        $data = $req->fetchAll();
        }
            return $data;
    }
}
Le message d'erreur est pourtant clair : dans getPDO, c'est return $this->pdo, et non pas return $pdo puisque $pdo n'existe pas si on ne passe pas dans le if.

getPDO est un peu inutile d'ailleurs, il a déjà limité l'instanciation de Database, autant instancier PDO dans le constructeur et se passer de cette méthode.
salut,

au passage, les identifiants passer au constructeur ne sont pas utilisés (test ?)
$pdo = new PDO('mysql:dbname=blog;host=127.0.0.1', 'root', '');

devrait être

$pdo = new PDO('mysql:dbname='..$this->db_name';host='.$this->db_host, $this->db_user,$this->db_pass);

il est d'ailleurs possible de se passer de la variable intermédiaire

$this->pdo = new PDO('mysql:dbname='..$this->db_name';host='.$this->db_host, $this->db_user,$this->db_pass);
 $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)

@+