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

Par titilgc, il y a 13 ans


Bonjour,

J'avais posté " Jour 4 problême "Undefined property: Post::$pdo in..." & "Call ...", mais le problème persiste.
L'erreur n'est plus la même mais je n'arrive pas à trouver la solution.

Erreur : Call to a member function prepare() on a non-object

Model.php :

<?php
class Model{

    static $connections = array();

    public $conf = 'default';
    public $table = false;
    public $db;
    public $pdo;

    public function __construct(){

        if($this->table === false){
        $this->table = strtolower(get_class($this)).'s';
        }

        $conf = Conf::$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;
        }catch(PDOException $e){
            if(Conf::$debug >= 1){
                die($e->getMessage());
            }else{
                die('Impossible de se connecter à la base de donnée');
            }
        }

    }
    public function find($req){
        $this->sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';
        if(isset($req'conditions'])){
            $this->sql .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $this->sql .= $req'conditions'];
            }else{
                $cond = array();
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_escape_string($v).'"';
                    }
                    $cond] = "$k=$v";
                }
                $this->sql .= implode(' AND ',$cond);
            }
        }
        $pre = $this->pdo->prepare($this->sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

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

Lorsque je retire

public $pdo;

J'ai l'ancienne erreur qui s'affiche " Notice: Undefined property: Post::$pdo in /home/cercleescrimegarennois/www/core/Model.php on line 52 Fatal error: Call to a member function prepare() on a non-object in /home/cercleescrimegarennois/www/core/Model.php on line 52"

Lorsque je remplace les $this->pdo par $pdo

J'ai l'erreur suivante qui apparait " Undefined variable: pdo in /home/cercleescrimegarennois/www/core/Model.php on line 53 Fatal error: Call to a member function prepare() on a non-object in /home/cercleescrimegarennois/www/core/Model.php on line 53

Si quelqu'un trouve la solution je le remercie d'avance.

17 réponses

luffysan, il y a 13 ans

Regarde si déjà tu as une connexion à la base de données.

titilgc, il y a 13 ans

Oui j'ai vérifier, sur la .../pages/render ou /pages/index.php même si elle n'existe pas tout fonctionne il y a juste sur /pages/view/... que sa ne fonctionne pas

mespeche, il y a 13 ans

As-tu vérifié le contenu de ta variable $this->pdo ?

De plus, il me semble que ta class Model devrait étendre de PDO : class Model extends PDO{ .... }

titilgc, il y a 13 ans

Je viens de changer

class Model {...}

pour

class Model extends PDO{ .... }

et cela ne fonctionne pas plus.

titilgc, il y a 13 ans

Lorsque je fais un echo $this->pdo;

J’obtient

Catchable fatal error: Object of class PDO could not be converted to string in /home/cercleescrimegarennois/www/core/Model.php on line 53
luffysan, il y a 13 ans

Tu dois faire un print_r pour voir ce qu'il y a dedans ou un var_dump.

titilgc, il y a 13 ans

Avec un print_r voici se que sa donne

PDO Object ( )

Et pour un var_dump sa donne sa

object(PDO)#7 (0) { }
luffysan, il y a 13 ans

Regarde ce que fait print_r( $this->PDO->errorInfo() );

titilgc, il y a 13 ans

Cela donne

Array ( [0] => 00000 [1] => [2] => )
titilgc, il y a 13 ans

Bonjour tout le monde,

Quelqu'un aurais une petite idée de se qui se passe pour que je puisse continuer le tutoriel.

Merci d'avance

Djiins, il y a 13 ans

voila ton code

public function find($req){
        $this->sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';
        if(isset($req'conditions'])){
            $this->sql .= 'WHERE ';<====== ya comme une différence ici 
            if(!is_array($req'conditions'])){
                $this->sql .= $req'conditions'];<======= ici aussi
            }else{
                $cond = array();
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_escape_string($v).'"';
                    }
                    $cond] = "$k=$v";
                }
                $this->sql .= implode(' AND ',$cond);<======= ici aussi
            }
        }
        $pre = $this->pdo->prepare($this->sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

voila le mien

public function find($req){
        $sql ='SELECT *FROM '.$this->table.' as ' .get_class($this).' ';
        if (isset($req'conditions'])) {
            $sql.='WHERE ';
            if (!is_array($req'conditions'])) {
                $sql.=$req'conditons'];
            }else{
                $cond=array();
                foreach ($req'conditions'] as $k => $v) {
                    if (!is_numeric($v)) {
                        $v='"'.mysql_escape_string($v).'"';
                    }

                    $cond] = "$k=$v";
                }
                $sql.= implode (' AND ', $cond);
            }
        }
        $pre =$this->db->prepare($sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

voila :) j'ai pas testé voir si ton code marche mais déjà corrige çà :)

Aureroy, il y a 13 ans

Pourquoi faire $this->sql ? C'est totalement inutile, cette variable n'a d'intérêt que dans cette fonction, remplace les $this->sql par $sql.
Je ne pense pas que se soit cela qui fasse buggé, essaye mais en tout cas tu gagneras en performence avec $sql

Djiins, il y a 13 ans

c'est exactement ce que j'ai souligné plus haut :)

titilgc, il y a 13 ans

Merci pour les réponses (j'avais plus de connection internet c pour sa que je n'ai pas répondu plus tôt)

Le $this->sql est là car sinon pas de connection à la base (l'erreur est celle-ci

Fatal error: Call to a member function prepare() on a non-object in /home/cercleescrimegarennois/www/core/Model.php on line 55 )

Sinon Djins j'ai essayer et cela ne fonctionne pas et si cela ne venais pas du code mais du serveur ??

Djiins, il y a 13 ans

oui tu peux tjrs reinstaller wamp voir si ca marche :)

arnich, il y a 13 ans

Un echo $sql donne quoi ?
La requete que tu construit est elle correcte ?

luffysan, il y a 13 ans

Je vois des réponse un peu bizarre de partout.
La faute est que $this->sql n'est pas un objet PDO.

Si comme tu dis la fonction PDO fonctionne mal à cause du serveur, ce que je te conseille de faire un test de base sur une page vierge.
C'est à dire tu fais juste un simple PDO et tu rééssaie de faire un prepare dessus.

// Du genre
$connectString = "Tu met ta chaine a la place";
$pdoInstance = PDO($connectString, [le reste]);
$req = "select * from table";
$pdoInstance->prepare($req);

Si tu vois que ça plante juste en faisant simple sur un script vierge alors tu as peut-être un problème serveur. Et là tu peux réinstaller ton wamp.