如何取消发布数组?

时间:2013-01-10 07:54:39

标签: php forms post form-submit

每次刷新页面时,我都会获得存储在post数组中的相同值。 我想要在提交之后执行echo语句,并且在刷新没有回声结果之后...

<?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>

4 个答案:

答案 0 :(得分:2)

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

要确保单条消息,您需要:

一个。在处理完请求后,将用户重定向到其他位置。

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

并在另一个网址上显示该消息。

湾设置一个cookie / session变量,告诉你表单已经处理完毕。

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

第二种方法会在用户关闭浏览器之前终止您的表单,因此您应该执行更复杂的操作 - 例如在表单中存储另一个隐藏字段,并将其存储在会话中。

答案 1 :(得分:1)

如果您提交表单然后刷新生成的页面,浏览器将重新发布表单(通常首先提示)。这就是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();
}

答案 2 :(得分:0)

您需要维护一个状态,以确定是否已显示$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更改为一组nonce,并相应地更新它。

答案 3 :(得分:-1)

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

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