Лучший способ проверить переменную для пустой или пустой строки?

Поскольку PHP – это динамический язык, что лучший способ проверить, пустое ли предоставленное поле?

Я хочу, чтобы:

  1. null считается пустой строкой
  2. строка только пробела считается пустой
  3. что «0» не считается пустым

Это то, что у меня есть до сих пор:

$question = trim($_POST['question']); if ("" === "$question") { // Handle error here } 

Должен быть более простой способ сделать это?

 // Function for basic field validation (present and neither empty nor only white space function IsNullOrEmptyString($question){ return (!isset($question) || trim($question)===''); } 

Старый пост, но кому-то это может понадобиться, как и я;)

 if (strlen($str) == 0){ do what ever } 

замените $str вашей переменной. NULL и "" возвращают 0 при использовании strlen .

Используйте функцию пустого () PHP. Следующие вещи считаются пустыми

 "" (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) 

Для получения дополнительной информации проверьте пустую функцию

Я смиренно признаю, если я ошибаюсь, но я тестировал на своем собственном конце и обнаружил, что следующие работы для тестирования переменных как строки (0) ", так и NULL:

 if ( $question ) { // Handle success here } 

Который также может быть отменен, чтобы проверить успех как таковой:

 if ( !$question ) { // Handle error here } 

Остерегайтесь ложных негативов из функции trim() – перед обрезкой он выполняет отбрасывание до строки и, таким образом, вернется, например, «Массив», если вы передадите ему пустой массив. Это может не быть проблемой, в зависимости от того, как вы обрабатываете свои данные, но с кодом, который вы поставляете, поле с именем question[] может быть предоставлено в данных POST и выглядит как непустая строка. Вместо этого я бы предложил:

 $question = $_POST['question']; if (!is_string || ($question = trim($question))) { // Handle error here } // If $question was a string, it will have been trimmed by this point 

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

Большинство фреймворков предлагают способ анализа аргументов простой задачи. Вы можете построить для себя собственный объект. Быстрый и грязный пример:

 class Request { // This is the spirit but you may want to make that cleaner :-) function get($key, $default=null, $from=null) { if ($from) : if (isset(${'_'.$from}[$key])); return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work else if isset($_REQUEST[$key]) return sanitize($_REQUEST[$key]); return $default; } // basics. Enforce it with filters according to your needs function sanitize($data) { return addslashes(trim($data)); } // your rules here function isEmptyString($data) { return (trim($data) === "" or $data === null); } function exists($key) {} function setFlash($name, $value) {} [...] } $request = new Request(); $question= $request->get('question', '', 'post'); print $request->isEmptyString($question); 

Symfony использует этот вид сахара.

Но вы говорите больше, чем с этой ошибкой «// Handle error here». Вы смешиваете 2 задания: получение данных и их обработку. Это совсем не то же самое.

Существуют другие механизмы, которые можно использовать для проверки данных. Опять же, рамки могут показать вам лучшие оценки.

Создавайте объекты, которые представляют данные вашей формы, затем присоединяют процессы и возвращаются к ней. Звучит намного больше, чем взломать быстрый скрипт PHP (и это первый раз), но он многоразовый, гибкий и гораздо меньше подвержен ошибкам, поскольку проверка формы с помощью обычного PHP имеет тенденцию быстро превращаться в код spaguetti.

Это проверяет массивы и строки:

 function is_set($val) { if(is_array($val)) return !empty($val); return strlen(trim($val)) ? true : false; } 

Если вы хотите проверить, предоставлено ли значение для поля, это поле может быть string , array или неопределенным. Итак, достаточно

 function isSet($param) { return (is_array($param) && count($param)) || trim($param) !== ''; } 

empty () используется для этого, но поведение empty () несколько раз менялось. Как всегда, php docs всегда являются лучшим источником точного поведения, и комментарии на этих страницах обычно дают хорошую историю изменений с течением времени. Если вы хотите проверить отсутствие свойств объектов, очень защитный метод на данный момент:

 if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {