Проверьте, пусто ли значение $ _POST - PullRequest
26 голосов
/ 06 февраля 2012
if(isset($_POST['submit'])) {
    if(!isset($_POST['userName'])) {
        $username = 'Anonymous';
    }      
    else $username = $_POST['userName'];
}

Я не могу заставить $username быть "Анонимным"? Это либо пустое значение, либо значение $_POST['userName'].

Ответы [ 8 ]

40 голосов
/ 06 февраля 2012

Если форма была успешно отправлена, всегда следует указывать $_POST['userName'], хотя она может содержать пустую строку, которая отличается от не заданной вообще.Вместо этого проверьте, является ли это empty()

if (isset($_POST['submit'])) {
    if (empty($_POST['userName'])) {
        $username = 'Anonymous';
    } else { 
        $username = $_POST['userName'];
    }
}
40 голосов
/ 06 февраля 2012

isset() вернет true, если переменная была инициализирована. Если у вас есть поле формы со значением name, установленным на userName, то при отправке этой формы значение всегда будет "установлено", хотя в нем могут отсутствовать данные.

Вместо этого trim() строка и проверка ее длины

if("" == trim($_POST['userName'])){
    $username = 'Anonymous';
}      
9 голосов
/ 06 февраля 2012

Чтобы проверить, присутствует ли свойство, независимо от значения, используйте:

if (array_key_exists('userName', $_POST)) {}

Чтобы проверить, установлено ли свойство (свойство присутствует и значение не равно null или false), используйте:

if (isset($_POST['userName'])) {}

Чтобы проверить, установлено ли свойство и не является ли оно пустым (не пустая строка, 0 (целое число), 0.0 (число с плавающей точкой), '0' (строка), null, false или [] (пустой массив)), используйте:

if (!empty($_POST['userName'])) {}
4 голосов
/ 04 июня 2014

Вопрос: Проверьте, является ли значение $ _POST пустым .

Перевод: Проверьте, имеет ли ключ / индекс массива значение, связанное с ним.

Ответ: Зависит от вашего акцента на безопасности. Зависит от того, что допустимо в качестве допустимого ввода.

1. Some people say use empty().

Из руководства по PHP: «[Пусто] определяет, будет ли переменная считаться пустой. Переменная считается пустой, если она не существует или если ее значение равно FALSE». Таким образом, следующее считается пустым.

"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)

Если ни одно из этих значений не подходит для вашего элемента управления вводом, то empty() будет работать. Проблема здесь заключается в том, что empty() может быть слишком широким , чтобы использоваться последовательно (таким же образом, по той же причине, для разных элементов управления вводом в $_POST или $_GET). Хорошее использование empty() состоит в том, чтобы проверить, является ли весь массив пустым (без элементов).

2. Some people say use isset().

isset() (языковая конструкция) не может работать с целыми массивами, как в isset($myArray). Он может работать только с переменными и элементами массива (через индекс / ключ): isset($var) и isset($_POST['username']). Языковая конструкция isset() делает две вещи. Сначала он проверяет, имеет ли значение индекс или ключ переменной или массива связанный с ним. Во-вторых, он проверяет, что значение не равно значению PHP NULL.

Короче говоря, наиболее точную проверку лучше всего выполнить с isset(), поскольку некоторые элементы управления вводом даже не регистрируются в $ _POST, когда они не выбраны или не проверены. Я никогда не знал форму, которая представила бы значение PHP NULL. Ни один из моих не делает, поэтому я использую isset(), чтобы проверить, имеет ли ключ $_POST значение, связанное с ним (и это не NULL). isset() является гораздо более строгим тестом пустоты (в смысле вашего вопроса), чем empty().

3. Some people say just do if($var), if($myArray), or if($myArray['userName']) to determine emptiness.

Вы можете проверить все, что оценивается как true или false в if заявление. Пустые массивы оцениваются как ложные, как и переменные, которые не установлен. Переменные, содержащие значение PHP NULL, также оцениваются как ложный. К сожалению, в этом случае, как с empty(), многие другие вещи также оцениваются как ложные: 1. пустая строка '', ноль (0), zero.zero (0.0), строка ноль '0', логическое значение false и определенное пустое Объекты XML.

- Doyle, начало PHP 5.3

В заключение, используйте isset() и подумайте о том, чтобы объединить его с другими тестами. Пример:

Может не работать из-за суперглобальной ввинчиваемости, но без проблем будет работать для других массивов.

if (is_array($_POST) && !empty($_POST)) {
    // Now test for your successful controls in $_POST with isset()
} 

Следовательно, зачем искать значение, связанное с ключом, прежде чем вы точно узнаете, что $_POST представляет массив и содержит ли в нем какие-либо значения (что многие люди не учитывают)? Помните, что люди могут отправлять данные в вашу форму без использования веб-браузера. Однажды вы можете дойти до точки проверки, что у $_POST есть только разрешенные ключи, но этот разговор предназначен для другого дня.

Полезная ссылка:

Руководство по PHP: сравнительные таблицы тестирования типов

2 голосов
/ 20 января 2016

я бы использовал простой однострочный аналог для этих случаев использования

$username = trim($_POST['userName'])?:'Anonymous';

Это для случая использования, в котором вы уверены, что регистрация ошибок отключена, поэтому вы не получите предупреждение о том, что переменная не инициализирована.

это параноидальная версия:

$username = !empty(trim(isset($_POST['userName'])?$_POST['userName']:''))?$_POST['userName']:'Anonymous';

Это реализует проверку, если установлена ​​переменная $_POST. прежде чем получить к нему доступ.

2 голосов
/ 06 февраля 2012

Изменить это:

if(isset($_POST['submit'])){

    if(!(isset($_POST['userName']))){
    $username = 'Anonymous';
    }      
    else $username = $_POST['userName'];
}

На это:

if(!empty($_POST['userName'])){
     $username = $_POST['userName'];
}

if(empty($_POST['userName'])){
     $username = 'Anonymous';
}
1 голос
/ 21 июня 2019
$username = filter_input(INPUT_POST, 'userName', FILTER_SANITIZE_STRING);
if ($username == '') {$username = 'Anonymous';}

Наилучшая практика - всегда фильтруйте входные данные, очищайте строку в порядке, но лучше использовать специальную функцию обратного вызова, чтобы действительно отфильтровать то, что не приемлемо.Затем проверьте переменную now-safe, если она пуста / пуста, и если она есть, установите значение Anonymous.Не требует оператора 'else', поскольку он был задан, если он существовал в первой строке.

1 голос
/ 06 февраля 2012

isset проверяет, «установлен» ли ключ, который вы проверяете в хэше (или ассоциативном массиве).Установить в этом контексте просто означает, что он знает значение.Ничто не является ценностью.Поэтому она определяется как пустая строка.

По этой причине, если у вас есть поле ввода с именем userName, независимо от того, заполняют ли они его, это будет верно.Что вы действительно хотите сделать, так это проверить, равно ли userName пустой строке ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...