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

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


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

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

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

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

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

 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 .

Фрагмент кода:

 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(); } 
  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 обратно в браузер, когда пользователь успешно прошел аутентификацию. Таким образом, пользователь перенаправляется на новую страницу.

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 (ie 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 говорится: «Помните, что заголовок header () должен быть вызван до отправки любого фактического вывода, либо с помощью обычных тегов HTML, либо пустых строк в файле, либо из PHP. Очень распространенная ошибка для чтения кода с include или требуют, функции или другую функцию доступа к файлу и имеют пробелы или пустые строки, которые выводятся перед вызовом header (). Такая же проблема существует при использовании одного файла PHP / HTML ».

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

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

Что мы собираемся сделать

У нас есть файл index.php .

  • Мы собираемся представить форму
  • Мы собираемся проверить это сообщение
  • Мы добавим данные 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; ?> с <?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; ?> с <?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; ?>