Перевірка, чи була подана форма - PHP


122

Який найкращий спосіб перевірити, подано чи ні форму, щоб визначити, чи слід передавати змінні форми моєму класу перевірки?

Спочатку я подумав:

isset($_POST)

Але це завжди повернеться правдою, оскільки суперглобал визначається скрізь. Мені не хочеться повторювати кожен елемент моєї форми із:

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

Під час написання цього питання я думав про набагато більш базове рішення, додайте приховане поле, щоб діяти як прапор, який я можу перевірити.

Чи є "чистіший" спосіб зробити це, ніж додавати власний прапор?


4
Ну, ви можете зробити кнопку для надсилання, яка має певну назву, наприклад, submitedа потім використовувати php if(isset($_POST['submited']))або прихований вхід ...
Макс Аллан

2
Вам слід додати іменник, щоб запобігти повторному нападу на вашу форму.
хакре

Відповіді:


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'))){що ви звикли використовувати filter_input
depicus

2
POST можна виконати за допомогою Ajax, який не матиме жодної кнопки подання, тому це не є універсальним рішенням.
Мухаммед бін Юсрат

Це правда; він також може перевірити будь-яку змінну, розміщену AJAX.
Цшанд

34

Використовуйте

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

1
Найпростіше рішення. Усі форми повинні мати кнопку подання!
Ань Тран

1
Але деякі форми можуть мати кілька кнопок.
Прогрок

2
@rilwis іноді форми подаються JavaScript і не потребують / мають кнопку для надсилання
Waqas Malik,


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

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.