代码之家  ›  专栏  ›  技术社区  ›  Devner

PHP,MySQL:如何在处理分页时保留和检索正确的数据

  •  0
  • Devner  · 技术社区  · 14 年前

    我有一个表单(由25+个字段组成),这些字段的值从一个很小的值到一个串联的字符串。这就像一个搜索工具。现在,当用户填写表单并提交信息时,他可以看到与表单中的条件匹配的所有相关数据。我一次向用户显示15条记录。我已经实现了分页,使用户也可以看到其他记录。

    主要问题是:

    在用户提交信息并返回第一组数据之前,这部分是好的。当用户试图通过分页转到第二页(或他选择的任何一页)时,问题就出现了。用户可以导航到其他页面,但不会触发正确执行从数据库中拉出结果所需的查询。注意,最初是在表单中执行的POST操作,分页执行GET操作。所以我丢失了用户输入的表单的值,我想保留这些值并用这些值查询DB。

    因此,如何保留表单值、运行适当的查询并返回相关值,而不考虑同一用户在不同浏览器选项卡/窗口中处理同一表单的次数,不使用会话(考虑到通过GET传递数据的限制,并且可能在POST操作中丢失它们),并且能够在页面上执行其他活动?

    3 回复  |  直到 14 年前
        1
  •  2
  •   ircmaxell    14 年前

    首先,GET的安全性不亚于POST。两者都是不可信任的(修改url字符串更具吸引力,但决不是更难)。。。

    您有几个选择:

    id, data 其中数据是变量的序列化数组。然后当有人提交搜索时,检查数据是否在表中。如果是,请使用该id。如果不是,则序列化数据并插入它(并获取id)。然后重定向到如下页面: results.php?id=4 . 这样,他们可以共享链接,但它仍然保持合理的安全篡改(他们不能改变搜索参数)。这里的缺点是,桌子可能会变得很大。

    base64_encode(serialize($data)); ). 我会尽量远离这个,如果你担心篡改或网址长度。

    另一个解决方案是拦截JS中的下一个链接,并使用它从隐藏变量发回一个POST到服务器。

    已删除会话解决方案。意识到这对你的问题不起作用。

        2
  •  0
  •   Frank Farmer    14 年前

    我尽量不寄表格 数据可能超过最大值

    然后你也要用一个表单来分页,这样他们也可以发布。或者,您必须在服务器端的某个地方(可能是在会话中)存储查询条件——但不要忘记,一个用户可能会同时打开多个选项卡,因此您需要能够为每个用户存储多个查询。

    但是没有理由不能在一个会话中存储多个查询,例如$\u session['queries'][1234]。那么您的分页链接将如下所示?query=1234&页码=3

    http://google.com/search?q=somequery

        3
  •  0
  •   kamasheto    14 年前

    一种可能的方法是将用于在数据库中搜索的整个查询存储在一个表中,例如 search_queries

    当用户提交一个搜索表单时,他的查询将被计算并插入到该表中,并被重定向到一个带有搜索散列的页面。每次他导航到另一个页面时,他的哈希值都会从数据库中提取出来,并相应地重新评估结果——当然有适当的限制。

    这种方法的另一个可行实现是将查询存储在会话变量中,并将其用于查询目的。对于分页,您可以 /search?page=1 还有你的 _SESSION['query'] "SELECT * FROM Topics WHERE title LIKE '%test%'" "LIMIT "+($page*$perpage)+", $perpage"

    但是,后一种方法将无法检测到该用户与站点之间的多个窗口。您可以在\u会话['queries']中使用数组,并让用户提交 /search?id=0&page=1 其中id表示在该窗口中查询的数组的哪个查询。