如果用户单击或刷新页面,则重定向到当前页面

时间:2012-01-24 11:07:33

标签: php post

对不起,我已经发布了这个问题,我用谷歌搜索了它仍然无法解决这个问题

我有一个包含表单的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页面中添加什么来阻止它一次又一次地提交表单,如果用户单击浏览器上的后退按钮它不应该指向上一页,它仍然应该重定向到当前页面页。

因此,如果用户单击刷新或后退按钮,它应该仅重定向到当前页面,不应插入任何重复值,并且还应禁用警报框。请在此解释我该做什么,即时通讯深入帮助。谢谢

6 个答案:

答案 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>