Ответ 1
Изменить: Прошло несколько лет с тех пор, как я изначально опубликовал этот ответ, и хотя я получил несколько оборотов, я не очень доволен своим предыдущим ответом, поэтому я полностью его переделал, Надеюсь, это поможет.
Когда использовать GET
и POST
:
Один из способов избавиться от этого сообщения об ошибке заключается в том, чтобы ваша форма использовала GET
вместо POST
. Просто имейте в виду, что это не всегда подходящее решение (см. Ниже).
Всегда используйте POST, если вы выполняете действие, которое вы не хотите повторять, если передается конфиденциальная информация или если ваша форма содержит либо загрузку файла, либо длину всех данных отправлено больше ~ 2000 символов.
Примеры использования POST
:
- Форма входа
- Контактная форма
- Отправить форму оплаты
- Что-то, добавляющее, редактирует или удаляет записи из базы данных
- Загружаемый файл (обратите внимание, что при использовании
GET
с полем<input type="file">
на сервер будет отправлено только имя файла, а 99,73% времени не то, что вы хотите.) - Форма со многими полями (которая создавала бы длинный URL-адрес при использовании GET)
В любом из этих случаев вы не хотите, чтобы люди обновляли страницу и повторно отправляли данные. Если вы отправляете конфиденциальную информацию, использование GET будет не только неуместным, это будет проблемой безопасности (, даже если форма отправлена AJAX), поскольку чувствительный элемент (например, пароль пользователя) отправляется в URL и, следовательно, будут отображаться в журналах доступа к серверу.
Используйте GET для чего угодно. Это означает, что если вы не возражаете, если оно повторяется, для чего-либо, на что вы могли бы предоставить прямую ссылку, когда никакая конфиденциальная информация не передается, когда вы уверены, что ваши длины URL не выйдут из-под контроля и когда ваши формы не имеют загрузки файлов.
Примеры включают:
- Выполнение поиска в поисковой системе
- Форма навигации для навигации по веб-сайту.
- Выполнение одноразовых действий с использованием пароля nonce или одиночного использования (например, ссылка "отписаться" в электронной почте).
В этих случаях POST будет совершенно неуместным. Представьте, если поисковые системы использовали POST для своих поисков. Вы будете получать это сообщение каждый раз, когда обновляете страницу, и вы не сможете просто скопировать и вставить URL-адрес результатов людям, им придется вручную заполнить форму самостоятельно.
Если вы используете POST
:
Для меня, в большинстве случаев, даже если появляется диалоговое окно "Подтвердить форму повторной подачи", это показывает, что существует дефект дизайна. По самой природе POST
, используемой для выполнения деструктивных действий, веб-дизайнеры должны препятствовать пользователям когда-либо выполнять их более одного раза случайно (или намеренно), обновляя страницу. Многие пользователи даже не знают, что означает этот диалог, и поэтому просто нажимают "Продолжить". Что, если это было после запроса "отправить платеж"? Возврат платежа снова?
Итак, что вы делаете? К счастью, у нас есть шаблон дизайна Post/Redirect/Get. Пользователь отправляет запрос POST на сервер, сервер перенаправляет браузер пользователя на другую страницу, и эта страница затем извлекается с помощью GET.
Вот простой пример использования PHP:
if(!empty($_POST['username'] && !empty($_POST['password'])) {
$user = new User;
$user->login($_POST['username'], $_POST['password']);
if ($user->isLoggedIn()) {
header("Location: /admin/welcome.php");
exit;
}
else {
header("Location: /login.php?invalid_login");
}
}
Обратите внимание, что в этом примере, даже когда пароль неправильный, я все еще перенаправляюсь обратно в форму входа. Чтобы отобразить неверное сообщение для входа пользователю, просто выполните что-то вроде:
if (isset($_GET['invalid_login'])) {
echo "Your username and password combination is invalid";
}