page 223 Trying to get property of non-object

Hi,

I am having some trouble with Chapter 9 of the book. Instead of getting the comments form on the issue listing page, I get a PHP notice: Trying to get property of non-object.

Here is the complete stacktrace:




PHP notice


Trying to get property of non-object


/home/deridder/NetBeansProjects/trackstar/protected/views/issue/_comments.php(5)


01 <?php foreach($comments as $comment): ?>

02 <div class="comment">

03     <div class="author">

04         

05         <?php echo $comment->author->username; ?>:

06     </div>

07     

08     <div class="time">

09         on <?php echo date('F j, Y \a\t h:i:a', strtotime($comment->create_time)); ?>

10     </div>

11     

12     <div class="content">

13         <?php echo nl2br(CHtml::encode($comment->content)); ?>        

14     </div>

15     <hr>

16     

17 </div> <!-- comment -->


Stack Trace

#0 	

+

 /home/deridder/yii/framework/web/CBaseController.php(127): require("/home/deridder/NetBeansProjects/trackstar/protected/views/issue/...")

#1 	

+

 /home/deridder/yii/framework/web/CBaseController.php(96): CBaseController->renderInternal("/home/deridder/NetBeansProjects/trackstar/protected/views/issue/...", array("comments" => array(Comment, Comment, Comment, Comment)), true)

#2 	

+

 /home/deridder/yii/framework/web/CController.php(870): CBaseController->renderFile("/home/deridder/NetBeansProjects/trackstar/protected/views/issue/...", array("comments" => array(Comment, Comment, Comment, Comment)), true)

#3 	

–

 /home/deridder/NetBeansProjects/trackstar/protected/views/issue/view.php(40): CController->renderPartial("_comments", array("comments" => array(Comment, Comment, Comment, Comment)))


35     <?php if($model->commentCount>=1): ?>

36     <h3>

37         <?php echo $model->commentCount>1 ? $model->commentCount.'comments' : 'One comment'; ?>

38     </h3>

39     

40     <?php $this->renderPartial('_comments', array('comments'=>$model->comments,)); ?>    

41     <?php endif; ?>

42     

43     <h3>Leave a comment</h3>

44     

45     <?php if (Yii::app()->user->hasFlash('commentSubmitted')): ?>


#4 	

+

 /home/deridder/yii/framework/web/CBaseController.php(127): require("/home/deridder/NetBeansProjects/trackstar/protected/views/issue/...")

#5 	

+

 /home/deridder/yii/framework/web/CBaseController.php(96): CBaseController->renderInternal("/home/deridder/NetBeansProjects/trackstar/protected/views/issue/...", array("model" => Issue, "comment" => Comment), true)

#6 	

+

 /home/deridder/yii/framework/web/CController.php(870): CBaseController->renderFile("/home/deridder/NetBeansProjects/trackstar/protected/views/issue/...", array("model" => Issue, "comment" => Comment), true)

#7 	

+

 /home/deridder/yii/framework/web/CController.php(783): CController->renderPartial("view", array("model" => Issue, "comment" => Comment), true)

#8 	

–

 /home/deridder/NetBeansProjects/trackstar/protected/controllers/IssueController.php(111): CController->render("view", array("model" => Issue, "comment" => Comment))


106         #));

107                 

108                 # changes made on page 220

109                 $issue = $this->loadModel($id);

110                 $comment = $this->createComment($issue);

111                 $this->render('view', array('model'=>$issue, 'comment'=>$comment,));

112     }

113 

