Bonjour,

Je suis actuellement entrain de suivre le tuto PHP et lors de la "ème vidéo (jour 3), j'ai rencontré des difficultés. En effet, j'obtient l'erreur : Undefined property-PagesController::$Post in ....PagesController.php on line 8
ainsi que Call to member function find() on a non-object in ....PagesController.php on line 8

Voila je remercie d'avance tout ceux qui pourront m'aider. Je tiens a préciser que j'ai continué a avancer dans le tutorial malgré l'erreur, Mais l'erreur correspond à peu près à la 20ème minute du tutorial 3. Je n'ai jamais réussi a faire apparaître les texte présent dans ma base de donnée.

Guillaume

Model

<?php
class Model{

static $connections = array();

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

public function __construct(){
//connection à la database
$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 NAME utf8')
);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

Model::$connections$this->db]=$pdo;
} catch(PDOException $e){
if(Conf::$debug >= 1){
die($e->getMessage());
}else{
die('impossible de se connecter à la base de donnée');
}
}
//j'initialise quelques 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).'';

//Construction de la condition
if(isset($req'conditions'])){
$sql.='WHERE';
if(!is_array($req'conditions'])){
$sql .=$req'conditions'];

}else{
$cond =array ();
foreach($req'condition']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);
}

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

}
}
?>

et donc ensuite mon page controller

<?php
class PagesController extends Controller{

function view($id){
$this->loadModel('Post');
$d'page'] = $this->Post->find(array('condition'=>array('id'=>$id,'type'=>'page')
));
if(empty($d'page'])){
$this->e404('page introuvable');
}
$d'pages'] =$this->Post->find(array('condition'=>array('type'=>'page')));
$this->set($d);
}

}
?>

et pour finir mon controller

<?php

/**
*controller
**/
class Controller{

public $Request; //Objet request
private $vars =array(); //Variable à passer à la vue
public $layout = 'default'; //Layout a utilisé pour rendre la vue
private $rendered =false; //Si le rendu visuelle a été fait ou pas. (Eviter les doublons d'affichage)

/**
*Constructeur
*@param $request Objet request de notre application
**/

function __construct($Request){
$this->Request = $Request; // On stock la request dans l'instance
}

/**
*Permet de rendre une vue
*@param $view fichier à rendre (chemin depuis view ou nom de la vue)
**/

public function render($view){
if($this->rendered){ return false; }
extract($this->vars);
if(strpos($view,'/')===0){
$view = ROOT.DS.'view'.$view.'.php';
}
else{
$view = ROOT.DS.'view'.DS.$this->Request->controller.DS.$view.'.php';
}
ob_start();
require ($view);
$content_for_layout = ob_get_clean();
require ROOT.DS.'view'.DS.'layout'.DS.$this->layout.'.php';
$this->rendered = true;
}

/**
*Permet de passer un ou plusieurs variable à la vue
*@param $keynom de la variable ou tableau de la variables
*@param $value valeur de la variable
**/

public function set($key,$value = null){
if(is_array($key)){
$this->vars += $key;
}
else{
$this->vars$key] = $value;
}
}

/**
*Permet de charger un model
**/

function loadModel($name){
$file = ROOT.DS.'model'.DS.$name.'.php';
require_once($file);
if(isset($this->$name)){
$this->$name = new $name();
}
}
/**
*Permet de gerer les erruer 404
**/

function e404($message){
header("HTTP:1.0 404 Not Found");
$this->set('message',$message);
$this->render('/errors/404');
die();
}

}
?>

4 réponses


Salut,

dans controller, je ne comprends pas le test
if(isset($this->$name)){
$this->$name = new $name();
}

en gros, ca crée le $this->$name ssi il existe deja. essaie en mettant if(!isset(....))

Eric

Salut,

J'ai vraiment suivit le tutorial à la lettre . J'ai essayer ce n'est pas sa.

Merci quand même

guillaume

salut
avez vous trouver une réponse j'ai le même problème ?
merci

Bonjour à tous. j'ai le même problème. avez vous trouvé une solution ?

Merci d'avance.