<MyRusakov.ru />

Программирование на C++ в Unreal Engine 5

Программирование на C++ в Unreal Engine 5

Данный курс научит Вас созданию игр на C++ в Unreal Engine 5. Курс состоит из 12 разделов, в которых Вас ждёт теория и практика. Причём, в качестве практики будет создан весьма крупный проект объёмом свыше 5000 строк качественного кода, который уже на практике познакомит Вас с принципами создания игр на C++ в Unreal Engine 5.

Параллельно с курсом Вы также будете получать домашние задания, результатом которых станет, в том числе, полноценная серьёзная работа для портфолио.

Помимо самого курса Вас ждёт ещё и очень ценный Бонус: «Тестирование Unreal-проектов на Python», в рамках которого Вы научитесь писать очень полезные тесты для тестирования самых разных аспектов разработки игр.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Отмена повторной отправки формы

Отмена повторной отправки формы

Мне часто задают вопросы относительно отмены повторной отправки формы. Например, Вы сделали форму добавления комментария, добавили обработчик на эту же страницу. Затем при добавлении комментария он успешно добавляется, но стоит пользователю нажать F5, как форма будет отправлена ещё раз. А F5 пользователь может легко нажать, если страница будет долго грузиться. В итоге, вместо 1-го комментария будет целых 2, а то и больше. В этой статье я покажу, как этого можно избежать.

Для начала разберём более подробно проблему на примере этого кода:

<?php
  if (!empty($_POST["sqr"])) {
    echo "Квадрат числа ".$_POST["x"]." равен ".pow($_POST["x"], 2);
  }
?>
<form name="form" action="" method="post">
  <div>
    <input type="text" name="x" />
    <br />
    <input type="submit" value="Возвести в квадрат" name="sqr" />
  </div>
</form>

Нажав на кнопку "Возвести в квадрат", Вы увидите результат работы скрипта. Но стоит после этого пользователю нажать F5, как скрипт снова будет выполняться. В данном случае, это не так критично, как с добавлением комментарием, однако, зачем нужна лишняя нагрузка на сервер?

Теперь поговорим о способах решения данной проблемы. Первый способ - выделить скрипт обработки в отдельный файл. Тогда в атрибуте action у тега form надо добавить путь к этому скрипту. А сам скрипт должен сохранять куда-нибудь результат своих действий, либо переменные пришедшие на скрипт, а после делать редирект обратно. В общем, смотрите код скрипта:

<?php
  session_start();
  $_SESSION["x"] = $_POST["x"];
  header("Location: ".$_SERVER["HTTP_REFERER"]);
  exit;
?>

А код страницы с формой теперь будет выглядеть так:

<?php
  session_start();
  if (isset($_SESSION["x"])) echo "Квадрат числа ".$_SESSION["x"]." равен ".pow($_SESSION["x"], 2);
  }
?>
<form name="form" action="request.php" method="post">
  <div>
    <input type="text" name="x" />
    <br />
    <input type="submit" value="Возвести в квадрат" name="sqr" />
  </div>
</form>

Недостаток этого подхода очевиден - приходится создавать ещё один файл для такого простого скрипта. Поэтому рассказываю и про второй способ, как можно избежать повторной отправки формы:

<?php
  session_start();
  if (!empty($_POST["sqr"])) {
    $_SESSION["x"] = $_POST["x"];
    header("Location: ".$_SERVER["REQUEST_URI"]);
    exit;
  }
  if (isset($_SESSION["x"])) echo "Квадрат числа ".$_SESSION["x"]." равен ".pow($_SESSION["x"], 2);
?>
<form name="form" action="" method="post">
  <div>
    <input type="text" name="x" />
    <br />
    <input type="submit" value="Возвести в квадрат" name="sqr" />
  </div>
</form>

Здесь обработка снова происходит в этом же файле, но ключевое отличие - это наличие редиректа на эту же страницу в конце. В результате, страница перегрузится после отправки формы и браузер при нажатии F5 не будет предлагать пользователю отправить форму ещё раз.

Подведу итог того, как отменить повторную отправку формы:

  • Либо делать обработку в отдельном файле, а затем оттуда делать редирект назад.
  • Либо делать обработку в том же файле, что и форма, но при этом после обработки делать редирект на ту же страницу.

Вот так это делается в простых скриптах. Да и, в сложных, в конечном счёте делается то же самое.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (12):

lev_100rus lev_100rus 04.11.2013 23:50:59

