这就是场景:我填写表格并在数据库中插入一些内容。之后,我被自动重定向到另一个表单。如果用户按下浏览器的后退按钮,因此第二个表单没有填写和提交,我想从数据库中删除他之前插入的内容。
我如何知道用户是否按下了浏览器的后退按钮?
答案 0 :(得分:2)
首先 - 在Zend中无法做到这一点,因为它是客户端操作,而不是服务器端。您可以尝试在第二页上找到一种方法来利用javascript的window.onunload
事件(也是implemented in jQuery),但这确实不是最安全的选项,因为它可能不会在某些浏览器中触发,或者用户可能会他们的javascript关闭了。
您可以在会话中保存第一个表单的最后一个插入ID,并在下次加载页面时检查它是否存在。例如,当用户提交第一个表单时,表示已提交表单A并且已使用此ID保存记录。然后,如果用户提交下一个表单,则清除该标志(表示一切按计划进行)。但是,如果用户按下后退按钮并返回上一页,则检查是否设置了该标志。如果是,则从表中删除记录(因为用户在没有提交第一个表单的情况下按下了该记录)。
此解决方案的问题在于浏览器很可能会加载页面的缓存版本,而您的PHP代码甚至无法执行。因此,您需要在提交第一个表单时检查状态。但是,这会产生另一个问题 - 如果用户提交第一个表单,返回并关闭窗口会怎样?它永远不会运行检查,永远不会删除该行。
在我看来,最可行的选择是修剪第一个表单的记录,比如一小时,而且还没有使用cron作业完成。
没有直接的解决方案,所以我想说在一个页面上都有两个表格的所有字段。这将使你的生活更轻松。
答案 1 :(得分:0)
你到底是什么意思?你想在javascript或后端代码(zend)中检测到它吗?
您可以向表单添加一个令牌(唯一ID),并确保页面缓存一段时间,这样当用户单击后退按钮时,将不会从服务器重新获取页面,从而生成新令牌
编辑:多步向导可以通过多种方式完成,方法是在没有经过身份验证的用户时跟踪令牌,或者根据提交的数据进行检查是否已重新提交。
答案 2 :(得分:0)
我不知道你是否能抓住这个事件(看看history.back())
但我认为更好的方法是在你的数据库上放置一个状态(使用userID或类似的东西)&当状态保持“当前”删除它时做一个cron
答案 3 :(得分:0)
我放弃了插入然后删除的想法。我已经选择在填写两个表格后插入数据。感谢Rikesh Shah的想法!谢谢大家的答案!