Подтвердить что ты не робот

Простой пример пост-перенаправления-получения кода

Я нашел много сайтов, которые описывают PRG, но простой пример кода PHP.


Вот что я реализовал:

  • form.php имеет действие: validate.php.
  • Пользователь validate.php никогда не видит; если проверяет все $_GET и, если действительный записывает его в базу данных и генерирует HTML-страницу подтверждения, если она не действительна, она генерирует HTML-страницу с ошибкой, объясняя, что не так.
  • Какой бы HTML-код не генерировался, он сохраняется в переменной $_SESSION, а затем validate.php вызывает header('Location: <as appropriate>);.
  • submitted.php of invalid_input.php (в случае, если пользователь читает URL-адрес) состоит только из echo $_SESSION['form_html'];.

Мне кажется, что это защита от проблем с перезагрузкой страницы и обратной кнопкой.

Неужели я попытался изобрести колесо?

4b9b3361

Ответ 1

Самый простой сценарий:

if ($_POST) {
   // Execute code (such as database updates) here.

   // Redirect to this page.
   header("Location: " . $_SERVER['REQUEST_URI']);
   exit();
}

Используйте REQUEST_URI. Не используйте PHP_SELF, как в большинстве систем CMS и фреймворки PHP_SELF будут ссылаться на /index.php.

Ответ 2

Отрывок кода:

if (count($_POST)) {
    // process the POST data
    // your code here- so for example to log a user in, register a new account..
    // ...make a payment...etc

    // redirect to the same page without the POST data, including any GET info you
    // want, you could add a clause to detect whether processing the post data has 
    // been successful or not, depending on your needs

    $get_info = "?status=success";

    // if not using rewrite
    // header("Location: ".$_SERVER['PHP_SELF'].$get_info);

    // if using apache rewrite
    header("Location: ".$_SERVER['REQUEST_URI'].$get_info);
    exit();
}

Ответ 3

    Browser
   HTML form
  method=POST
       |
       v
    PHP app
  reads $_POST
sends 303 header
       |
       v
    Browser
receives header
 redirected to
   new page
       |
       v
    PHP app
  reads $_GET
 does whatever

Обычно используется аутентификация входа. Это процесс, когда пользователь отправляет регистрационную форму. Приложение PHP проверяет подлинность пользователя через $_POST vars. Отправляет заголовок 303 обратно в браузер, когда пользователь успешно прошел аутентификацию. Таким образом, пользователь перенаправляется на новую страницу.

Ответ 4

Caller.htm

<form method="post" action="Callee.php?Query1">
    <input type="text"   name="PostData" />
    <input type="submit" value="Go"      />
</form>

Callee.php (вызывается дважды.)

if ($_POST) {
    header("Location: ". $_SERVER['REQUEST_URI']. 'Query2'); 
    // PART1: Use $_POST and $_GET to execute database updates here...

    // Now any display (i.e. echo or print) will come after the header.
    // ...


   die;  // When done, GET 'myself' to execute PART2 below.
}


// PART2: Results page goes here...
echo 'PART 2 display output: '; var_dump($_GET);

Обратите внимание, что задействованы две строки запросов

Посмотрите, что говорит var_dump около $_GET:

PART 2 display output: array(1) { ["Query1Query2"]=> string(0) "" } 

Проблемы с помещением заголовка в конце раздела POST следующим образом:

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

В руководстве php говорится: "Помните, что заголовок() должен быть вызван до того, как будет отправлен любой фактический вывод, либо с помощью обычных тегов HTML, либо пустых строк в файле, либо из PHP. Очень распространенная ошибка для чтения кода с помощью включать или требовать функции или другую функцию доступа к файлу, а также иметь пробелы или пустые строки, которые выводятся перед вызовом header(). Такая же проблема существует при использовании одного файла PHP/HTML."

Однако, если вам нужно построить "Query2" на основе того, что происходит в разделе POST, возможно, это должно быть в нижней части раздела POST. Это нормально, если вы не пытаетесь вставить какое-либо эхо над ним, даже не для тестирования.

Ответ 5

Я хотел бы представить вам метод, который часто используется в большем масштабе и гораздо более подробно в рамках.

Что мы будем делать

У нас есть файл под названием index.php.

  • Мы собираемся отправить форму
  • Мы собираемся проверить этот submit
  • Мы добавим данные POST в сеанс
  • Мы перенаправим пользователя на страницу подтверждения.
  • Мы отобразим данные и дадим подтверждение пользователю.
  • Мы отправим и, наконец, обработаем данные.
  • Мы перенаправим обратно на index.php и покажем уведомление.

Код

<?php
if (!isset($_SESSION)) session_start();

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    switch ($_POST['submit']) {
        case 'add':
            // This is where our first POST will end up
            // We can perform actions such as checking the data here

            // After that we will add the POST data to a session
            $_SESSION['postdata'] = $_POST;
            // and unset the $_POST afterwards, to prevent refreshes from resubmitting.
            unset($_POST);

            // Now we will redirect...
            header("Location: ".$_SERVER['PHP_SELF']);
            break;
        case 'confirm':
            // We can now insert the data into the database or email it

            // Then we will unset the session and redirect back
            unset($_SESSION['postdata']);

            // This is to display our notification
            $_SESSION['success'] = true;

            // And there we go again...
            header("Location: ".$_SERVER['PHP_SELF']);
            break;
    }
    // We will exit here because we don't want the script to execute any further.
    exit;
}
?>

<?php if (isset($_SESSION['success']) && $_SESSION['success'] == true): ?>
    <p>Our data has been processed succesfully</p>
    <?php unset($_SESSION['success']); ?>
<?php endif; ?>

<?php if (isset($_SESSION['postdata'])): ?>
    <p>
        You want to add the following data:<br />
        <pre><?php print_r($_SESSION['postdata']); ?></pre>
        Is this correct?<br />
        <form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>">
            <button type="submit" value="confirm">Yes</button>
        </form>
    </p>
<?php else: ?>
    <p>
        <form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>">
            <input type="text" name="..."><br />
            <input type="text" name="..."><br />
            <input type="text" name="..."><br />
            <input type="text" name="..."><br />
            <button type="submit" value="add">Add something</button>
        </form>
    </p>
<?php endif; ?>