Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Как работает перезапрос страницы?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: не могу понять
Vechnost
Отправлено: 13 Ноября, 2014 - 03:14:51
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2014  


Помог: 0 раз(а)




Смотрю курсы УЦ "Специалист". Там рассказывается такой рецепт.

Для формы по умолчанию (если не указан) используется метод GET. Обновление страницы по f5 - это повтор предыдущего запроса. Если кто-то ввёл данные в форму, а потом обновил страницу по f5, то ещё одна копия записи будет занесена в базу. Дабы избежать этого, можно использовать перезапрос страницы методом GET.

Дело в том, что все страницы по умолчанию загружаются методом GET. Если на странице есть форма с методом POST, то при нажатии enter она летит, само собой, post'ом. Пишем:

<?
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = strip_tags($_POST["name"]);
$age = $_POST["age"] * 1;

// Сохранение в cookie на сутки
setcookie("userName", $name, time() + 24*60*60);
setcookie("userAge", $age, time() + 24*60*60);

header("Location: ".$SERVER["PHP_SELF"]);
}
else {
// Чтение куки
$name = strip_tags($_COOKIE["userName"]);
$age = $_COOKIE["userAge"] * 1;
}
?>

Когда мы в следующий раз обновляем страницу, форма посылается вновь, НО браузер натыкается на

header("Location: ".$SERVER["PHP_SELF"]);

Фича в том, что header("Location: ".$SERVER["PHP_SELF"]) запрашивает страницу методом GET.

Итак, браузер принимает ответ на post-запрос, НО после get-перезапроса предыдущий post-запрос обрывает и просит get-ответ. А поскольку этот запрос GET, а не POST, запись не отправляется и дублирования коммента (статьи, и т.п.) не происходит.

Вот весь скрипт:

-------------------------------- -

<?
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = strip_tags($_POST["name"]);
$age = $_POST["age"] * 1;

// Сохранение в cookie на сутки
setcookie("userName", $name, time() + 24*60*60);
setcookie("userAge", $age, time() + 24*60*60);

header("Location: ".$SERVER["PHP_SELF"]);
exit();
}
else {
// Чтение куки
$name = strip_tags($_COOKIE["userName"]);
$age = $_COOKIE["userAge"] * 1;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>
<title>Сохранение состояния формы</title>
</head>

<body>
<h1>Сохранение состояния формы</h1>
<form action="<?=$_SERVER["PHP_SELF"]?>" method="post">
Ваше имя:
<input type="text" name="name" value="<?=$name?>"><br>
Ваш возраст:
<input type="text" name="age" value="<?=$age?>"><br>
<input type="submit" value="Передать">
</form>
<?
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($name and $age) {
echo "<h1>Привет, $name</h1>";
echo "<h3>Тебе $age лет</h3>";
}
else {
print "<h3>Заполните все поля!</h3>";
}
}
?>
</body>
</html>

--------------------------

Я так понимаю, что, по логике препода, после первой отправки формы всё должно заноситься куки и отображаться:

if ($_SERVER["REQUEST_METHOD"] == "POST") {
if ($name and $age) {
echo "<h1>Привет, $name</h1>";
echo "<h3>Тебе $age лет</h3>";
}
else {
print "<h3>Заполните все поля!</h3>";
}
}

а после попытки обновить по f5 не должна отображаться даже форма (exit блокирует её прорисовку):

header("Location: ".$SERVER["PHP_SELF"]);
exit();

Но ведь здравый смысл подсказывает, что данные не должны отправляться даже в первый раз! собственно, в моём файле так и происходит.

get-перезапрос обрывает post-запросы, при этом первый post-запрос почему-то обрываться не должен. Ребят, ну почему данные в первый-то раз отправляются??? Ведь не должны! и в моём скрипте не отправляются! Почему это у бауманского препода работает??!!! Почему это вообще должно работать? Разве header("Location: ".$SERVER["PHP_SELF"]) не должно вообще препятствовать отправке post-запроса?

Вот не могу понять, хоть тресни. Несколько раз этот фрагмент видео пересмотрел - не понял. Эта информация не даёт мне покоя. Может, растолкуете?

Ещё раз:

$name = strip_tags($_POST["name"]);
$age = $_POST["age"] * 1;
setcookie("userName", $name, time() + 24*60*60);
setcookie("userAge", $age, time() + 24*60*60);

header("Location: ".$SERVER["PHP_SELF"]);
exit();

Обрывающий перезапрос - сразу после действий по обработке данных. Разве может информация отправиться хоть раз?
 
 Top
DelphinPRO
Отправлено: 13 Ноября, 2014 - 05:22:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Допустим у нас есть следующее:
по запросу post.php?id=1 показываем пост (статью).
Также на этой странице есть форма добавления комментария, которая улетает на адрес
post.php?id=1&action=save_comment (метод отправки - POST)

значит делаем простые проверки

PHP:
скопировать код в буфер обмена
  1. if (isset($_GET['action'])) {
  2.   // нужно выполнить какое-то действие
  3.   if ($_GET['action'] == 'save_comment') {
  4.     // нужно сохранить в базу комментарий
  5.     $postId = $_GET['id'];
  6.     $comment = $_POST['comment'];
  7.     // ... дальше сохраняем
  8.   }
  9.   // После выполнения любого действия нужно перегрузить страницу
  10.   header ('Location: post.php?id='.$postId);
  11.   exit; // После перенаправления нет смысла продолжать что-то делать
  12. }
  13.  
  14. // А тут код для показа поста (статьи)
  15. ...


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
kotyara1979
Отправлено: 13 Ноября, 2014 - 06:09:18
Post Id


Частый гость


Покинул форум
Сообщений всего: 247
Дата рег-ции: Окт. 2012  


Помог: 7 раз(а)




У вас по коду никакой GET-переадресации нет.

У вас просто ошибка в коде. Нужно:
PHP:
скопировать код в буфер обмена
  1. header("Location: ".$_SERVER["PHP_SELF"]);

вместо вашего

Отсюда повторные отправки POST-ом форм по F5.

А так код рабочий. Единственно только, последний блок никогда отображаться не будет.


-----
Сделать можно все. Главное одеть каску.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB