【问题标题】:Spliting a VERY long table in multiples pages html/php在多个页面 html/php 中拆分一个非常长的表
【发布时间】:2014-06-26 13:11:24
【问题描述】:

这就是问题所在。我无权创建数据库,并且我收到一个 csv,它每天计算大量数据。 (超过 200 000 行)

我必须让 Intranet 上的每个人都可以访问这些数据。因此,我创建了一个简单的 html/php 页面,该页面提取所有行并将这些信息显示在一个表格中,并使用一个简单的 fgetcsv 对每一列进行过滤。

问题是网络浏览器不适合同时显示那么多信息,所以它会导致它崩溃或冻结一段时间,而你一时无能为力。

我想知道是否有人知道如何对页面说“例如仅加载前 100 行,然后自动创建将加载并显示接下来的 100 行等的下一页。”

我设法只显示前 x 行,然后当您单击按钮时,表格将扩展为接下来的 x 行,但它们仍然会同时加载。剩下的 y 只是隐藏起来,所以浏览器仍然死机或冻结。

有什么想法吗?

谢谢

【问题讨论】:

  • 如果你能展示一些你迄今为止所做的代码将会很有用。您是否只是渲染所有行并在其上放置“显示:无”?
  • 你想要一个基于 JavaScript 的解决方案,load a CSV file via AJAX -- 问题是,它仍然会一次下载整个 CSV 文档,这会占用内存。最好的解决方案实际上是使用数据库,它可以被告知限制返回的行数。
  • 即使您使用的是 csv,您也可以只检索您需要的行,不需要数据库。即使他使用数据库,他也必须解决同样的问题。
  • 致 Alexander:为了只显示整个文件的 x 行,我使用了一个用作过滤器的 jquery 插件,但它也具有显示 x 数据量的功能。但由于它仍然加载所有文件,我只使用插件来过滤列。

标签: javascript php jquery html ajax


【解决方案1】:

这确实是一个通用的分页问题。您的数据是存储在数据库中还是存储在 CSV 文件中并不重要。

只需通过查询字符串或 URL 重写将一些偏移量参数传递给您的 PHP 脚本,然后使用它来仅选择 CSV 列表的一部分。

像这样:/big-table.php?page=3

// Getting passed argument.
$pageNumber = (int) $_GET['page'];

// Items per page default.
$itemsPerPage = 100;

// Calculating offset.
$offset = ($pageNumber - 1) * $itemsPerPage;

然后使用 $offset$itemsPerPage 通过限制 CSV 解析循环的范围来仅检索 CSV 文件的一部分。

您还可以将每页项目的值作为参数传递给脚本,以便从 Web 界面控制此值。例如,如果您想创建一个能够在每页选择 10、50、100 个项目等的下拉菜单。

如果您愿意,您可以随时使用 AJAX 动态获取更多项目,它不会真正影响服务器端的分页实现,只会影响输出格式(JSON 而不是 HTML)。

当然,数据库实现会更快,如果可能的话,我建议选择它。并且/或者您可以使用一些缓存层来加快速度。

【讨论】:

    【解决方案2】:

    您可以使用 jquery Datatables 插件http://datatables.net/

    使用它来做你想做的事情非常简单。

    请参阅此示例:http://datatables.net/examples/data_sources/ajax.htmlhttp://datatables.net/examples/data_sources/server_side.html

    【讨论】:

    • 谢谢,但问题是您的插件仍然会加载整个文件。它只是“隐藏”一部分内容并按需显示。但是你仍然加载 csv 的 200k 行,这会占用太多内存并导致浏览器崩溃
    【解决方案3】:

    最明智的做法是要求数据库访问。现在,你被告知要造一辆汽车,但不使用车轮和发动机。

    现在,您可以使用 PHP 将大 csv 拆分为多个 n 行长的较小文件。如果更新了大 csv,您只需执行一次,或者每天/小时执行一次。然后只在需要时加载这些文件中的每一个,方法是导航到另一个页面或使用 Javascript 动态加载。

    【讨论】:

      猜你喜欢
      • 2012-06-28
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      相关资源
      最近更新 更多