Простой пример пост-перенаправления-получения кода
Я нашел много сайтов, которые описывают 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'];
.
Мне кажется, что это защита от проблем с перезагрузкой страницы и обратной кнопкой.
Неужели я попытался изобрести колесо?
Ответы
Ответ 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; ?>