【问题标题】:While loops within while loops and output php?while循环中的while循环并输出php?
【发布时间】:2012-01-02 10:52:09
【问题描述】:

我有一个 while 循环来显示我网站上帖子的回复。

查询中使用的 parentID 值为 $post['postID'],它是正在查看的帖子的详细信息数组。

如下所示,它输出以下内容(每个主题都是查看完整帖子的链接)

$q = $dbc -> prepare("SELECT * FROM boardposts WHERE parentID = ?");
$q -> execute(array($post['postID']));
while ($postReply = $q -> fetch(PDO::FETCH_ASSOC)) {
     echo '<p><a href="http://www.example.com/boards?topic=' . $_GET['topic'] . '&amp;view=' . $postReply['postID'] . '">' . $postReply['subject'] . '</a>';
}

目前输出的内容类似于,

回复此消息:

主题 1
主题2
主题 3
科目四

有没有办法让我也可以在列表中包括对回复的回复,类似于以下内容,

回复此消息:

主题 1
主题 1 个回复
主题 1 个回复
主题 1 回复 回复
主题2
主题 3
主题 3 回复
主题 3 回复
主题3回复回复
主题 4
主题 4 回复
主题 5
主题 6
主题 6 回复
主题4回复回复

我知道所有的缩进都可以使用 css,但是对于如何以正确的顺序从 mysql 数据库中提取数据感到困惑,我尝试了 while 循环中的 while 循环,但这涉及到 while 循环中的查询,这不好!

感谢您的意见!

【问题讨论】:

    标签: php mysql loops while-loop


    【解决方案1】:

    我怀疑您将不得不做的是重新设计您的数据库以将线程/主题关系存储在一个字段中,以便您可以在一个查询中提取所有线程,然后在 php.ini 中以编程方式对它们进行排序。如果你有一个 parent_id 字段,并且每个回复行都知道它的父级是谁以及它的顺序是什么(大概顺序只是 id > previous id),那么根据需要组织它们非常简单。

    然后,您可以遍历响应列表并将所有项目放入 JSON(y) 对象中,该对象具有正确顺序/关系的所有嵌套响应。

    为了减少不必要的膨胀,您可能还需要存储顶级父 ID,以便您可以轻松地仅拉取属于特定顶级线程的那些线程。这样您就可以轻松地只抓取属于的线程,例如最后 20 个顶级线程(以减少对没有人需要的古老线程的不必要计算,并构建某种分页)。

    编辑...一些伪代码...

    select * from row order by top_level_id desc limit 0,20 // 这将为您提供最多 20 个顶级线程,因此您不会拉动整个数据库。最后的 0 应该是您从 PHP 传入的页面变量,因此您可以为第 2 页执行 20,20,为第 3 页执行 40,20

    现在你做这样的事情(显然这是伪代码,但你应该能够根据这个模型完成它......

    $sortedRows; //this will be a JSON object, or hash array
    
    for($row in result){
       addToThreadObj($row);
    }
    
    function addToThreadObj($row){
        if( containsParent($row.parent_id))
             addChildToParent($row.parent_id, $row);
        else
             createNewParent($row);
    }
    

    【讨论】:

    • 是的,我为每个帖子都有一个 parentID,但只是不知道从哪里开始组织它们
    • 这种方法不适合大型结果集。 (例如,您基本上在每个页面呈现时都会吸收整个表格)如果您需要在 SQL 数据库之上稳定、高性能的层次结构,唯一真正的选择是嵌套集模型。
    • @Billy ONeal,不,最后一段清楚地说明了它如何避免处理整个数据库。请重新阅读。
    • @Novac,我没有写很多 PHP,所以,我不确定这样做的语法是什么,但你想要的是将你的 ITEM 对象可视化为 XML节点,以及作为 XML DOM 的整个树(只是为了比较)。当你拉一行时,你创建一个节点,然后查看你当前的文档,看看是否已经有一个节点,其 id 是这个新节点的父 ID,如果有,将它作为子节点添加到该节点,如果没有,它必须是父母。只需确保按照主键 id 从小到大的顺序循环,因为孩子的 id 总是比父母大。
    • @Dr.Dredel:当您尝试显示单个大型主题时,这种方法会失败。无论您如何对其进行切片,使用邻接列表模型最终都会得到 N 层深的树,您需要 N 个数据库查询(或 N 个连接)才能对其进行枚举。您的示例将用于显示一个简单的主题列表,但如果在现实世界的用例中分崩离析。
    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2016-04-24
    • 1970-01-01
    相关资源
    最近更新 更多