使用goto处理输入

Gaj*_*jus 0 php

第一个例子是使用:

  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>
Run Code Online (Sandbox Code Playgroud)

<?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>
Run Code Online (Sandbox Code Playgroud)

goto方案不优于301

Nie*_*sol 8

XKCD
> xkcd

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

  • HTTP GET 获取网页
  • HTTP POST 通过AJAX提交数据
  • 完成!(可选)使用JavaScript更新当前视图.

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