PHP中的嵌套循环 - 布局问题

时间:2012-11-25 04:29:56

标签: php html css

我正在建立的网站上有评论和回复部分。回复部分设置为向左移动,保证金为10%。但是当我测试代码时,它会将每个回复转移到右边而不是所有回复一起转移。我被困了,因为回复在评论中循环,我不知道如何解决它。这是代码......

        // Comments section
        // Get Username and ID from database
        if ($login->isLoggedIn()) {
            $userquery = "SELECT * FROM settings WHERE user_id=$userid";
            $usersql = mysql_query($userquery) or die('SQL Error :: '.mysql_error());
            $userqueryrow = mysql_fetch_assoc($usersql);
            $usercommentname = $userqueryrow['display_name'];
            } else {
            }

        // Posted Comments 
        $commentquery = "SELECT * FROM comments WHERE listing_id=$listingid AND response_to_id='0' ORDER BY comment_ts ASC";
        $commentsql = mysql_query($commentquery) or die('SQL Error :: '.mysql_error());

         if(mysql_num_rows($commentsql) == 0){ 
            echo '<div align="center">No comments have been posted yet.</div>';                        
                } else {    
            while($commentrow=mysql_fetch_array($commentsql))
            {
            // Get comment display name from database
            // Get Username and ID from database
            $commentid = $commentrow['comment_id'];
            $commenterid = $commentrow['user_id'];
            $commenterquery = "SELECT * FROM settings WHERE user_id=$commenterid";
            $commentersql = mysql_query($commenterquery) or die('SQL Error :: '.mysql_error());
            $commenterqueryrow = mysql_fetch_assoc($commentersql);
            $commentername = $commenterqueryrow['display_name'];
            echo '<div class="comment"><a href="mypage.php?user='.$commenterid.'">'.$commentername.'</a> said: '.stripslashes($commentrow['comment']).'';

            if ($login->isLoggedIn()) {
            // Has this user already reported this comment?
            $reportedcommentquery = "SELECT * FROM report WHERE comment_id=$commentid AND reporter_id=$userid AND listing_id=$listingid";
            $reportedcomment = mysql_query($reportedcommentquery) or die('SQL Error :: '.mysql_error());

        if (mysql_num_rows($reportedcomment) > "0") {
            echo '  <span class="small_gray">-Reported and under review-</span>';
            } else {
            echo '  <a href="item.php?item='.$listingid.'&report='.$commentid.'" class="small_graylink">Report</a>';
            }

            echo '</div>';

                // Get responses
                $responsesquery = "SELECT * FROM comments WHERE listing_id=$listingid AND response_to_id=$commentid ORDER BY comment_ts ASC";
                $responsessql = mysql_query($responsesquery) or die('SQL Error :: '.mysql_error());

                 if(mysql_num_rows($responsessql) == 0){ 
                    echo '';                        
                    } else {    
                    while($responsesrow=mysql_fetch_array($responsessql))
                    {
                    // Get responder display name from database
                    $responderid = $responsesrow['user_id'];
                    $responseid = $responsesrow['comment_id'];
                    $responderquery = "SELECT * FROM settings WHERE user_id=$responderid";
                    $respondersql = mysql_query($responderquery) or die('SQL Error :: '.mysql_error());
                    $responderqueryrow = mysql_fetch_assoc($respondersql);
                    $respondername = $responderqueryrow['display_name'];
                    $responderid = $responderqueryrow['user_id'];
                    echo '<div class="response"><a href="mypage.php?user='.$responderid.'">'.$respondername.'</a> said: '.stripslashes($responsesrow['comment']).'';

                    if ($login->isLoggedIn()) {
                        // Has this user already reported this comment?
                        $reportedresponsequery = "SELECT * FROM report WHERE comment_id=$responseid AND reporter_id=$userid AND listing_id=$listingid";
                        $reportedresponse = mysql_query($reportedresponsequery) or die('SQL Error :: '.mysql_error());

                    if (mysql_num_rows($reportedresponse) > "0") {
                    echo'  <span class="small_gray">-Reported and under review-</span>';
                    } else {
                    echo'  <a href="item.php?item='.$listingid.'&report='.$responsesrow['comment_id'].'" class="small_graylink">Report</a>';
                        }
                    }
                    }

                    echo '</div>';
                    echo '<div class="clear"></div>';
                        }
                    }

              // Response form
              if ($login->isLoggedIn()) {
              echo '<div class="responsebox">Respond to this comment:<br /><form id="newresponseto" name="newresponseto" method="post" action="item.php?item='.$listingid.'&comment='.$commentrow['comment_id'].'">
              <textarea name="new_response" cols="43" rows="2">'.$usercommentname.' says:</textarea><br />
              <input type="submit" name="Submit" value="Submit" /></form></div><hr>';
                              } else {
                              }
                }
            }

          // Comment form
          if ($login->isLoggedIn()) {
echo'         <div class="commentbox">Post a comment:<br /><form id="newcommentform" name="newcommentform" method="post" action="item.php?item='.$listingid.'">
            <textarea name="new_comment" cols="50" rows="2">'.$usercommentname.' says:</textarea><br />
            <input type="submit" name="Submit" value="Submit" />
          </form></div>';
          } else {
          echo '<div align="center">Log in to post comments or responses.</div>';
          }

