如何使用PHP在浏览器上按“刷新”按钮删除$ _POST变量?

php
2022-08-30 10:53:49

当我按下浏览器上的“刷新”按钮时,似乎该变量在整个刷新过程中被保留。$_POST

如果我想删除内容,我该怎么办?用于的领域没有帮助。$_POSTunset$_POST

帮助?谢谢!


答案 1

请求标头包含一些 POST 数据。无论您做什么,当您重新加载页面时,都会再次发送请求。

简单的解决方案是重定向到一个新的(如果不相同)页面。这种模式在Web应用程序中非常常见,称为Post/Redirect/Get。所有表单通常都执行POST,如果成功,则应执行重定向。

尝试尽可能多地将视图脚本(主要是 html)与控制器脚本(业务逻辑和内容)分开(在不同的文件中)。通过这种方式,您将始终将数据发布到单独的控制器脚本,然后重定向回视图脚本,该脚本在呈现时,请求标头中将不包含 POST 数据。


答案 2

为了防止用户刷新页面或按后退按钮并重新提交表单,我使用以下简洁的小技巧。

<?php

if (!isset($_SESSION)) {
    session_start();
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $_SESSION['postdata'] = $_POST;
    unset($_POST);
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
}

// This code can be used anywhere you redirect your user to using the header("Location: ...")
if (array_key_exists('postdata', $_SESSION)) {
    // Handle your submitted form here using the $_SESSION['postdata'] instead of $_POST

    // After using the postdata, don't forget to unset/clear it
    unset($_SESSION['postdata']);
}
?>

POST 数据现在位于会话中,用户可以根据需要刷新任意数量。它将不再对您的代码产生影响。

用例/示例

<!-- Demo after submitting -->
<?php if (array_key_exists('postdata', $_SESSION)): ?>
    The name you entered was <?= $_SESSION['postdata']['name']; ?>.
    <!-- As specified above, clear the postdata from the session -->
    <?php unset($_SESSION['postdata']); ?>
<?php endif; ?>

<!-- Demo form -->
<?php if (!isset($_SESSION['postdata'])): ?>
<form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>">
    Name: <input type="text" name="name" /><br />
    <input type="submit" value="Submit" />
</form>
<?php endif; ?>

推荐