Проверка отправки формы - PHP

122

Как лучше всего проверить, была ли отправлена ​​форма, чтобы определить, следует ли передавать переменные формы в мой класс проверки?

Сначала я подумал, может быть:

isset($_POST)

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

if(isset($_POST['element1']) || isset($_POST['element2']) || isset(...etc

Во время написания этого вопроса я подумал о гораздо более простом решении: добавить скрытое поле, которое будет действовать как флаг, который я могу проверить.

Есть ли более «чистый» способ сделать это, чем добавить собственный флаг?

анонимное
источник
4
Ну, вы можете создать кнопку отправки с определенным именем, например, submitedа затем использовать php if(isset($_POST['submited']))или скрытый ввод ...
Макс Аллан
2
Вы должны добавить уведомление, чтобы предотвратить повторные атаки на вашу форму.
hakre

Ответы:

191

Для общей проверки, было ли POSTдействие, используйте:

if (!empty($_POST))

РЕДАКТИРОВАТЬ : Как указано в комментариях, этот метод не будет работать в некоторых случаях (например, с флажками и кнопкой без имени). Вам действительно стоит использовать:

if ($_SERVER['REQUEST_METHOD'] == 'POST')
Матино
источник
168

Как насчет

if($_SERVER['REQUEST_METHOD'] == 'POST')
Olaf
источник
69

Собственно, кнопка отправки уже выполняет эту функцию.

Попробуйте в ФОРМЕ:

<form method="post">
<input type="submit" name="treasure" value="go!">
</form>

Затем в обработчике PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}
Tzshand
источник
6
Это правильный ответ. Просто проверить $ _POST недостаточно, потому что он мог быть сгенерирован из разных мест ... а не только из сообщения формы. Спасибо, Цшанд.
Хьюстон
В идеале теперь вы должны использовать то, if (null !== (filter_input(INPUT_POST, 'macaddress'))){что заставит
вас
2
POST можно выполнить с помощью Ajax, у которого не будет кнопки отправки, так что это не универсальное решение.
Мухаммад бин Юсрат
Это правда; он также может проверить любую переменную, опубликованную AJAX.
Tzshand
34

использование

if(isset($_POST['submit'])) // name of your submit button
Rikesh
источник
1
Самое простое решение. Во всех формах должна быть кнопка отправки!
Anh Tran
1
Но в некоторых формах может быть несколько кнопок.
Progrock
2
@rilwis иногда формы отправляются с помощью JavaScript и не нуждаются / имеют кнопку отправки
Вакас Малик
14

Попробуй это

 <form action="" method="POST" id="formaddtask">
      Add Task: <input type="text"name="newtaskname" />
      <input type="submit" value="Submit"/>
 </form>

    //Check if the form is submitted
    if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['newtaskname'])){

    }
Rizon
источник
2
Этот метод является наиболее рекомендуемым, поскольку он, кажется, признан «лучшей практикой» «академией кодирования».
Darkeden 03
1

С другой стороны, всегда полезно добавить токен в вашу форму и проверить его, чтобы проверить, не были ли данные отправлены извне. Вот шаги:

  1. Создайте уникальный токен (вы можете использовать хеш) Пример:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Назначьте этот токен переменной сеанса. Пример:

    $_SESSION['form_token'] = $token;
  3. Добавьте скрытый ввод для отправки токена. Пример:

    input type="hidden" name="token" value="{$token}"
  4. затем в рамках проверки проверьте, соответствует ли отправленный токен переменной сеанса.

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....
Профессор
источник
0

У меня была та же проблема - также убедитесь, что вы добавили name=""кнопку ввода. Что ж, это исправление сработало для меня.

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

<input type="submit" name="add" value="Submit">
Джен
источник
-6

Вы также можете использовать:

is_array($_POST)
SW4
источник
4
is_array($_POST)всегда дает истину (на моей машине). По stackoverflow.com/questions/5594020/php-check-if-post-is-array : $_POST is a superglobal array which is always defined, unless somewhere in your code you either unset or overwrite $_POST somehow, так что кажется , следует ожидать , что это всегда возвращает истину ..
GitaarLAB
is_array($_POST)это определенно не способ проверить, была ли отправлена ​​форма.
Лукас