【问题标题】:how to unset post array?如何取消设置帖子数组?
【发布时间】:2013-01-10 07:54:39
【问题描述】:

每次我刷新页面时,我都会得到存储在 post 数组中的相同值。 我只想在提交后和刷新没有回显结果后执行回显语句..

<?php
if(isset($_POST['submit'])) 
{ 
$name = $_POST['name'];
echo "User name : <b> $name </b>";


}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" name="name"><br>
<input type="submit" name="submit" value="Submit Form"><br>
</form>

【问题讨论】:

  • 使用 unset($_POST['value']);
  • 这是预期的行为。如果您刷新已发布的表单,那么它将执行此操作。但是,如果您希望数据在每次提交时只显示一次,您可以存储一个会话变量并对其进行检查。

标签: php forms post form-submit


【解决方案1】:

无论是使用 GET 还是 POST 方法,您都无法从表单中检查它是刷新还是首次提交。

为确保单个消息,您需要:

一个。处理请求后将用户重定向到其他地方。

if(isset($_POST['submit'])) {
  // process data
  header("Location: new-url");
}

并在另一个 URL 上显示消息。

b.设置一个 cookie / session 变量,告诉你表单已经被处理了。

if(isset($_POST['submit']) && !isset($_SESSION['form_processed'])) {
  $_SESSION['form_processed'] = true;
}

第二种方法会杀死你的表单,直到用户关闭浏览器,所以你应该做一些更复杂的事情——比如在表单中存储另一个隐藏字段,并将其存储在会话中。

【讨论】:

    【解决方案2】:

    如果您提交表单然后刷新结果页面,浏览器将重新发布表单(通常会先提示)。这就是为什么 POST 数据总是存在的原因。

    一个选项是存储一个会话变量并将其发送到表单中,然后检查它是否在表单处理代码中匹配 - 以确定它是否是重新发布。

    表格内:

    <input type="hidden" name="time" value="<?php echo $time; ?>" />
    

    在 PHP 中:

    session_start();
    
    if(isset($_POST['submit'])) 
    {
        if(isset($_SESSION['time']) && $_SESSION['time'] == $_POST['time'])
        {
            echo "User name : <b> $name </b>";
        }
    }
    
    $time = $_SESSION['time'] = time();
    

    另一种选择是在处理完发布数据后重定向:

    if(isset($_POST['submit'])) 
    {
        ...
        ...
    
        header('Location: ' . basename($_SERVER['PHP_SELF']));
        exit();
    }
    

    【讨论】:

    • 刷新后报错“注意:未定义索引:时间”
    • 使用header后连名字都打印不出来
    • 我添加了一个isset() 来防止Notice。 session 选项比重定向更好,因为在重定向之前你不能打印任何东西。
    【解决方案3】:

    您需要保持$name 是否已经显示的状态。最简单的方法可能是在浏览器 cookie 中维护该状态。

    <?php
    $nonce = $_COOKIE['nonce'];
    $new_nonce = mt_rand();
    setcookie('nonce', $new_nonce);
    if(isset($_POST['submit']) && $_POST['nonce'] == $nonce) 
    { 
        $name = $_POST['name'];
        echo "User name : <b> $name </b>";
    }
    ?>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <input type="hidden" name="nonce" value="<?php echo $new_nonce ?>">
    <input type="text" name="name"><br>
    <input type="submit" name="submit" value="Submit Form"><br>
    </form>
    

    问题

    • 您正在使用陈旧的变量污染用户“会话”。
    • 如果您的用户打开多个窗口(或选项卡)到同一页面,这将中断。要解决此问题,您必须将 nonce cookie 更改为随机数数组,并相应地更新它。

    【讨论】:

      【解决方案4】:

      如果你想在提交后刷新页面使用

      <form method="get"
      

      确定您的表单是否没有大量数据并且还需要使用 $_GET 而不是 $_POST 变量:) 对你来说是正确的方法,但是这个逻辑不好,需要重构这个脚本:

      <?php
      if(isset($_POST['submit'])) 
      { 
      $name = $_POST['name'];
      echo "User name : <b> $name </b>";
      unset($_POST['submit']);
      }
      ?>
      <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
      <input type="text" name="name"><br>
      <input type="submit" name="submit" value="Submit Form"><br>
      </form>
      

      【讨论】:

        猜你喜欢
        • 2014-03-25
        • 2018-08-17
        • 1970-01-01
        • 2012-07-30
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        相关资源
        最近更新 更多