Php 保存查询分页数据的最安全方法

Php 保存查询分页数据的最安全方法,php,cookies,pagination,Php,Cookies,Pagination,我有一个查询,它使用ID列表作为输入(例如,“WHERE XX IN(1,2,3,4)),结果太多,无法显示在单个网页上。我计划做的是限制结果并对其进行分页。使用MySql,我添加了“limit X OFFSET Z” 我现在的问题是如何将信息传递到每个页面。我可以用其中的ID列表生成分页链接(例如)或者我可以将它们存储在某个地方。因为我使用的是php,所以我想现在使用SESSION来存储它们或将它们写入cookie中。使用DB有点过头了?我现在可以用cookie制作一个简单的解决方案,以后再进

我有一个查询,它使用ID列表作为输入(例如,“WHERE XX IN(1,2,3,4)),结果太多,无法显示在单个网页上。我计划做的是限制结果并对其进行分页。使用MySql,我添加了“limit X OFFSET Z”

我现在的问题是如何将信息传递到每个页面。我可以用其中的ID列表生成分页链接(例如
)或者我可以将它们存储在某个地方。因为我使用的是php,所以我想现在使用SESSION来存储它们或将它们写入cookie中。使用DB有点过头了?我现在可以用cookie制作一个简单的解决方案,以后再进行更改。cookie中有ID不是一个安全问题。即使用户将ID添加到该列表中也无所谓


关于这一点,有一些答案,但似乎没有一个能够解决所有各种可能性。

是的,使用数据库是一种过火的行为。根据您的web应用程序,会话和URL都是解决这一问题的好方法

我认为这两种方法中最好的解决方案是在URL中包含分页。这在共享应用程序链接时会有很大帮助。(Immagine向同事发送应用程序中某个页面的链接……而您正在使用会话进行分页)

在代码中为“页面大小”设置一个常量,然后将其乘以查询字符串中的页码以获得偏移量。下面是一个简化的代码示例来说明:

<?php
    $limit = 30; // records per page to have more/less change this
    $page = 0;   // if not set, $page is 0 (first page)
    if (isset($_GET['page']) {
        $page = (int)$_GET['page']; // cast to int, to drop funny chars etc.
    }
    $offset = $page * $limit;
    $query = "SELECT * FROM a_table WHERE some_col IN (1,2,3,4)";

    // ... then, to add offset data to your query:
    $query += " LIMIT $limit OFFSET $offset"; // mind the single space

我建议使用javascript进行分页。你有没有一个例子?据我所知,这基本上就像拥有链接href上的所有信息一样,但我没有写20次ID,而是将它们写在某个地方,然后用javascript命令获取。@gbestard虽然我同意javascript在浏览器中分页,但他必须写首先是他的后端代码中的分页逻辑。如果服务器在每次请求时返回数万条记录,Javascript将不会对加载和数据传输产生任何好处;)@mobinoob我编写了一些示例代码,用于在查询字符串中包含分页信息。这应该可以解决您的问题,但如果您想使用会话方式,让我知道。@Oerd true,如果我们谈论的是成千上万条记录,那么仅仅使用javascript是不够的,但对于几百条记录来说就可以了。ID确实来自用户输入。没有其他方法。用户选择内容,页面记住ID,然后我将它们发送到查询以获得结果。我使用存储过程并检查注入。将ID存储在cookie中或将其放在链接中同样不安全:)我只是想提醒一下,这不一定是“不安全的”" ;)当php强制转换为int时,它将删除任何非数字字符,因此在
处拆分并在循环中强制转换为int对于我读到的+0技巧$intval=$postval+0yeah,但这是一个技巧(是否尝试过
I=1,2.5,3
?)。铸造在语义上更好。你的代码会告诉读它的人你想把字符串转换成int。