Проверка отправки формы - 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')


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)";
}

6
Это правильный ответ. Просто проверить $ _POST недостаточно, потому что он мог быть сгенерирован из разных мест ... а не только из сообщения формы. Спасибо, Цшанд.
Хьюстон

В идеале теперь вы должны использовать то, if (null !== (filter_input(INPUT_POST, 'macaddress'))){что заставит
вас

2
POST можно выполнить с помощью Ajax, у которого не будет кнопки отправки, так что это не универсальное решение.
Мухаммад бин Юсрат

Это правда; он также может проверить любую переменную, опубликованную AJAX.
Tzshand

34

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

if(isset($_POST['submit'])) // name of your submit button

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'])){

    }

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)

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)это определенно не способ проверить, была ли отправлена ​​форма.
Лукас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.