Проверьте, существует ли $ _POST

101

Я пытаюсь проверить, существует ли $ _POST, и если это так, распечатать его внутри другой строки, если нет, не печатать вообще.

что-то вроде этого:

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

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

$newString = fromPerson();

Любая помощь была бы замечательной!

Эливедель
источник

Ответы:

172
if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}
эхмад
источник
62

Просто. У вас есть два варианта:

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
34

Все говорят использовать isset () - что, вероятно, сработает для вас.

Однако важно понимать разницу между

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

isset($_POST['x'])вернется falseв первом примере, но вернется trueво втором, даже если вы попытаетесь распечатать любой из них, оба вернут пустое значение.

Если вы $_POSTпришли из введенного пользователем поля / формы и оставлены пустыми, Я ВЕРЮ (хотя я не уверен на 100%), что значение будет "", но НЕ NULL.

Даже если это предположение неверно (кто-нибудь, пожалуйста, поправьте меня, если я ошибаюсь!), Все вышеизложенное полезно знать для будущего использования.

Рафаэль
источник
4
empty () проверяет наличие переменной и непустое значение, поэтому функция, которую следует использовать, когда пустая строка должна возвращать false.
Han Dijk
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это имя отправки , оно может отсутствовать в POST.
papo
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);
linuxatico
источник
1
С другой стороны, также важна ГОТОВНОСТЬ кода. IMHO, issetэто намного более читабельно, чем выражение фильтра. Но спасибо, что указали на это; это полезный вариант для рассмотрения.
ToolmakerSteve
ну, вы можете написать свой собственный метод-оболочку myIsset / 2, который использует фильтры, но имеет поведение isset / 2
linuxatico
«Все методы на самом деле не рекомендуются» - это сильное утверждение (даже если 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'];
}
Jezmck
источник
1
Проверяет ли is_array ($ _ POST), есть ли вообще какие-либо значения в POST? В своем приложении я пытаюсь определить, была ли публикация или нет, прежде чем делать что-либо еще.
Джефф ЛаФэй,
1
Смотрите мою правку. is_array()проверяет, является ли это массивом, вторая часть проверяет, есть ли в нем элемент с ключом 'fromPerson'.
jezmck
2

if( isset($_POST['fromPerson']) ) верно.

Вы можете использовать функцию и return, лучше, чем направлять эхо.

Кристиан Вайзер
источник
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.

Вам также может быть интересно, вызывает ли это ошибку "undefined index", как будто мы проверяем, установлен ли $_POSTон ... На самом деле $_POSTвсегда существует, ошибка "undefined index" появится только в том случае, если вы попытаетесь найти $ _POST значение массива, которое не существует.

$_POSTвсегда существует сам по себе, будучи либо пустым, либо имеет значения массива. $_POST['value']может не существовать, что вызывает ошибку «неопределенный индекс».

Джек Райт
источник