Bonjours, j'ai un petit soucis avec ma page view.php, celle ci ne s'affiche pas et en lieu et place j'ai deux call stack.

( ! ) Notice: Trying to get property of non-object in C:\wamp\www\site\view\pages\view.php on line 1
Call Stack
#   Time    Memory  Function    Location
1   0.0004  370992  {main}( )   ..\index.php:0
2   0.0034  434440  Dispatcher->__CONSTRUCT( )  ..\index.php:9
3   0.0069  450360  Controller->render( )   ..\Dispatcher.php:15
4   0.0072  493816  require( 'C:\wamp\www\site\view\pages\view.php' )   ..\Controller.php:25
( ! ) Notice: Trying to get property of non-object in C:\wamp\www\site\view\pages\view.php on line 4
Call Stack
#   Time    Memory  Function    Location
1   0.0004  370992  {main}( )   ..\index.php:0
2   0.0034  434440  Dispatcher->__CONSTRUCT( )  ..\index.php:9
3   0.0069  450360  Controller->render( )   ..\Dispatcher.php:15
4   0.0072  493816  require( 'C:\wamp\www\site\view\pages\view.php' )   ..\Controller.php:25

sur ma page view je n'ai que deux echo

<h1> <?php echo $post->name; ?></h1> 

<?php echo $post->content; ?>

je présume que l'erreur ne doit pas être très grave mais malgré plusieurs vérifications basées sur les vidéo jour 2 et 3, je ne trouve pas où j'ai bien pu faire une erreur.

17 réponses


Déjà un élément de réponse : d'après l'erreur "Trying to get property of non-object", c'est parce que tu fais $post-> pour PHP ce n'est pas un objet, essaye de faire debug($post) pour voir le résultat, si ce n'est pas défini, c'est que tu as oublié de le définir dans ton PostsController.php

Si tu as un autre résultat et que tu ne le comprends pas, copie le sur le forum ;-)

$post n'est pas définit ou n'est pas l'objet que tu attend. Tu es sûr de bien avoir envoyer la variable ? un print_r de $post donne quoi ?

artipix
Auteur

alors en placant le debug($spost) dans le fichier pagesController.php comme ceci

<?php
class pagesController extends Controller{
    function view($id){

        $this->loadModel('Post');
        $post = $this->Post->findFirst(array(
            'conditions' => 'id=1'
            ));

            $this->set('post',$post);
        debug($post);
    }
}
?>

j'obtiens une erreur fatale :

( ! ) Fatal error: Call to undefined function debug() in C:\wamp\www\site\controller\pagesController.php on line 11
Call Stack
#   Time    Memory  Function    Location
1   0.0009  370992  {main}( )   ..\index.php:0
2   0.0047  434440  Dispatcher->__CONSTRUCT( )  ..\index.php:9
3   0.0053  442176  call_user_func_array ( )    ..\Dispatcher.php:14
4   0.0053  442360  pagesController->view( )    ..\Dispatcher.php:0

quand je fais un print_r à la place du debug, je n'ai rien qui s'affiche, je pense aussi que c'est la variable qui ne passe pas, pourtant jusque là tout passait correctement le problème vient vraiment à partir du moment où il faut transmettre la variable post au fichier view.php.

Bonjour,

Je suis actuellement en train de suivre cette série de tuto, et je suis confronté a la même erreur avec ma page view. J'ai beau suivre le tuto, je n'arrive a comprendre pourquoi ça ne passe pas. Une solution a t'elle été trouvée?

Sinon au passage, je tenais à remercier l'auteur de ce site, que j'ai découvert il n'y a pas longtemps, et qui m'aide tout les jours a m'améliorer en php.

Active l'affichage des erreurs au niveau des requêtes SQL pour voir si ça ne vient pas de là ?

Merci pour l'aide, mais je me suis décidé a retourner bosser les bases PHP, le tuto étant acutellement trop complexe pour moi je pense.

Bonne décision il faut bien comprendre les bases avant de vouloir aller trop loin :)

Tu as bien un id à 1 dans ta base de donnees?

Salut je suis dans le meme cas, sauf que dans je fait un print_r de($post) sa me retourne Array()

Bonjour,

Peut ton avoir ta function view du PagesController ?

Cordialement

Pareil je suis a la 25 min, et mon array() ne m'affiche rien lorsque je fais print_r($posts);

<?php
class pagesController extends controller{

    function view($id){
        $this->loadModel('post');
        $posts = $this->post->find(array(
        'conditions' => 'id=1'
        ));
        print_r($posts);
    }
}
?>

bon j'ai trouvé c'est tout con mais faut bien respecter les espaces dans $sql...

$sql = 'SELECT * FROM '.$this->table.'as'.get_class($this).'';

je vais les remplacer par des underscores pour bien les faire voir :

$sql = 'SELECT * FROM_'.$this->table.'_as_'.get_class($this).'';

et c'est bon problème résolu...

je vien de verifier c pas ma command sql le probleme.
PagesController

<?php
class PagesController extends Controller{

    function view($id){
        $this->loadModel('Post');
        $post = $this->Post->findFirst(array(
            'conditions' => 'id=1'
        ));
        $this->set('post',$post);
        print_r($post);     
    }
}

Model

<?php
class Model{
    static $connections = array();

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

    public function __construct(){
        // Je me connecte à la base
        $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 à la base de donnée');
            }
        }

        // J'initialise quelque variable
        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'];
        }
        $pre = $this->db->prepare($sql);
        $pre->execute();
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

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

Déjà une petite erreur que j'ai pu voir, je sais pas si sa va aidé

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

Tu n'as pas d'espace entre ton ' as '.get_class($this) et ton 'WHERE '

Essaye comme çà

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

J'ai juste rajouté un espace après ' as '.get_class($this).'
pour donné ' as '.get_class($this).' '

Effectivement Typhon a raison, si tu n'as pas l'espace à la fin de de '_as_'.get_class($this).'_';
met le au début de '_WHERE_'
je remplace "_ par espace"
visiblement la requete sql est super sensible aux espaces..

Yeah sa marche merci!!!

@MAD_Virus
bonjour j'ai le même problème , comment as tu réussi à t'en sortir?
merci