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

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

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

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

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

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

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

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

9 ответов


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

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

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

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


используйте функцию empty() 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)"", так и нулевых переменных:

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 здесь ". Вы смешиваете 2 задания: получение данных и обработка он. Это совсем не одно и то же.

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

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


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

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

  return strlen(trim($val)) ? true : false;
}

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

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

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

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