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


redirect to current page if user clicks back or refreshes the page

对不起,我已经发布了这个问题,我在谷歌上搜索了很久,但我仍然无法解决这个

我有一个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是唯一的。