Php Page Number in Huge Array

时间:2016-10-31 09:44:01

标签: php arrays sql-server pagination

我尝试创建一个显示表格内容的脚本,并突出显示用户搜索的元素。

输出必须突出显示等于或大于搜索值的第一个元素。

搜索的值是表的一个键(varchar) 我只需要输出包含元素的页面,而不是输出表格中的所有数据(分页)。

这就是我想要实现的目标:

  1. 用户进行搜索(使用网络界面)。
  2. php脚本查找包含的第一个元素 字符串(等于或大于)并获取页码(例如每个 页面有100个元素)
  3. php脚本返回分页结果并仅显示其中的数据 正确的页面。
  4. 用户应该可以从中移动到下一页或上一页 第一场比赛的页面。
  5. 目前我的脚本的工作方式如下:

    1. 获取表格的所有元素并将它们放在关联数组中 (表键是数组的键,由此排序 属性并且是搜索的元素。)
    2. 循环查找匹配值(等于或大于)的数组。
    3. 获取数组中元素的位置
    4. 如果每个页面都有100个元素,则获取元素的页码
    5. 调用一个能够从中输出分页网格的类 第4点中找到的页码(此点没有问题)。
    6. 我不认为使用第一点中提到的基于记录集/数组的方法是一个很好的方法,因为它有很多元素(100.000),我只需要向用户显示一个页面。但是,我无法找到最佳方法。

      你认为有办法改进这个解决方案吗?

      下图是我想要做的一个例子:

      语言: PHP DBMS: Sql Server

2 个答案:

答案 0 :(得分:1)

将所有内容加载到PHP数组中并在PHP上执行RDBMS的工作是一个非常糟糕的主意。请记住,通过这种方式,您可以将大量数据加载到RDBMS上的内存中,RDBMS会将大量数据的响应发送到应用程序服务器,这将在该级别执行一项不合适的工作,从而丢失索引和内容。而不是那样,你可以使用这样的脚本:

declare @pageSize int;
declare @value varchar;
declare @elementIndex int;
declare @currentPage int;

set @pageSize = 100;
set @value = 'foobar';
set @elementIndex = (select count(*)
                     from MyTable
                     where MyTable.MyColumn < @value);
set @currentPage = (@elementIndex + 1) / @pageSize;

WITH Rows AS
(
    SELECT
              ROW_NUMBER() OVER (ORDER BY [dbo].[MyColumn]) [Row]
            , *
        FROM
              [dbo].[MyTable]
)
SELECT TOP 10
          *
     FROM
         Rows
    WHERE Row > (@pageSize * (@currentPage - 1));

你可以从PHP生成这个,或者编写一个存储的函数并根据需要调用它,只需确保你自己免受SQL注入。

答案 1 :(得分:0)

“更好”的解决方案取决于您在数据库和SQL服务器上的负载量。

通常,sql数据库选择小范围比选择整个表格要快得多。因此,每次使用SQL LIMIT移动到下一页或上一页时,我都会选择sql中的小范围。