【问题标题】:How to split SQL query results into chunks in PHP如何在 PHP 中将 SQL 查询结果拆分为块
【发布时间】:2013-06-27 14:47:40
【问题描述】:

我正在尝试使用 PHP 将查询结果分成块,但似乎无法弄清楚如何制定查询或循环以将结果分成四个批次并用特定的 HTML 元素包围这四行。

内容具体是一个摄影作品集,我只是尝试逐行显示照片,但我需要设置样式的方式要求每一行基本上是一组单独的信息。

这是我目前正在使用的代码:

<ul class="no-bullet">
<?php

require("connect.php");
$query = "SELECT * FROM dv_photo_work LIMIT 4";

$result = mysql_query($query, $link);
while ($row = mysql_fetch_array($result)) {
  print('
     <li><img alt="'.$row["img_title"].'" src="'.$row["img_slug"].'></li>');
}


?>
</ul>

不过,我只希望该列表中有四张图片。然后是另一个列表中的另外四个。 您能帮我重新设计循环以使其返回四条记录,然后开始对另一个列表中的以下四条记录进行新的查询吗?我将在数据库中检索大约 100 条记录from,所以它必须能够继续,直到列出整个表。

我想这类似于分页过程,但这是我不熟悉的另一种技术。我假设这是对查询和标记的简单调整,但我可以理解它需要更多的代码创造力而不是简单的修复。

非常感谢,

乔希

【问题讨论】:

    标签: php sql pagination


    【解决方案1】:

    试试这个

    <ul class="no-bullet">
    <?php
    require("connect.php");
    $query = "SELECT * FROM dv_photo_work";
    $result = mysql_query($query, $link);
    $i =1;
    while($row = mysql_fetch_array($result)) {
       print('<li><img alt="'.$row["img_title"].'" src="'.$row["img_slug"].'></li>');
       if ($i%4 == 0) echo "</ul><ul class='no-bullet'>";
       $i++;
    }
    ?>
    </ul>
    

    【讨论】:

    • 这非常有效。我看到最后应该有一个空的 ul 元素,但是当我刚才运行它时,它们被分组应该如何,并且没有剩余列表未填充。 @Orangepill 谢谢!
    【解决方案2】:

    首先!将该逻辑从 html 移开,这将使您更清楚地看到问题。第二!那么两个类,一个代表 n 长度的查询结果列表的 A 类呢? A 类应该是一个迭代器,以便 B 类可以提取任意长度的结果块并返回适当大小的结果对象。也许有第三个类,其实例代表大小受约束的结果。所以在所有三个类中,A 代表一个完整的结果列表,B 作用于 a 并返回 C 的实例,这将代表你的大小受限的结果块。

    这本来是个评论,但是太长了,只好做个回答(对不起,如果太'教人钓鱼'我只是不想写php...)

    【讨论】:

    • 如果我不直接将它插入到应该放置的位置,我将如何在模型中获得查询结果?虽然我正在关注如何编写我正在寻找的逻辑的策略,但我是这些语言的一员,我正在寻找更直接的建议,关于在这样的场景中使用哪些 PHP 函数或 SQL 命令以及如何使用将它们置于标记中。
    • 老兄够公平的。就我提到的 C 类的插入而言,它是实例,前提是该对象具有一个方法,当调用该方法时返回它的内容包装在 html 中,这将是保持领域分离并且仍然具有简单性的好方法,只要只有一个 php与 html 混合的对象,'除了这个对象(将)就副作用而言更加无辜......
    【解决方案3】:

    获取所有结果,将它们读入多维数组,然后使用 array_chunk() 将它们分成组。

    $query = mysql_query("SELECT * FROM dv_photo_work",$link);
    $results = array();
    while($line = mysql_fetch_array($query, MYSQL_ASSOC)){
        $results[] = $line;
    }
    $lists = array_chunk($results,4);
    foreach ($lists as $list) {
        echo '<ul>';
        foreach ($list as $result) {
            echo '<li><img alt="'.$result["img_title"].'" src="'.$result["img_slug"].'></li>'
        }
        echo '</ul>';
    }
    

    【讨论】:

    • 我检查了逻辑,这是有道理的,但是当我运行它时它给了我一个内部服务器错误,这通常意味着存在某种语法问题。 @Otome 你有没有看到任何可能导致任何问题的东西?
    【解决方案4】:

    这里是所涉及的逻辑的概述,使用模运算符 (%) 在每第四条记录处更改 HTML:

    $i = 0;
    
    // within your current while-loop:
        if ($i % 4 == 0) {
            // $i is a multiple of 4 (including 0, the first record)
            if ($i > 0) {
                // finish the previous ul-tag
            }
            // start a new block of HTML (the ul)
        }
        // output the li
        $i += 1;
    
    // after the loop, close the last ul
    

    【讨论】:

    • 我这样做了,但由于某种原因,&lt;ul&gt; 在每一行之后都被关闭和打开,而不仅仅是第四行。
    • @Joshie 我的错,应该是$i % 4 == 0。我已经更正了我的大纲。
    猜你喜欢
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多