114     /**

115      * Creates a new model.

116      * If creation is successful, the browser will be redirected to the 'view' page.


#9 	

 unknown(0): IssueController->actionView("1")

#10 	

+

 /home/deridder/yii/framework/web/actions/CAction.php(107): ReflectionMethod->invokeArgs(IssueController, array("1"))

#11 	

+

 /home/deridder/yii/framework/web/actions/CInlineAction.php(48): CAction->runWithParamsInternal(IssueController, ReflectionMethod, array("r" => "issue/view", "id" => "1"))

#12 	

+

 /home/deridder/yii/framework/web/CController.php(309): CInlineAction->runWithParams(array("r" => "issue/view", "id" => "1"))

#13 	

+

 /home/deridder/yii/framework/web/filters/CFilterChain.php(134): CController->runAction(CInlineAction)

#14 	

+

 /home/deridder/yii/framework/web/filters/CFilter.php(41): CFilterChain->run()

#15 	

+

 /home/deridder/yii/framework/web/CController.php(1146): CFilter->filter(CFilterChain)

#16 	

+

 /home/deridder/yii/framework/web/filters/CInlineFilter.php(59): CController->filterAccessControl(CFilterChain)

#17 	

+

 /home/deridder/yii/framework/web/filters/CFilterChain.php(131): CInlineFilter->filter(CFilterChain)

#18 	

+

 /home/deridder/yii/framework/web/CController.php(292): CFilterChain->run()

#19 	

+

 /home/deridder/yii/framework/web/CController.php(266): CController->runActionWithFilters(CInlineAction, array("accessControl", "projectContext + create index admin"))

#20 	

+

 /home/deridder/yii/framework/web/CWebApplication.php(276): CController->run("view")

#21 	

+

 /home/deridder/yii/framework/web/CWebApplication.php(135): CWebApplication->runController("issue/view")

#22 	

+

 /home/deridder/yii/framework/base/CApplication.php(162): CWebApplication->processRequest()

#23 	

–

 /home/deridder/NetBeansProjects/trackstar/index.php(13): CApplication->run()


08 defined('YII_DEBUG') or define('YII_DEBUG',true);

09 // specify how many levels of call stack should be shown in each log message

10 defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);

11 

12 require_once($yii);

13 Yii::createWebApplication($config)->run();




These are the code snippets that have been altered or added in this chapter:

In IssueController.php :




public function actionView($id)

	{

		#$this->render('view',array(

		#	'model'=>$this->loadModel($id),

		#));

                

                # changes made on page 220

                $issue = $this->loadModel($id);

                $comment = $this->createComment($issue);

                $this->render('view', array('model'=>$issue, 'comment'=>$comment,));

	}



Also in IssueController.php :




protected function createComment($issue) {

            $comment = new Comment;

            if(isset($_POST['Comment'])) {

                $comment->attributes = $_POST['Comment'];

                if($issue->addComment($comment)) {

                    Yii::app()->user->setFlash('commentSubmitted', "Your comment has been added. ");

                    $this->refresh();

                }

            }

            return $comment;

        }



The file _comments.php




<?php foreach($comments as $comment): ?>

<div class="comment">

    <div class="author">

        <?php echo $comment->author->username; ?>:

    </div>

    

    <div class="time">

        on <?php echo date('F j, Y \a\t h:i:a', strtotime($comment->create_time)); ?>

    </div>

    

    <div class="content">

        <?php echo nl2br(CHtml::encode($comment->content)); ?>        

    </div>

    <hr>

    

</div> <!-- comment -->


<?php endforeach; ?>



I have checked for typo’s, but I can’t find any myself, maybe someone else can.

Thanks,

Edwin

I’m having a similar issue when trying to access fields through relations.

The strange thing is that it works perfectly on a XAMPP server installed on OS X Lion, but throws a PHP notice (Trying to get property of non-object) on a WAMP servers installed on Windows 7. Any ideas, anyone?

After a lot of searching, I finally found the answer on the forum on yiichina.com

The incomplete link is: topic/13199-help-with-model-relations-trying-to-access-a-non-object/ (apparently I’m not allowed to post links)

Basically, the error was occuring when one of the values returned was null. Probably the PHP version running on OS X (I think it’s 5.3.1) was not objecting, while PHP 5.3.9 on Windows was.

Hope this helps someone!

It helped. I had a few comments with the user_ids unset - filling them in fixed the issue (though obviously ensuring that the individual fields are not empty before displaying them is obviously the least risky solution.

Hey for all, an simple form to identify code errors is to download the book source code in:

packtpub

For this is necessary create an account.