Или написать в форме action="."

Ответить

kuller kuller 05.11.2013 05:59:00

все это конечно понятно. Тоже хотел использовать способ на подобии, но у меня форма очень большая. Актуально ли писать значения формы из 57 полей в $_SESSION ?

Ответить

IMoisey IMoisey 05.11.2013 10:07:55

При таком примере писать придется. Редирект убьет все POSTы

Ответить

kuller kuller 05.11.2013 10:16:08

это и так понятно. Мой вопрос стоял актуально ли записывать такое значение полей 57 в $_SESSION

Ответить

IMoisey IMoisey 05.11.2013 10:22:30

А почему нет? <code> foreach($_POST as $k => $v) $_SESSION[$k] => $v; </code>

Ответить

e-five e-five 25.11.2013 01:28:28

А я делал по проще: в форму добавил скрытый input, в котором храниться случайное число генерирующееся php. А также при генерации оно забивается в сессии. Затем при принятии формы сначала проверяется совпадение числа, и если нет совпадения форма не обрабатывается. Это как скрытая капча, которая сама вводиться

Ответить

gagarinm gagarinm 22.05.2014 13:55:04

Я сделал так: if (isset($_POST['knopka'])) { echo 'Работает'; unset ($_POST['knopka']); }

Ответить

Mizar Mizar 10.07.2015 17:58:51

А меня интересует совсем противоположный вопрос! А как зделать чтоб отправка формы продублировалясь три раза с интервалом в секунду! Какой обрабочик нужно добавить в код?

Ответить

Azamatic Azamatic 29.08.2015 19:35:13

Здравствуйте. Не очень понял как делать. Изучаю Ваш курс основы PHP. Перепроверил код, но все равно при обновлении страницы комментарий дублируется. А у Вас на видео все нормально, без всяких редиректов. Вот сам код: <h2>Добавить запись</h2> <form name="guestbook" action="" method="post"> <table> <tr> <td>Имя:</td> <td> <input type="text" name="name" /> </td> </tr> <tr> <td>Комментарий:</td> <td> <input type="text" name="comment" /> </td> </tr> <tr> <td colspan="2"> <input type="submit" name="button_guestbook" value="Добавить" /> </td> </tr> </table> </form> <h2>Записи в гостевой книге:</h2> <div> <?php if (!empty($_POST["button_guestbook"])) { $name = htmlspecialchars($_POST["name"]); $comment = htmlspecialchars($_POST["comment"]); if ((strlen($name) < 3) || (strlen($comment) < 3)) $success = false; else $success = addGuestBookComment($name, $comment); if (!$success) { $alert = "Проверьте введёные данные"; include "alert.php"; } } $comments = getAllGuestBookComments(); for ($i = 0; $i < count($comments); $i++) { $name = $comments[$i]["name"]; $comment = $comments[$i]["comment"]; include "blocks/guestbook_comment.php"; } ?> </div>

Ответить

Gordan Gordan 13.05.2017 14:12:51

Добрый день. У меня не получается предотвратить повторную отправку. Выходят ошибки. Warning: session_start(): Cannot send session cookie - headers already sent by (output started at D:\webServer\OpenServer\domains\sample.local\index.php:3) in D:\webServer\OpenServer\domains\sample.local\index.php on line 30 Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\webServer\OpenServer\domains\sample.local\index.php:3) in D:\webServer\OpenServer\domains\sample.local\index.php on line 30 Warning: Cannot modify header information - headers already sent by (output started at D:\webServer\OpenServer\domains\sample.local\index.php:3) in D:\webServer\OpenServer\domains\sample.local\index.php on line 182

Ответить

ihabia ihabia 18.10.2017 12:35:06

Я конечно извиняюсь, но вы сами то запускали, тестили свои скрипты, во первых после нажатия и отправки запроса белый экран, результаты почему то выводятся в консоле, а во вторых это не работает, т.к. при обновлении данные отправляются повторно. Только что проверил!

Ответить

borismednikov borismednikov 16.05.2023 20:25:45

В статью необходимо сделать важное дополнение о том, что в основном файле сайта (index.php) после вывода результатов обработки формы необходимо обязательно закрыть сессию командой session_destroy(); , иначе скрипт обработки формы будет всегда выводить один и тот же результат вне зависимости от значений введенных в форму, т.к. он использует данные из сессии, а не из формы. Проверено на собственном скрипте.

Ответить

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.