我正在构建一个CRUD应用程序,需要实现两种搜索形式:
基本搜索功能接受关键字并在数据库表中搜索该特定关键字的每一列。搜索关键字将作为URL参数以www.website.com/category?q=keyword的形式发送。这里没什么特别的......
在高级搜索表单中,用户最多可以指定5个关键字,对于每个关键字,他们可以从数据库表中选择需要搜索此关键字的列。简而言之:高级搜索表单最多需要5个关键字 - 列对。此表单通过POST提交(因为我希望避免限制最大URL字符数)。
结果需要分页,每页显示10条记录。我在网上搜索了分页类,但它们都获取了数据库表中的记录总数,然后返回需要为该页面显示的选择。因为我在这里处理大量数据,所以我不能这样做。
这导致我创建自己的分页类,它获取所请求的页码(如果应用,则从搜索表单中获取$ _GET和$ _POST参数)。基于它计算结果总数,计算总页数,决定是否有“上一页”和“下一页”......它还返回一个SQL语句(带有LIMIT和OFFSET值),由特定的模型(使用我自己的MVC架构(也就是没有框架))。这使我只能获取所请求页面的结果。
问题:当用户浏览页面(也就是点击“上一个”或“下一个”按钮)时,$ _POST数据将丢失。但是,需要这些值才能获得另一页的结果。
这个特殊问题让我想到论坛上的搜索表单。我在其中一个上提交了一个查询,并注意到一个搜索ID被附加到URL: example.com/forum/search.php?searchid=5672532
这意味着表单数据被保存在某个地方......我正在考虑最好的选择是什么,从大多数到最不合理: - 数据库表,其中保存每个搜索输入,例如30分钟 - 会议 - 文件 (隐藏字段显然不是一个选项,因为他们需要按下表单提交按钮才能与请求一起发送)
我想在此就此提出意见,你们中的一些人肯定已经遇到过这个问题......
答案 0 :(得分:0)
将搜索参数保存在数据库中的JSON或URL中一段时间(具有expiry
列)似乎是最佳解决方案。
请注意,通过这种方式,您需要使用不同的LIMIT
子句反复查询数据库。