Проверьте, пусто ли значение $ _POST

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

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

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

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

 if("" == trim($_POST['userName'])){ $username = 'Anonymous'; } 

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

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

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

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

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

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

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

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

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

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

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

 1. Some people say use empty(). 

Из руководства PHP: «[Empty] определяет, считается ли переменная пустой. Переменная считается пустой, если она не существует или ее значение равно 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() делает две вещи. Сначала он проверяет, имеет ли переменная или индекс / ключ массива значение, связанное с ним. Во-вторых, он проверяет, чтобы значение не было равно значению NULL PHP.

Короче говоря, наиболее точную проверку можно выполнить лучше всего с 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. Пустые массивы оцениваются как false, поэтому переменные не заданы. Переменные, содержащие значение NULL PHP, также оцениваются как false. К сожалению, в этом случае, как и в случае с empty() , многие другие вещи также вычисляют false: 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() } 

Это тоже должно работать.

 if(is_array($_POST) && $_POST) { //Now test for your successful controls in $_POST with isset() //Always validate your input. } 

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

Полезная информация:

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

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

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

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

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

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

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

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

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

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

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