2012-07-22 68 views
0

大家好,我一直在努力寻找解决方案。我试过这个 Nested array. Third level is disappearing 和这Trying to get threaded/nested comments in PHP和许多其他方式,但可能是由于我缺乏知识我无法得到所需的结果。这就是我寻求帮助的原因。 我想为我的新闻网站创建嵌套注释。嵌套评论OOP php

我在mysql用CommentID和PARENTID表

有一个类帖子里我得到的所有分配的注释

case Comments: 
    if ($this->iPostID != 0) { 
     $sSQL = "SELECT CommentID, ParentID FROM Comment WHERE PostID=" . $this->iPostID; 

     $rsComment = $this->dDatabase->query($sSQL); 

     while ($aComment = $this->dDatabase->fetch_array($rsComment)) { 
      $sComment = new comment(); 
      $sComment->load($aComment['CommentID']); 
      $this->aComments[] = $sComment; 
     } 

    } 
    return $this->aComments; 
    break; 

即数组我得到的形式$这个 - > aComments:

Array 
(
    [0] => comment Object 
     (
      [iCommentID:comment:private] => 1 
      [iDatePosted:comment:private] => 17 July 2012 
      [sContent:comment:private] => Very nice it works now 
      [iUserID:comment:private] => 1 
      [iPostID:comment:private] => 1 
      [iParentID:comment:private] => 0 
      [dDatabase:comment:private] => database Object 
       (
        [sqliConnection:database:private] => mysqli Object 
         (
          [affected_rows] => 1 
          [client_info] => 5.5.9 
          [client_version] => 50509 
          [connect_errno] => 0 
          [connect_error] => 
          [errno] => 0 
          [error] => 
          [field_count] => 6 
          [host_info] => Localhost via UNIX socket 
          [info] => 
          [insert_id] => 0 
          [server_info] => 5.5.9 
          [server_version] => 50509 
          [sqlstate] => 00000 
          [protocol_version] => 10 
          [thread_id] => 2929 
          [warning_count] => 0 
         ) 

       ) 

     ) 

... 
    [3] => comment Object 
    (
     [iCommentID:comment:private] => 4 
     [iDatePosted:comment:private] => 22 July 2012 
     [sContent:comment:private] => thies is the first reply for a comment 
     [iUserID:comment:private] => 4 
     [iPostID:comment:private] => 1 
     [iParentID:comment:private] => 1 
     [dDatabase:comment:private] => database Object 
      (
       [sqliConnection:database:private] => mysqli Object 
        (
         [affected_rows] => 1 
         [client_info] => 5.5.9 
         [client_version] => 50509 
         [connect_errno] => 0 
         [connect_error] => 
         [errno] => 0 
         [error] => 
         [field_count] => 6 
         [host_info] => Localhost via UNIX socket 
         [info] => 
         [insert_id] => 0 
         [server_info] => 5.5.9 
         [server_version] => 50509 
         [sqlstate] => 00000 
         [protocol_version] => 10 
         [thread_id] => 2929 
         [warning_count] => 0 
        ) 

      ) 

    ) 

这是我得到我想要这个数组做任何事,每次错误

Fatal error: Cannot use object of type comment as array in /Applications/MAMP/htdocs/News/includes/thread.php on line 15

的Thread.PHP是http://www.jongales.com/blog/2009/01/27/php-class-for-threaded-comments/

完全相同的副本任何人都可以帮我请。

谢谢。

+0

'comment'是一个对象,而不是一个数组。您可以使用'$ comment-> iCommentID'来获取您的值,或者使用[ArrayObject](http://php.net/manual/en/class.arrayobject.php)允许对象作为数组工作。 – Romain 2012-07-22 08:02:05

+1

仔细阅读您的错误消息。它阐明了这个问题。数据结构中的每个注释行都是一个*对象*,并且您试图以*数组*的形式访问它,就像您链接到的示例一样。将所有访问从'$ comment ['parent_id']'转换为'$ comment-> parent_id'。 (另外,'mutithreading'标签不适合这个问题。) – DCoder 2012-07-22 08:02:21

+0

感谢您的快速回复我会尝试您的建议。并抱歉标签我是一个新的这个网站)) – 2012-07-22 08:13:13

