Перевірте, чи існує $ _POST


100

Я намагаюся перевірити, чи існує $ _POST, і якщо він є, надрукуйте його в іншій рядку, якщо ні, не друкуйте взагалі.

щось на зразок цього:

$fromPerson = '+from%3A'.$_POST['fromPerson'];

function fromPerson() {
    if !($_POST['fromPerson']) {
        print ''
    } else {
        print $fromPerson
    };
}

$newString = fromPerson();

Будь-яка допомога була б чудовою!

Відповіді:


171
if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}

60

Простий. У вас є два варіанти:

1. Перевірте, чи взагалі існують ЛЮБІ дані

//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
    // handle post data
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

(АБО)

2. Перевірте, чи наявний КОНТРОЛЬНИЙ ключ у даних публікації

if (isset($_POST['fromPerson']) )
{
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

Згідно з коментарем Ши на відповідь серпня Френсіса , empty()це НЕ правильно для вибору # 1, тому що в PHP, рядок '0'еквівалентна false- і empty()повертаю trueдля всіх значень еквівалентна БРЕХНІ . Таким чином, використовуючи empty, код пропустив би друк, якщо значення було '0'. Якщо ви хочете виключити порожній рядок, дивіться відповідь Августа.
ToolmakerSteve

33

Всі кажуть використовувати isset () - це, ймовірно, допоможе вам.

Однак важливо, щоб ви розуміли різницю між

$_POST['x'] = NULL; і $_POST['x'] = '';

isset($_POST['x'])повернеться falseна першому прикладі, але повернеться trueна другому, навіть якщо ви намагалися надрукувати будь-який, обидва повернули б порожнє значення.

Якщо ваш текст $_POSTнадходить із поля / форми, введеного користувачем, і залишається порожнім, я ВЕРІТАЮ (я не впевнений у цьому на 100%), що це значення буде "", але НЕ NULL.

Навіть якщо це припущення є невірним (хтось, будь ласка, виправте мене, якщо я помиляюся!), Вищезазначене все одно добре знати для подальшого використання.


4
empty () перевіряє наявність змінної та не порожнє значення, тому це функція, яку слід використовувати, коли порожня рядок повинна повертати false.
Хань Дейк

1
@HanDijk - відповідно з коментарем Ши на відповідь серпня Френсіс , empty()це НЕ правильно тут, тому що в PHP, рядок '0'еквівалентна false- і empty()повертає trueдля всіх значень еквівалентно БРЕХНЯ . Таким чином, використовуючи empty, код пропустив би друк, якщо значення було '0'.
ToolmakerSteve

30

Про здивування це не було згадано

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){

2
Чому? Якщо метод сервера не POST, змінна POST не буде встановлена, тому друга половина - це все, що потрібно. Я помиляюся?
ToolmakerSteve

@ToolmakerSteve - так, у більшості випадків цього достатньо, але не завжди моєю відповіддю було показати інший спосіб, як це можна зробити.
Джон Магнолія

Він також спрацює, якщо у вас є форма з прапорцями та подайте без імені.
Джон Магнолія

2
Охарактеризуйте ситуацію, де isset($_POST['fromPerson']є true, хоч if($_SERVER['REQUEST_METHOD'] == 'POST'є false. Якщо не існує такої ситуації, все, що потрібно, - це isset...частина.
ToolmakerSteve

Щоправда, але все навпаки. fromPersonможе не бути присутнім, але POST все ще може існувати. Питання було: "Якщо $ _POST існує". і лише в прикладі використовується $ _POST ['fromPerson']. У деяких ситуаціях, як описано тут @goat , навіть якщо fromPersonбуло ім'я Submit, воно може бути відсутнім у POST.
папо


13

Правильний спосіб перевірити наявність ключа масиву - це функція array_key_exists()

Різниця полягає в тому, що коли у вас є, $_POST['variable'] = nullце означає, що ключ існує і був відправлений, але значення було нульовим

Інший варіант, isset()який перевірить, чи існує ключ масиву та чи був він встановлений

Останній варіант - це використання, empty()яке перевірить, чи існує ключ масиву, якщо він встановлений і чи значення не вважається порожнім.

Приклади:

$arr = [
  'a' => null,
  'b' => '',
  'c' => 1
];

array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true


array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true


array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false

Щодо вашого питання

Правильний спосіб перевірити, чи було надіслано значення, - це використовувати array_key_exists () з методом перевірки запиту

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
{
   // logic
}

Але є деякі випадки, що залежать від вашої логіки, де isset()і empty()може бути добре.


Фантастична відповідь, за винятком пропозиції щодо використання empty. Згідно з коментарем Ши на відповідь серпня Френсіса , empty()це НЕ правильно , як альтернативний вибір, тому що в PHP, рядок '0'еквівалентна false- і empty()повертаю trueдля всіх значень еквівалентна БРЕХНІ . Таким чином, використовуючи empty, код пропустив би друк, якщо значення було '0'. Якщо ви хочете виключити порожній рядок, дивіться відповідь Августа.
ToolmakerSteve

Найкраща відповідь +1.
Віктор

9
  • У цьому випадку використання методу issetне є доцільним.

Відповідно до документації PHP: http://php.net/manual/en/function.array-key-exists.php
(див. Приклад №2 array_key_exists () vs isset () )
Метод array_key_existsпризначений для перевірки присутності ключа в масиві.

Отже, код у питанні можна змінити так:

function fromPerson() {
   if (array_key_exists('fromPerson', $_POST) == FALSE) {
        return '';
   } else {
        return '+from%3A'.$_POST['fromPerson'];
   };
}

$newString = fromPerson();


  • Перевірка наявності масиву $ _POST не потрібна, оскільки це глобальна змінна середовище PHP з версії 4.1.0 (на сьогодні ми не зустрічаємо старіших версій PHP).

Цей код відрізняється поведінкою від issetрішення лише тоді, коли встановлено поле публікації, але містить NULL. Це хороша альтернатива , якщо ви хочете дозволити NULLу elseфілії. Однак це помилка, якщо потрібна рядок; у цій ситуації issetробить правильно, але цей код не робить - він передасть NULLзначення далі. Пізніша відповідь Роберта демонструє різницю.
ToolmakerSteve

6

Усі методи насправді відсторонено, це попередження в Netbeans 7.4, і це, безумовно, є хорошою практикою не отримувати доступу до суперглобальних змінних безпосередньо, замість цього використовуйте фільтр

$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);

1
З іншого боку, важлива також читаність коду. IMHO, issetнабагато читабельніше, ніж вираз фільтра. Але дякую, що вказали на це; це корисний варіант для розгляду.
ToolmakerSteve

добре, ви можете написати свій власний метод обгортки myIsset / 2, який використовує фільтри, але має поведінку
isset

"Усі методи насправді відмовляються" - це сильне твердження (навіть якщо NetBeans позначає як попередження). Чи є у вас посилання на авторитетне джерело , яке відлякує прямих посилань на $ _POST? (Є багато про php, який призначений для зручності кодування, а не жорсткості. Подивіться, скільки людей у ​​відповідях на це запитання неправильно використовують empty, породжувані невдалим набранням php; важко уявити, що доступ до $ _POST буде вважатися поганим стиль.)
ToolmakerSteve

4

Спробуйте

if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
    echo "Cool";
}

За коментарем Хана Дійка на відповідь Рафаеля, empty($_POST['fromPerson'])чи це комбінований тест. Легше читати та набирати :)
ToolmakerSteve

