1

我从我的 PHP 脚本连接到并在其上执行查询的数据库中获取了大约 500 行。对于返回的每一行,我以表格格式显示。脚本在 Firefox 中运行良好,最终在 IE 中运行,但在一切正常显示之前,用户会收到 1 或 2 次“停止运行此脚本”提示(并告诉 IE 继续..)。

为了解决这个问题,我需要将一些数据发送回浏览器——我认为最好的方法是分块/批量处理数组。PHP 有一个array_chunk函数,但我无法弄清楚如何在这里使用它。

要获取数据库行,我使用:

$result = mssql_query($query);

...然后将它们显示在表格中:

while($row = mssql_fetch_array($result))
{
  [DISPLAY TABLE ROW IN TABLE]
}

使用 array_chunk 处理我的数组的最佳方法是什么,比如以 50 个为一组?

4

3 回答 3

1

array_chunk只有在您已经从数据库中获得了全部信息之后,它才会对您有所帮助。从您的问题来看,听起来脚本挂在数据库的实际查询上,因为它被设置为一个数组,然后您想要处理整个数组。

您可以在仍用于loop从数据库中获取每一行结果的同时输出表的每一行,而不是先创建一个主数组。但是,您的用户可能会在您的脚本通过查询时看到页面加载。

现在离开你的问题的主题:如果页面加载块对你来说不太理想,你可以查看在后台异步运行查询(使用 JavaScript),同时显示某种“加载”消息,直到脚本完成跑步。然后,将结果输出到页面。

或者,如果您可以选择不一次显示所有 500 多个结果,则可以使用分页并使用LIMITOFFSETSQL 关键字来仅获取整体查询的一部分。然后,创建指向结果的下一页或上一页的链接,这将改变OFFSET.

于 2011-01-10T19:45:35.887 回答
1

您正在一次向浏览器发送一堆数据。为了使其表现良好,要么:

  1. 发送更少的数据。 正如其他答案所建议的那样,使用 SQLLIMIT对结果进行分页,并输出链接以在页面之间来回导航(/data/page/1/data/page/55/data/page/last等)。这有一个次要影响:您的 PHP 和 SQL 将执行得更快,因为您在服务器上处理的每个请求的数据更少。

  2. 以较小的块发送数据。 在循环遍历行时,flush();定期调用(每$n行)让浏览器有时间在获取更多结果之前显示一些结果。

  3. 逐步拉取数据。您还可以通过 AJAX 以较小的位(例如一次 50 行)获取结果。您可以将其放在上述或类似的分页之上。

  4. 使数据更小。最小化返回给浏览器的 HTML 的大小也会产生重大影响。您可以删除额外的<div>标签、类、ID 或缩写内容本身(链接回完整的详细信息)。您还可以以更简短的格式(如 JSON)发送数据,并使用 JavaScript 对其进行扩展。

于 2011-01-10T19:51:07.773 回答
0

你问错了问题,我认为...... array_chunk 不是你最好的选择,因为你需要完整的数组来分块它。Ergo: 你应该已经遍历了整个结果集一次。

为什么不直接在你在那里的while循环中输出?

如果您觉得必须对数据进行分块,请使用外部计数器。在循环内递增,并使用 MODULO 操作数检查该值。

$i = 0;
while($row = mssql_fetch_array($result))
{
  if(++$i % 500 == 0) {
    [DISPLAY TABLE ROW IN TABLE]
  }
}
于 2011-01-10T19:38:59.383 回答