回答

0

错误足够详细,thread.php假设$commment是一个数组,其中包含以下键parent_id,id ......在你的情况下,它是一个对象。

所以,你有两个选择

  • 要么改变你的代码,使其与thread.php(高不推荐)兼容
  • 或修改thread.php,使其处理你的对象。

要修改thread.php再次,你有两个选择,因为你的Comment类属性是private可以

  • 要么改变访问修饰符来public
  • 或设置一些getters

然后每一个地方在thread.php你看到这样$comment['parent_id']使其$comment->parent_id(或$comment-getParentId如果您使用的getter)等

+0

是啊!现在一切正常)))不能相信,我花了7个小时,试图找出我自己,并没有先问这里! – 2012-07-22 08:23:18

0

谢谢大家的帮助和答复,你帮了我很多忙。 我也稍微修改我的评论系统,在这里到底是结果

PHP:

public function load($iCommID) 
{ 
    $sSQL = "SELECT CommentID, DATE_FORMAT(DatePosted, '%d %M %Y') as DatePosted, Content, UserID, PostID, ParentID FROM Comment WHERE CommentID=" .$iCommID; 

    $aComment = $this->dDatabase->query($sSQL); 

    $rsComment = $this->dDatabase->fetch_array($aComment); 
    $this->iCommentID = $rsComment['CommentID']; 
    $this->iDatePosted = $rsComment['DatePosted']; 
    $this->sContent = $rsComment['Content']; 
    $this->iUserID = $rsComment['UserID']; 
    $this->iPostID = $rsComment['PostID']; 
    $this->iParentID = $rsComment['ParentID']; 

    $sSQL = "SELECT CommentID FROM Comment WHERE ParentID=" .$iCommID; 

      $resParent = $this->dDatabase->query($sSQL); 

      while($aReply = $this->dDatabase->fetch_array($resParent)) 
      { 

       $oReply = new comment(); 
       $oReply->load($aReply['CommentID']); 

       $this->aReply[] = $oReply; 
      } 

} 

渲染:

public static function renderSingleComment($comComment) 
{ 
    $aReplies = $comComment->Replies; 
    $sHTML = ""; 
    $sHTML .= '<li class="comment"> 
         <a id="'.$comComment->CommentID.'"></a> 
         <div class="comm-container"> 
          <div class="comm-container-header"> 
           <img src="img/avatar1.jpg" alt="avatar1" width="55" height="60" class="avatar"/> 
           <span class="commentator">Igor Revenko</span> 
           <br/> 
           <span class="date">'.$comComment->DatePosted.'</span> 
           <span><a href="#'.$comComment->ParentID.'">#</a></span> 
           <div class="clear"></div> 
          </div> 
          <div class="comm-container-entry" id="rev"> 
           <p>'.$comComment->Content.'</p> 

            <a class="comment-reply-link" id="replyLink-'.$comComment->CommentID.'" href="#'.$comComment->CommentID.'" onclick="javascript:moveForm(this); findID(\'replyLink-'.$comComment->CommentID.'\')"></a> 

          </div> 
         </div>'; 
        for($i=0;$i<count($aReplies); $i++) 
        { 
         $sHTML .= '<ul class="children">'; 
         $sHTML .= PageView::renderSingleComment($aReplies[$i]); 
         $sHTML .= '</ul>'; 
        } 
    $sHTML .= ' </li>'; 


    return $sHTML; 
} 


public static function renderComment ($pvPostID){ 


    $sHTML = ""; 

    $aComments = $pvPostID->Comments; 

    $sHTML .= '<div class="clear"></div> 
      <div id="comments"> 
       <h3>COMMENTS TO "'.$pvPostID->PostName.'"</h3> 
       <ol class="comments-list">'; 

    for($i=0; $i<count($aComments); $i++) 
    { 
     $sHTML .= PageView::renderSingleComment($aComments[$i]); 
    } 

再次感谢您的帮助。