Bonjour,

Voila je rencontre un petit problème avec mon code.

En fait, tout a arrêté de fonctionner lors de la création de la fonction query dans la classe Table.
Je vais vous donner tout le code qui est touché par les erreurs :

<?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 = end(strtolower($class_name . 's'));
        }
        return static::$table;
    }

    public static function find($id)
    {
        return App::getDb()->prepare('SELECT * FROM ' . static::getTable() . ' WHERE id = ?', [$id], get_called_class(), true);
    }

    public static function query($statement, $attributes = null, $one = false)
    {
        if($attributes)
        {
            return App::getDb()->prepare($statement, $attributes, get_called_class(), $one);
        }
        else
        {
            return App::getDb()->query($statement, get_called_class(), $one);
        }
    }
    public static function all()
    {
        return App::getDb()->query("SELECT * FROM " . static::$table . "", get_called_class());
    }

    public function __get($key)
    {
        $method = 'get' . ucfirst($key);
        $this->$key = $this->$method();
        return $this->$key;
    }

}
<?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_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=' . $this->db_name . ';host=' . $this->db_host . '', $this->db_user, $this->db_pass);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo = $pdo;
        }
        return $this->pdo;
    }

    public function query($statement, $class_name, $one = false)
    {
        $req = $this->getPDO()->query($statement);
        $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, $one = false )
    {
        $req = $this->getPDO()->prepare($statement);
        $req->execute($attributes);
        $req->setFetchMode(PDO::FETCH_CLASS, $class_name);
        if($one)
        {
            $datas = $req->fetch();
        }
        else
        {
            $datas = $req->fetchAll();
        }

        return $datas;
    }

}

Page article

<?php 
use App\App;
use App\Table\Article;
use App\Table\Categorie;
$post = Article::find($_GET['id']);
if($article === false)
{
    App::notFound;
}
$categorie = Categorie::find($post->category_id);
?>

<h1><?= $post->titre; ?></h1>
<p><em><?= $categorie->id; ?></em></p>
<p><?= $post->contenu; ?></p>

J'aimerais comprendre pourquoi ça arrive et comment résoudre ces erreurs !

Voici mes erreurs :

Mes erreurs

Merci d'avance et si vous avez besoin de plus de précision, n'hésitez pas ! :)

4 réponses


betaWeb
Réponse acceptée

Salut,

Tu passes vraisemblablement une String alors que le typage attendu est un Array. Après, les partials de code que tu nous a founi ne nous avance pas vraiment puisque c'est la methode find() de la classe Table qui a un souci.

SLK
Réponse acceptée

Salut,

je me suis arrêté à cette ligne, qui est étrange :

class Table
{
    ...

    private static function getTable()
    {
        ...
        static::$table = end(strtolower($class_name . 's'));
        ...
    }

    ...
}

J'imagine qu'il manque un "new"

En plus ce n'est pas end() dont tu veux te servir.
Regardes t'as 3ème erreur.
Elle dit que end() attends un tableau en paramètre, alors que tu lui donne une chaine.
Du coup on tappe sur google "php end"
http://php.net/manual/fr/function.end.php
Et on se rend compte que ce n'est pas du tout cette fonction qu'on veut.

Salut, merci de ta réponse !

Voici la méthode find() :

    public static function find($id)
    {
        return App::getDb()->prepare('SELECT * FROM ' . static::getTable() . ' WHERE id = ?', [$id], get_called_class(), true);
    }

Et le code :

use App\App;
use App\Table\Article;
use App\Table\Categorie;
$post = Article::find($_GET['id']);
if($article === false)
{
    App::notFound();
}
$categorie = Categorie::find($post->category_id);
?>

<h1><?= $post->titre; ?></h1>
<p><em><?= $categorie->id; ?></em></p>
<p><?= $post->contenu; ?></p>

Salut !

Ça venait effectivement du getTable()..
On dirait qu'il ne marche pas, je dois définir ma variable $table dans chaque classe !

Bref, merci à vous deux, vous m'avez beaucoup aidé ! :)