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


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

Я хочу убедиться, что:

  1. null считается пустой строкой
  2. строка, содержащая только пробелы, считается пустой
  3. что "0" не считается пустым

Вот что у меня пока есть:

$question = trim($_POST['question']);

if ("" === "$question") {
    // Handle error here
}

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

Author: Michael Haren, 2008-12-19

9 answers

// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}
 249
Author: Michael Haren, 2018-06-14 04:58:21

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

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

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

 99
Author: jrowe, 2011-11-30 13:45:27

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

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

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

 27
Author: kta, 2014-02-06 02:13:22

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

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

Который также может быть изменен для проверки на успех как таковой:

if ( !$question ) {
  // Handle error here
}
 18
Author: Adal, 2013-08-10 01:06:44

Остерегайтесь ложных отрицаний функции 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
 6
Author: Ben Blank, 2008-12-19 17:58:46

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

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

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 массово использует этот вид сахара.

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

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

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

 3
Author: e-satis, 2008-12-19 15:58:36

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

function is_set($val) {
  if(is_array($val)) return !empty($val);

  return strlen(trim($val)) ? true : false;
}
 1
Author: Chris Clower, 2017-03-26 00:43:37

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

function isSet($param)
{
    return (is_array($param) && count($param)) || trim($param) !== '';
}
 1
Author: PHPst, 2017-03-27 13:39:01

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

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
 0
Author: NJInamdar, 2014-02-15 10:51:39