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

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

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

  • null считается пустой строкой
  • строка с пробелом считается пустой.
  • что "0" не считается пустым

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Использовать функцию 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)

Подробнее... пустая функция

Ответ 4

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

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

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

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

Ответ 5

Остерегайтесь ложных негативов из функции 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

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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