对不起,我已经发布了这个问题,我用谷歌搜索了它仍然无法解决这个问题
我有一个包含表单的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页面中添加什么来阻止它一次又一次地提交表单,如果用户单击浏览器上的后退按钮它不应该指向上一页,它仍然应该重定向到当前页面页。
因此,如果用户单击刷新或后退按钮,它应该仅重定向到当前页面,不应插入任何重复值,并且还应禁用警报框。请在此解释我该做什么,即时通讯深入帮助。谢谢
答案 0 :(得分:1)
您的代码存在许多问题,并且有很多方法可以减轻影响。
首先,为什么要创建重复的条目? 除了数据不良之外,还意味着您的网站容易受到CSRF的攻击。阅读有关如何使用一次性令牌防止CSRF的信息。
如果您的网站出现性能问题,则用户通常会多次点击提交按钮。在解决数据库中的重复提交问题时,使用javascript禁用页面上的提交链接,并提供页面正在执行某些操作的可视反馈。
重定向不是解决问题的方法。
我的老板不想要浏览器的警报框
您是在谈论重复的帖子提醒吗?虽然你可以使用PRG解决这个问题,但这会产生其他问题。
答案 1 :(得分:1)
您必须发布唯一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')?
}
?>
答案 2 :(得分:0)
你需要ON DUPLICATE KEY,这将更新记录而不是创建它的副本: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 所以如果他们点击刷新或重新提交就没关系,如果记录已经存在就会更新。
答案 3 :(得分:0)
解决方案是在数据库操作(如insert,update和 delete)之后重定向页面 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或后退按钮,表单数据将不会再次发布。
答案 4 :(得分:0)
您想要的是在创建表单时在表单中嵌入会话ID,并在服务器上跟踪该会话ID。然后,当提交表单并且您正在服务器上处理表单时,如果表单被多次提交,您可以覆盖数据库中的第一个提交,或者回复错误消息,或者其他任何内容。 (仅在第一次提交时显示弹出窗口,无论如何。)
执行此操作的简单方法是生成会话ID,将其作为表单中的隐藏字段发送,并在提交表单时将会话ID存储在数据库中,并使用会话ID唯一的约束。 / p>
答案 5 :(得分:0)
我会使用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>