0

第一个例子是使用:

  1. HTTP GET请求加载页面。
  2. HTTP POST 请求提交表格。
  3. 表单的数据存储在会话中。
  4. HTTP GET请求加载页面。

第二个示例是使用goto“重排”缓冲区,避免额外的 HTTP 请求。

  1. HTTP GET请求加载页面。
  2. HTTPPOST 请求提交表格。
  3. 缓冲区被刷新并显示内容。

此外,最后一个示例不使用会话。

301

<!DOCTYPE html>
<html>
<head>
    <!-- ow noez! -->
</head>
<body>  
    <?php
    // A very common scenario in user-flow handling is redirecting user to the page itself after submitting form, e.g.

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if (isset($_POST['a'])) {
            // Suppose there was an error & I've populated the error in $_SESSION.
            // Now I would redirect user back to the form. This is because there
            // is markup in the upper template hierarchy layer, e.g. "<!-- ow noez! -->"

            header('Location: ' . $_SERVER['REQUEST_URI']);

            exit;
        }
    }
    ?>

    <form action="" method="post">
        <?php if (isset($time)):?>
        <pre>This value is from the past: <?=$time?></pre>
        <?php endif;?>
        <pre>Next time: <?php $time = time(); echo $time;?></pre>

        <input type="submit" name="a" value="back in time!">
    </form>
</body>
</html>

<?php
goback:

ob_start();
?>
<!DOCTYPE html>
<html>
<head>
    <!-- ow noez! -->
</head>
<body>  
    <form action="" method="post">
        <?php if (isset($time)):?>
        <pre>This value is from the past: <?=$time?></pre>
        <?php endif;?>
        <pre>Next time: <?php $time = time(); echo $time;?></pre>

        <input type="submit" name="a" value="back in time!">
    </form>

    <?php
    // A very common scenario in user-flow handling is redirecting user to the page itself after submitting form, e.g.

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        if (isset($_POST['a'])) {
            ob_clean();

            $_POST = [];
            $_SERVER['REQUEST_METHOD'] = 'GET';

            goto goback;
        }
    }
    ?>
</body>
</html>

goto场景不是优于301吗?

4

1 回答 1

8

xkcd
> xkcd

您是否考虑过使用 AJAX 代替?那么你的流程是:

  • HTTP GET获取网页
  • HTTP POST通过 AJAX 提交数据
  • 完毕!或者,使用 JavaScript 更新当前视图。

或者,您可以保留当前代码并将整个if($_SERVER['REQUEST_METHOD'] === "POST")部分移动到goto标签所在的位置。换句话说,重构程序的流程;)

于 2013-09-30T13:21:17.450 回答