我有一个简单的 php 表单,它在按下 SUBMIT 按钮时提交(POSTS)数据,并显示“谢谢”页面,数据存储在数据库中。
通常在此感谢页面上,如果您按浏览器上的“后退”按钮,然后按浏览器上的“前进”按钮,您将返回到相同的感谢页面,但不会再次提交表单。
在过去的几天里,当我在浏览器上执行 BACK 和 FORWARD 时,表单会重新提交数据,并且数据库中有一个重复的条目。这只发生在 Chrome 中。
我在 Chrome 的设置中犯了一些错误,还是在某个地方有其他问题?
典型的解决方案称为POST
–Redirect–<code>GET。本质上,您的表单发布到一个页面,该页面将数据插入数据库或任何其他必要的操作,然后重定向到另一个页面。其他页面实际上并没有做任何事情,只是显示一条成功消息或其他内容。这样,您在历史记录中有两个条目:表单和成功页面。表单发布页面永远不会添加到历史记录中;按后退或前进将跳过提交。
生成一个值并将其放入隐藏字段中。如果用户提交表单存储该值(必须是唯一的)。如果尝试使用相同的生成值再次提交表单,则不要执行插入或更新。
您可以设置一个 cookie 或会话,说明表单已经提交,如果设置了,请不要重新提交表单,但这基本上是一个创可贴,甚至可能不起作用......
您真正应该做的是通过检查输入值与数据库中的现有值(例如电子邮件或用户名)来避免重复。您还应该在数据库中将您的电子邮件和用户名字段设置为唯一,这样您就不会得到重复的电子邮件地址或用户名 - 解决您的问题。
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')) {
// 1. check if $_POST['email'] already exists in the database
// 2. if email doesn't exist, insert data
}
问题是,当您到达成功页面并刷新时,浏览器必须重新提交缓存数据;因为它到达的页面是动态生成的。现在,当您单击确定时,将重新提交先前存储在 $_POST 变量中的数据。要阻止它,您将使用动态绑定而不是静态绑定。
这个问题的一个简单解决方案是:
<form action="">
.onclick
预期按钮的 javascript 方法。