对不起,我已经发布了这个问题,我在谷歌上搜索了很久,但我仍然无法解决这个
我有一个php页面,它有一个表单,当用户单击刷新或F5时,它会在数据库中创建重复的值,还会向用户发出一条消息,指示重新提交可能会在数据库插入重复的值。我的老板不希望浏览器的警告框给用户,也不希望在数据库中插入重复的值
我知道它的header()
。我读了很多php手册中的header()
和server_name
函数,但我仍然尝试了很多方法放在顶部,但都无法解决。这非常重要。有人能帮我提供一个代码示例来解释如何操作吗?非常感谢您的帮助。
<form method="post" action"demo.php">
<input name="fname" type="text">
<input type="submit" value="submit">
</form>
demo.php
<?php
$firstname = $_POST['fname'];
?>
告诉我应该在demo.php页面中添加什么来阻止它一次又一次地提交表单,而且如果用户单击浏览器上的后退按钮,它不应该指向上一页,它仍然应该重定向到当前页。
所以,若用户点击刷新或返回按钮,它应该只重定向到当前页面,不应该插入任何重复的值,并且警报框应该被禁用。请解释我在这里该做什么,我帮了很大的忙。感谢
您的代码有很多问题,有很多方法可以减轻影响。
首先,为什么要创建重复条目?除了坏数据的问题还意味着你的网站容易受到CSRF的攻击。请阅读如何使用一次性代币防止CSRF。
如果你的网站有性能问题,那么用户通常会多次点击提交按钮。在解决数据库中的重复提交问题时,请使用javascript禁用页面上的提交链接,并提供页面正在执行某些操作的视觉反馈。
重定向不是解决问题的方法。
我的老板不想要浏览器的提醒框
你说的是重复发布警报吗?虽然使用PRG可以解决这个问题,但这会产生其他问题。
您必须发布一个唯一的id(session_id)并将其保存在数据库中。注册时,请测试session_id是否已经存在。如果是,请向用户发送消息。"你已经寄出了这份表格"
代码:
<?php session_start; ?>
<form method="post" action"demo.php">
<input name="fname" type="text">
<input type="submit" value="submit">
<input type="hidden" name="session_id" value="<?php echo session_id();?>">
</form>
demo.php
<?php
//test session_id in database
$session_id = session_id();
mysql_connect('localhost','xxx','xxx');
mysql_select_db('xxx');
$return = mysql_query("SELECT COUNT(*) AS nb_data FROM TABLENAME WHERE session_id='".session_id()."'");
$data = mysql_fetch_assoc($return);
if ($data['nb_data'] == 0){
echo 'Your message';
}
else{
$firstname = $_POST['fname'];
//.....
header('location:xxx.php')?
}
?>
我会使用php头函数来替换当前位置,这样如果用户单击刷新,它就不会转发信息和会话来存储发布的值并检查是否重新提交。demo.php
<?php
session_start();
if($_POST)
{
if(!isset($_SESSION[fname]))
{
//database queries here
}
$_SESSION[fname] = $_POST['fname'];
header('location:demo.php', true); //true replaces the current location
}elseif(!issset($_SESSION[fname])){
header('location:form.php');
}
$firstname = $_SESSION[fname];
?>
form.php
<form method="post" action"demo.php">
<input name="fname" type="text">
<input type="submit" value="submit">
</form>
您需要ON DUPLICATE KEY,这将更新记录,而不是创建它的副本:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html因此,他们是否点击刷新或重新提交都无关紧要,如果记录已经存在,它只会被更新。
解决方案是在执行插入、更新和删除等数据库操作后重定向页面pageName:test.php
if(isset($_REQUEST['deleteBtn']))
{
$emp_id=$_REQUEST['emp_id'];
$count=mysql_query("delete from employees where emp_id=$emp_id");
header("location:test.php");
}
这样,如果您单击F5或后退按钮,表单数据将不会再次发布。
您想要的是在创建表单时将会话id嵌入表单中,并在服务器上跟踪该会话id。然后,当表单提交并且您正在服务器上处理表单时,如果表单提交了多次,您可以覆盖数据库中的第一次提交,或者以错误消息或其他方式进行响应。(只在第一次提交时显示弹出窗口,不管怎样。)
一种简单的方法是生成会话id,将其作为表单中的隐藏字段发送,并在提交表单时将会话id存储在数据库中,同时限制会话id是唯一的。