Проверьте, существует ли $ _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);

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'];
}

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']может не существовать, что вызывает ошибку «неопределенный индекс».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.