Site de A à Z - Jour 4 Call to a member function prepare() "

Par amineabri, il y a 13 ans


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

ksta, il y a 13 ans

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 :)

amineabri, il y a 13 ans

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

ksta, il y a 13 ans

<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 :)

amineabri, il y a 13 ans

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

ksta, il y a 13 ans

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

amineabri, il y a 13 ans

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

ksta, il y a 13 ans

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 :)