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