这是相应的CSS ..

.comment {
    float: left;
    width: 100%;
    background-color:#CCCCCC;
    margin-bottom: 10px;

}

.commentbox {
    float: left;
    width: 100%;
    margin-bottom: 10px;
}

.response {
    float: left;
    background-color:#EDEFF4;
    margin-bottom: 10px;

}

.responsecontainer {
    float: left;
    margin-left: 10%;
    width: 90%;
    margin-bottom: 10px;
}

.responsebox {
    float: left;
    margin-bottom: 10px;
}

任何想法如何保持嵌套循环,但强制响应(实际上任何后续注释)布局而不循环左边距?

2 个答案:

答案 0 :(得分:1)

我在您发布的代码中没有看到您调用了.responsecontainer类,这会将边距设置为10%。

但是responses的嵌套是因为你没有关闭你的 <div class="response">循环中的while,仅在关闭循环后的最后。所以你会得到这样的情况 -

<div class="response"><a href="mypage.php?user=1">user1</a> said: Yes
<div class="response"><a href="mypage.php?user=2">user2</a> said: I agree
<div class="response"><a href="mypage.php?user=3">user3</a> said: Are You Sure?
</div>

所以最后2个将嵌套在第一个<div>中,而不是直接嵌在下面。

您需要在<div class="responsecontainer"> response循环周围添加while,然后在循环中添加</div>

截断脚本 -

            // Get responses
            ...
             echo '<div class="responsecontainer">';  // Add <div class="responsecontainer"> to make all responses margin-left 10% as a group 
             if(mysql_num_rows($responsessql) == 0){ 
                ...    

                while($responsesrow=mysql_fetch_array($responsessql))
                {
                // Get responder display name from database
                $responderid = $responsesrow['user_id'];
                $responseid = $responsesrow['comment_id'];
                $responderquery = "SELECT * FROM settings WHERE user_id=$responderid";
                $respondersql = mysql_query($responderquery) or die('SQL Error :: '.mysql_error());
                $responderqueryrow = mysql_fetch_assoc($respondersql);
                $respondername = $responderqueryrow['display_name'];
                $responderid = $responderqueryrow['user_id'];
                echo '<div class="response"><a href="mypage.php?user='.$responderid.'">'.$respondername.'</a> said: '.stripslashes($responsesrow['comment']).'';

                if ($login->isLoggedIn()) {
                    // Has this user already reported this comment?
                    $reportedresponsequery = "SELECT * FROM report WHERE comment_id=$responseid AND reporter_id=$userid AND listing_id=$listingid";
                    $reportedresponse = mysql_query($reportedresponsequery) or die('SQL Error :: '.mysql_error());

                if (mysql_num_rows($reportedresponse) > "0") {
                echo'  <span class="small_gray">-Reported and under review-</span>';
                } else {
                echo'  <a href="item.php?item='.$listingid.'&report='.$responsesrow['comment_id'].'" class="small_graylink">Report</a>';
                    }
                }
                echo '</div>';  // Missing </div> inside while loop
                }

                echo '</div>';  // Ends <div class="responsecontainer">
                echo '<div class="clear"></div>';
                }

答案 1 :(得分:0)

首先连接输出以获得对它的更多控制..

每次要打印内容时都不使用echo:

echo '<div class="response"><a href="mypage.php?user='.$responderid.'">'.$respondername.'</a> said: '.stripslashes($responsesrow['comment']).'';

将输出集中在一个变量中:

$output = '<div class="response">';
$output .= '<a href="mypage.php?user='.$responderid.'">'.$respondername.'</a> ';
$output .= 'said: '.stripslashes($responsesrow['comment']);
$output .= '</div>';