0

最初の例は次を使用しています。

  1. HTTP GETページの読み込みをリクエストします。
  2. HTTP POST リクエスト送信フォーム。
  3. フォームのデータはセッションに保存されます。
  4. HTTP GETページの読み込みをリクエストします。

2 番目の例は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 POSTAJAX 経由でデータを送信する
  • 終わり!必要に応じて、JavaScript を使用して現在のビューを更新します。

または、現在のコードを保持し、if($_SERVER['REQUEST_METHOD'] === "POST")セクション全体をgotoラベルのある場所に移動することもできます。つまり、プログラムの流れを再構築します;)

于 2013-09-30T13:21:17.450 に答える