#php
#php
Вопрос:
Существует несколько страниц. На этих страницах есть ссылки. Эти ссылки ведут на страницу с формой. Когда форма отправлена, страница, содержащая форму, обновляется для обработки отправленных данных.
Вот в чем вопрос.
Когда страница с формой получит отправленные данные и обработает их, это должно вернуть пользователя на страницу, которая привела его на страницу формы. Как бы вы это сделали, используя PHP?
Ответ №1:
Что мне нравится делать, так это добавлять в массив переменных сеанса каждый раз при обращении к странице под названием «история», и добавлять в массив только в том случае, если последний $_SESSION['history']
элемент не является текущим URL (избегайте нескольких последних записей при обновлении страницы, сбое проверки формы и т.д.). По сути, это крошечный след того, где побывал пользователь. Когда вы обрабатываете форму — отправьте пользователя обратно к тому значению массива, которое является самым последним, исключая URL текущей формы, если хотите. Просто убедитесь, что установлено значение по умолчанию на случай, если нет истории.
$_SERVER['HTTP_REFERER']
иногда может сработать, но у меня были серьезные проблемы с этим, и во многих случаях это не работает (обновление, переход с той же страницы, ввод URL-адреса формы, переход по ссылке электронной почты и т.д.) Лично я этого строго избегаю, поскольку это может привести к неустойчивому поведению и циклам перенаправления, если вы не будете осторожны с этим. На самом деле я бы просто никогда не использовал его для перенаправления.
Комментарии:
1. Это очень интересный подход. Похоже, что его можно было бы использовать для решения множества проблем. Спасибо!
2. Я сделал предположение здесь, что вы могли бы разобраться в коде, если бы у вас была концепция, я, вероятно, прав? Я могу поделиться кодом, если это необходимо, но я могу работать медленно. Мне пришлось бы перепроектировать его в ванильный php.
3. Конечно, я понимаю. Еще раз спасибо!
4. Просто запоздалая мысль, которую я забыл упомянуть: убедитесь, что вы не добавляете в историю ни один URL, на который невозможно перенаправить должным образом, например, URL действия формы или страницу входа / выхода. Мое общее правило — не устанавливать его, пока я не собираюсь сгенерировать HTML-страницу.
5. Плохая техника. Пользователи могут одновременно открывать 2 или более вкладок на одном и том же сайте, а вы отправляете их в никуда. Описанные ситуации являются серьезными для процессора веб-форм? В любом случае, как эта ситуация решается с помощью переменной СЕАНСА?
Ответ №2:
Эта концепция известна как получение после перенаправления. Вопрос в том, всегда ли пользователь возвращается к одной и той же статической исходной странице, или есть много страниц, которые могут привести пользователя к этой форме? Если последнее верно, просто добавьте реферер ( $_SERVER['HTTP_REFERER']
) в качестве элемента формы, чтобы записать, откуда они пришли. php-код:
<?php
class controller {
//for chaining
public static function _() { return new self; }
public function GET() {
//dispay form
}
public function POST() {
//process form
//add errors to session
if (!empty($_SESSION['form errors']) {
$this->redirect($_SERVER['PHP_SELF']);
}
else {
$this->redirect("original-user-location", true, 303);
}
}
private function redirect($loc) {
header("Location: $loc", true, 303);
exit;
}
//ignore PUT, DELETE
public function __call($_, $_) {}
}
controller::_()->$_SERVER['REQUEST_METHOD']();
?>
Комментарии:
1. Это прекрасно! Я использовал cookies для выполнения того же самого, и это намного элегантнее. Спасибо!
2. Однако это не сработало бы, если данные формы не будут проверены с первого раза и страница формы будет обновлена во второй раз, не так ли?
3. Вы просто отслеживаете данные формы пользователя в сеансе. В GET заполните их входные данные из этого. Пользователь может обновлять столько, сколько он хочет сейчас, это не очистит данные сеанса. Вы можете сделать это позже.