Bonjour,
j'ai un problème au niveau de la classe Model
Voici l'erreur:

Model.php :

<?php
class Model {
    static $connections = array();
    public $conf = 'default';
    public $table = false;
    public $primaryKey  = 'id';
    public $db;
    public $pdo;

    public function __contruct(){
        // j'initialise quelque variable
        if($this->table === false){
            $this->table = strtolower(get_class($this)).'s';
        }       
        // je me connecte a la base 
        $conf = Config::$databases$this->conf];
        if(isset(Model::$connections$this->conf])){
            $this->db   =   Model::$connections$this->conf];
            return true;
        }

        try{
            $this->pdo  = new PDO(
                    'mysql: host='.$conf'host'].';dbname='.$conf'database'],
                    $conf'login'],
                    $conf'password'],
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
            );

            $this->pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

            Model::$connections$this->conf] = $this->pdo;
            $this->db   = $this->pdo;
            return $this->db;
        }catch(PDOException $e){
            if(Config::$debug >= 1){
                die($e->getMessage());
            }else{
                die('Impossible de se connecter à la base de donnée');
            }
        }
    }

    public function find($req){
        $sql = 'SELECT ';
        if(isset($req'fields'])){
            if(is_array($req'fields'])){
                $sql .= implode(', ',$req'fields']);
            }else{
                $sql .= $req'fields'];
            }
        }else{
            $sql .= ' * ';
        }
        $sql .= ' FROM '.$this->table.' as '.get_class($this).' ';

        if(isset($req'conditions'])){
            $sql .= ' WHERE ';
            if(!is_array($req'conditions'])){
                $sql .= $req'conditions'];
            }else{
                $cond = array();
                foreach($req'conditions'] as $k => $v){
                    if(!is_numeric($v)){
                        $v  = '"'.mysql_real_escape_string($v).'"';
                    }

                    $cond]  = "$k=$v";
                }
                $sql .= implode(' AND ',$cond);
            }
        }
        if(isset($req'limit'])){
            $sql .= ' LIMIT '.$req'limit'];
        }
        // die($sql);
        // die(var_dump($this->db));
        $pre = $this->db->prepare($sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

    public function findFirst($req){
        return current($this->find($req));
    }

    public function findCount($conditions){
        $res    = $this->findFirst(array(
                        'fields' => 'COUNT('.$this->primaryKey.') as count',
                        'conditions'    => $conditions
                  ));
        return $res->count;
    }
}

J'ai suivi le tuto à la lettre et je l'ai refait 2 fois... Je ne comprends pas?
Quelqu'un sait ce qui ne va pas?
Merci

7 réponses


Salut,

l'erreur indique que tu utilise une fonction sur une variable qui n'est pas un objet donc cela veut dir que $this-db n'est pas un objet.

se qui est tout à fait normal :) car tu à mi contruct au lieu de construct à la ligne 11 se qui fait que ton objet Model de s'initialise pas et donc ne créer pas la variable db dans l'objet ;) normalement cela devrai marcher si tu rajoute le s :)

sa marche pas c tjrs le même message d'erreur
( ! ) Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\LaboMvc\mvc\AbriFramework\Model.php on line 79

Model.php :

<?php
class Model {
    static $connections = array();
    public $conf = 'default';
    public $table = false;
    public $primaryKey  = 'id';
    public $db;
    // public $pdo;

    public function __construct(){
        // j'initialise quelque variable
        if($this->table === false){
            $this->table = strtolower(get_class($this)).'s';
        }       
        // je me connecte a la base 
        $conf = Config::$databases$this->conf];
        if(isset(Model::$connections$this->conf])){
            $this->db   =   Model::$connections$this->conf];
            return true;
        }

        try{
            $pdo    = new PDO(
                    'mysql: host='.$conf'host'].';dbname='.$conf'database'],
                    $conf'login'],
                    $conf'password'],
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
            );

            $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

            Model::$connections$this->conf] = $pdo;
            $this->db   = $pdo;
            return $this->db;
        }catch(PDOException $e){
            if(Config::$debug >= 1){
                die($e->getMessage());
            }else{
                die('Impossible de se connecter à la base de donnée');
            }
        }
    }

    public function find($req){
        $sql = 'SELECT ';
        if(isset($req'fields'])){
            if(is_array($req'fields'])){
                $sql .= implode(', ',$req'fields']);
            }else{
                $sql .= $req'fields'];
            }
        }else{
            $sql .= ' * ';
        }
        $sql .= ' FROM '.$this->table.' as '.get_class($this).' ';

        if(isset($req'conditions'])){
            $sql .= ' WHERE ';
            if(!is_array($req'conditions'])){
                $sql .= $req'conditions'];
            }else{
                $cond = array();
                foreach($req'conditions'] as $k => $v){
                    if(!is_numeric($v)){
                        $v  = '"'.mysql_real_escape_string($v).'"';
                    }

                    $cond]  = "$k=$v";
                }
                $sql .= implode(' AND ',$cond);
            }
        }
        if(isset($req'limit'])){
            $sql .= ' LIMIT '.$req'limit'];
        }
        // die($sql);
        // die(var_dump($this->db));
        $pre = $this->db->prepare($sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

    public function findFirst($req){
        return current($this->find($req));
    }

    public function findCount($conditions){
        $res    = $this->findFirst(array(
                        'fields' => 'COUNT('.$this->primaryKey.') as count',
                        'conditions'    => $conditions
                  ));
        return $res->count;
    }
}

PostsController.php :

<?php
class PostsController extends AbriController {

    function index(){
        $perPage    = 1;
        $this->loadModel('Post');
        $condition = array('online' => 1, 'type' => 'post');
        $d'posts'] = $this->Post->find(array(
            'conditions'    => $condition,
            'limit' => ($perPage * ($this->request->page-1)).','.$perPage
        ));
        $d'total'] = $this->Post->findCount($condition);
        $d'page'] = ceil($d'total']/$perPage);
        $this->set($d);
    }

    function view($id){
        $this->loadModel('Post');
        $d'page'] = $this->Post->findFirst(array(
            'conditions'    => array('online' => 1, 'type' => 'post')
        ));
        if(empty($d'page'])){
            $this->e404('Page introuvable');
        }
        $this->set($d);
    }
}

ça marche pas tjrs

<u><strong>J'ai suivi le tuto à la lettre et je l'ai refait 2 fois</strong></u>

Tu a fait des modification?

car dans ton PostsController tu à :

class PostsController extends AbriController {

alors que sa devrai être :

class PostsController extends Controller {

si tu à fait d'autre modification faudrait nous le dir :) car on peut pas savoir les modifs que tu à faite :)

j'ai changer seulement le nom du Controller principale j'ai fait aucune autre modification

ok donc est ce que tu peut mettre ceci :

debug($this->db);
        die();
         $pre = $this->db->prepare($sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);

cela permettra de voir si le model initialise bien PDO

sa ma afficher plein de truc si tu veux je peut t'envoyer le lien pour télécharger mon script

oki pour le lien mais je ne pourrai pas te le faire durant 2 jour par contre donc si tu arrive à trouver d'ici la san problème sinon tkt je regarde :)