Bonjour,
j'ai un petit souci depuis la minute 26, j'ai remarqué que si je ne mets pas dans Post.php public $table="posts", la requete sql est : SELECT * FROM as Post WHERE id=1, il manque la $table... et la page est suivi de l'erreur

Fatal error: Call to a member function prepare() on a non-object in /home/httpd/vhosts/sarah.ch/subdomains/one/httpdocs/core/Model.php on line 4

J'ai bien essayé de placer un $pdo = new PDO(); sans résultat.

Si qqn peut m'aider, cela fait plusieurs fois que je me repasse la vidéo pour trouver ce que je fais de faux -_-

Model.php :

<?php
class Model {
static $connections = array();
public $conf = 'default';
public $table = false;
public $db;
public function __construct(){
//connexion BDD
$conf = Conf::$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')
);
Model::$connections$this->conf] = $pdo;
$this->db = $pdo;
}
catch(PDOException $e){
if(Conf::$debug >= 1){
die($e->getMessage());
}
else {
die('impossible de se connecter a la BDD');
}
}
//initialisation des variables
if($this->table === false){
$this->table = strtolower(get_class($this)).'s';
}
}
public function find($req){
$sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';
if(isset($req'conditions'])){
$sql .= 'WHERE '.$req'conditions'];
}
print_r($sql);
$pre = $this->db->prepare($sql);
$pre->execute();
return $pre->fetchAll(PDO::FETCH_OBJ);
}
public function findFirst($req) {
return current($this->find($req));
}
}
?>

PagesController.php

<?php
class PagesController extends Controller {

function view($id) {
$this->loadModel('Post');
$post = $this->Post->findFirst(array(
'conditions' => 'id='.$id
));
if(empty($post)){
$this->e404('page introuvable');
}else{
$this->set('post',$post);
}
}

}
?>

Post.php

<?php
class Post extends Model {
//pour charger une autre db : public $db = 'blog';
//public table='nomdelatable si pluriels faux';
//public $table='posts';
function __construct(){
}

}
?>

Merci de votre aide, et un tout grand merci au réalisateur !

5 réponses


davidperroud
Auteur
Réponse acceptée

Bon, je n'ai pas trouvé mon erreur... MAIS j'ai repris la vidéo depuis le début, en faisant bien attention à toutes les virgules etc. et CELA FONCTIONNE, donc le problème est réglé et le code fonctionne bien comme il a été démontré :).

Je m'attèle à la suite :).

Salut. tu dois mettre ce code la au début de la function __construct()

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

Alors tout d'abord merci bien à RedaElkhayat qui ma mis sur la voie, mais cela fonctionne seulement si je mets le code dans la class Post extends Model et non dans la class Model directement, mais ça fonctionne :),
par contre j'ai toujours la même erreur :

Fatal error: Call to a member function prepare() on a non-object in /home/httpd/vhosts/sarah.ch/subdomains/one/httpdocs/core/Model.php on line 49

et ma ligne 49 est :

public function find($req){
        $sql = 'SELECT * FROM '.$this->table.' as '.get_class($this).' ';
        if(isset($req'conditions'])){
            $sql .= 'WHERE '.$req'conditions'];
        }
        print_r($sql);
        $pre = $this->db->prepare($sql);// VOICI LA LIGNE 49
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

Il me semble avoir lu sur un post qu'il faut ajouter $pdo = new PDO(); mais je ne vois pas où,
et ne suis pas certain que le problème vienne de là, puisque cette ligne n'est pas dans la vidéo.

Merci encore.

Alor,je crois que le problème vient de cette partie dans le constructeur

if(isset(Model::$connections$this->conf])){
$this->db = Model::$connections$this->conf];
return true;
}

au lien de mettre Model::$connections, il faut le remplacer avec self::$connections vu que tu as toujours dans la même class.

Merci de ta réponse, mais cela n'a rien changé... J'ai essayé de le déplacer dans le model Post.php, sans plus de résultat.
Je sens que je vais recommencer la vidéo, pour voir où j'ai du me tromper entre le model général Model.php et le model Post.php
j'ai du louper quelque chose... -_- mais ce ne sera pas pour ce soir malheureusment.

Merci de ton aide en tous les cas.