我有一个表单(由25个以上的字段组成)和这些字段的值,范围从微小的值到连接的字符串。这就像一个搜索工具。现在,当用户填写表单并提交信息时,他会看到所有与表单中的条件匹配的相关数据。我一次向用户显示15条记录。我已经实现了分页,以便用户也可以查看其他记录。
主要问题:
该部分,直到用户提交信息并返回第一组数据是好的。当用户尝试通过分页转到第2页(或他选择的任何页面)时,会出现问题。用户能够导航到其他页面,但不会触发正确执行以从DB中提取结果所需的查询。请注意,最初它是在窗体中执行的POST操作,并且分页执行GET操作。所以我丢失了用户输入的表单的值,我想保留这些值并使用这些值查询DB。
我试图避免通过GET发送表单字段值,因为我担心数据可能超过URL中的最大允许值(因为它不如POST操作安全)。如果我尝试使用POST操作(如更新查询),可以在结果页面上执行其他操作,这些操作可能导致表单值丢失。由于用户可以选择在具有不同输入的不同选项卡中运行相同的表单来比较结果,因此会话不会真正起作用,这可能导致旧查询的数据被来自较新查询的数据替换。我没有想到cookie,因为用户可能选择阻止它。几乎所有选项似乎都用尽了。
那么我该如何保留表单值,运行正确的查询并获取相关值,而不管相同用户在不同浏览器选项卡/窗口中处理相同表单的次数,而不使用会话(考虑到通过GET传递数据的限制以及可能在POST操作中丢失它们)并且能够在页面上执行其他活动吗?
提前谢谢。
答案 0 :(得分:2)
首先,GET并不比POST更“安全”。两者都不值得信任(它更有吸引力来修改url字符串,但决不会更难)......
您有几个选择:
一,是保持搜索结果的全球“存储”。您可以使用带有id, data
的db表,其中data是变量的序列化数组。然后当有人提交搜索时,检查数据是否在表中。如果是这样,请使用该ID。如果没有,则序列化数据并插入(并获取id)。然后重定向到以下页面:results.php?id=4
。这样,他们可以共享链接,但它可以保持相当安全,不会被篡改(他们不能改变搜索参数)。这里的缺点是,桌子可能会变得巨大。
另一种方法是对数据进行base64编码并将其作为get参数(base64_encode(serialize($data));
)传递。如果你担心篡改或网址长度,我会尽量远离这个。
另一种解决方案是拦截JS中的下一个链接点击,并使用它从隐藏变量向服务器发出POST。
编辑:删除了会话解决方案。意识到它对你的问题不起作用。
答案 1 :(得分:0)
我试图避免发送表单 通过GET的字段值,因为我担心 数据可能超过最大值 URL中的允许值
然后你将不得不对表单进行分页,所以他们也可以POST。要么是这样,要么你必须在服务器端某处存储查询术语,可能在会话中 - 但不要忘记用户可能同时打开多个选项卡,因此你需要能够存储超过每个用户查询。
但是没有理由不能在一个会话中存储多个查询,例如$ _SESSION [ '查询'] [1234]。然后您的分页链接看起来像?query = 1234& page = 3
但请注意,用户能够共享其搜索结果的网址可能很有用。例如,如果Google专门使用POST,我就无法向您发送http://google.com/search?q=somequery
的链接(&因为它不如POST操作安全)
不是。
答案 2 :(得分:0)
一种可能的方法是将用于在数据库中搜索的整个查询存储在名为search_queries
的表中。该表应该基本上包含两列,一个哈希和用于该搜索项的查询。
当用户提交搜索表单时,会评估他的查询并将其插入该表中,并将其重定向到带有search_hash的页面。每当他导航到不同的页面时,他的哈希就会从数据库中提取出来并对结果进行相应的重新评估 - 当然还有适当的限制。
确保您知道该表(为此您可能需要每个搜索项的时间戳)
此方法的另一个可行实现是将查询存储在SESSION变量中,并将其用于查询目的。对于分页,您/search?page=1
和_SESSION['query']
将为"SELECT * FROM Topics WHERE title LIKE '%test%'"
。你基本上会添加"LIMIT "+($page*$perpage)+", $perpage"
然而,后一种方法无法检测此用户对该站点的多窗口。您可以在_SESSION ['queries']中使用数组,并让用户提交/search?id=0&page=1
,其中id表示您在该窗口中查询的数组的查询。