@ToolmakerSteve: empty('0')повертається true. Тож це не те саме.
Ши

1
@Shi - так, ти маєш рацію; те, що я сказав, неправильно! Здається, немає простішого рішення, ніж код, показаний тут.
ToolmakerSteve


3
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
    echo 'blah' . $_POST['fromPerson'];
}

1
Чи перевіряє is_array ($ _ POST), чи є взагалі якісь значення в POST? У своєму додатку я намагаюся визначити, була посада чи ні, перш ніж робити щось інше.
Jeff LaFay

1
Дивіться мою редакцію. is_array()перевіряє, чи це масив, друга частина перевіряє, чи є у нього елемент з ключем 'fromPerson'.
jezmck

2

if( isset($_POST['fromPerson']) ) правильно.

Ви можете використовувати функцію та повертатися, краще, ніж керувати відлунням.


2
Ця відповідь нічого не додає до дискусії, що не було сказано в інших відповідях роками раніше.
ToolmakerSteve

1

Мені подобається перевіряти, чи є він у порожньому операторі та чи порожній він.

// POST variable check
$userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
$line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
$message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
$source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
$version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
$release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;

5
empty('0')є true. Так що краще не мати version 0, і userID 0т. Д.
Ши

0

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

Мій найкращий метод - спробувати:

if(sizeof($_POST) !== 0){
// Code...
}

Як $_POSTі масив, якщо скрипт завантажується, а даних немає в $_POSTзмінній, він матиме довжину масиву 0. Це може бути використано в операторі IF.

Вам також може бути цікаво, чи не зазначає це помилка "невизначеного індексу", бачачи, що ми перевіряємо, чи $_POSTвстановлено ... Насправді $_POSTзавжди існує, помилка "невизначеного індексу" з’явиться лише в тому випадку, якщо ви спробуєте пошукати $ _POST значення масиву, яке не існує.

$_POSTзавжди існує сам по собі або є порожнім або має значення масиву. $_POST['value']може не існувати, таким чином викидаючи помилку "невизначеного індексу".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.