代码之家  ›  专栏  ›  技术社区  ›  wheresrhys

在按F5时避免在PHP中重新提交表单

  •  14
  • wheresrhys  · 技术社区  · 15 年前

    我的网站上有以下代码(使用php和smarty),以避免在我点击f5时重新提交表单:

    if ($this->bln_added == false) {
        if (isset($_POST['submit'])) {
            $this->obj_site->obj_smarty->assign('title', $_POST['tas_heading']);
            $this->obj_site->obj_smarty->assign('desc', $_POST['tas_description']);
        }
    } else {
        $this->obj_site->obj_smarty->assign('title', '');
        $this->obj_site->obj_smarty->assign('desc', '');
        unset($_POST);
    }
    

    默认情况下,添加的bln_为false,但一旦表单成功提交,则更改为true。模板中使用了smarty变量title和desc来保存表单内容,以防出现用户错误,需要更改输入内容。

    如果表单提交成功,它会将bln_added设置为true,因此第二位代码不仅应该清除表单字段,还应该清空$_post。但是如果我按F5键的话,发帖数据仍然存在。

    有什么想法吗?

    10 回复  |  直到 6 年前
        1
  •  39
  •   Tom Wright    15 年前

    你的方法理论上可行,但有一个更简单的方法。

    成功提交表单后,执行重定向。去哪里不重要,但它会清除掉美元的邮件。

    header('Location: http://www.example.com/form.php');
    

    在您的情况下,听起来您想重定向到已经打开的页面。如果要显示确认消息,请在URL中附加一个$\u get参数。

    希望这有帮助,

    汤姆

        2
  •  9
  •   David Snabel-Caunt    15 年前

    解决方案是一种通常称为 Post/Redirect/Get

        3
  •  6
  •   Michael Wales    15 年前

    处理表单的最佳方法是使用自提交和重定向。像这样:

    if (isset($_POST)) {
      // Perform your validation and whatever it is you wanted to do
      // Perform your redirect
    }
    
    // If we get here they didn't submit the form - display it to them.
    

    使用 CodeIgniter framework :

    function index() {
      $this->load->library('validation');
      // Your validation rules
    
      if ($this->form_validation->run()) {
        // Perform your database changes via your model
        redirect('');
        return;
      }
      // The form didn't validate (or the user hasn't submitted)
      $this->load->view('yourview');
    }
    
        4
  •  2
  •   ShiftedReality    10 年前

    您可以将表单提交重写为Ajax方式。如果需要显示HTML内容,请以JSON格式返回,并使用javascript插入(例如jquery)。

        5
  •  1
  •   stema Arun Mohan    13 年前

    我(用php)通过以下方法解决了这个问题:

    1. 在表单中添加一个不基于time()的唯一标识符(id+counter)(!!!!)

    2. 发布到一个单独的文件(postform.php),该文件检查具有该唯一标识符的会话。

    3. a)如果找不到具有唯一标识符的会话:发布到数据库并使用唯一标识符填充会话

      b)如果找到具有唯一标识符的会话:不执行任何操作

    4. 在3a/3b之后,重定向到带有标题的结果页(“位置: http://mydomain.com/mypage

    结果是:
    在刷新/后退按钮上没有重新提交操作,只有在双击后退按钮时重新提交警告(但没有重新提交操作)

        6
  •  1
  •   bytecode77    11 年前

    成功执行后使用标题位置

    header('Location: '.$_SERVER['HTTP_REFERER']);
    
        7
  •  1
  •   Misterk    9 年前

    如果在代码末尾使用header()或exit(),例如,在保存一些数据之后,它对我很有用。

        8
  •  1
  •   Ajith    7 年前

    我发现最好的方法是使用JavaScript和CSS。common php redirection method header('位置: http://www.yourdomain.com/url );会起作用,但会在不同的框架和CMS(如Wordpress、Drupal等)中发出“警告:不能修改头信息-头已经发送”的警告,因此我建议遵循以下代码

    echo '<style>body{display:none;}</style>'; 
    echo '<script>window.location.href = "http://www.siteurl.com/mysuccesspage";</script>'; 
    exit;
    

    样式标记很重要,否则用户可能会觉得页面被加载了两次。如果我们使用带有body display none的样式标记,然后刷新页面,那么用户体验将类似于php头(“位置:…);

    我希望这会有所帮助:)

        9
  •  0
  •   Mangirdas Skripka    13 年前

    需要在发布后重新定向标题,但不充分。

    在PHP端,成功提交表单后,执行重定向。例如,header('位置: http://www.example.com/form.php “”;

    但这还不够。有些用户按两次链接(双击)。需要一个javascript,它将在第一次单击后禁用提交按钮。

        10
  •  0
  •   Adrian Rybka    6 年前

    试试我自己的解决方案,也许这不是最好的解决方案(很快就完成了),但我已经测试过了,而且效果很好。在铬上测试。 Click to see how it looks

     <?php 
    session_start(); // Start session
    ?>
    <html>
     <head>
      <title>
        Test
      </title>
     </head>
     <body>
       <form name="test" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post">
       <input type="text" name="name"><br>
       <input type="submit" name="submit" value="Submit Form"><br>
      </form>
    
      <?php
    
      if(isset($_POST['submit']))
        {
         $_SESSION['name'] = $_POST['name']; //  Assign $_POST value to $_SESSION variable
          header('Location: refresh.php'); // Address of this - reloaded page - in this case similar to PHP_SELF
        } else session_destroy(); // kill session, depends on what you want to do / maybe unset() function will be enough
    
      if(isset($_SESSION['name']))
        {
         $name = $_SESSION['name'];
    
         echo "User Has submitted the form and entered this name : <b> $name </b>";
         echo "<br>You can use the following form again to enter a new name."; 
        }
      ?>
     </body>
    </html>