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

174

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

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

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

Вот что у меня так далеко:

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

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

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

Аллен Лалонд
источник
1
Я бы сказал, чтобы использовать пустой ($ вопрос), но это также считает 0 пустым.
Powerlord
2
условия
yoda ужасны

Ответы:

278
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}
Майкл Харен
источник
7
Хотя это решает это, я не уверен, что это проще. +1 в любом случае
Аллен Лалонд
4
Поскольку OP запрашивает «более простую» версию чрезвычайно простой операции, я скажу, что «лучше» - это то, что на самом деле оправдано.
хаос
2
Я превратил это в функцию. это должно упростить ваш проверочный код
Майкл Харен
7
Какова цель! isset () здесь? чем он отличается от is_null ()?
nickf
2
также return (! empty ($ question) || trim ($ question) === '');
SpYk3HH
109

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

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

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

jrowe
источник
4
И всегда есть:if(strcmp('', $var) == 0)...
Питер
12
Почему == 0, а не просто if (strlen ($ str))?
Нумен
14
@Noumenon Потому что это ухудшит читабельность, ничего не решая. Действительно легко прочитать ваше предложение как «если есть длина», в то время как оно (конечно) означает обратное.
Маттиас Ослунд
11
Не поможет для струн только с пробелами, если это кому-то
нужно
5
Если переменная не установлена, это выдаст предупреждение
Константин Переяслов
25

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

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

КТА
источник
7
Постер сказал, что они не хотят считать "0" пустым
dougd_in_nc
18

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

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

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

if ( !$question ) {
  // Handle error here
}
Адал
источник
Могу ли я предложить "if (trim ($ n)) ..", иначе, если переменная $ _POST (например) просто "", она будет считаться действительной, тогда как в большинстве случаев это так же хорошо, как пустая строка
StartupGuy
Если "" не является приемлемым значением для конкретной функции, то использование обрезки было бы отличной идеей.
Адаль
3
Это вернет false для «0», числового 0 или 0.0 и FALSE.
Ведмант
7

Остерегайтесь ложных негативов от 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
Бен Бланк
источник
Я бы сказал, если вы получите массив, где вы ожидали строку, это должно быть ошибкой. Если вы ожидаете массив, у вас должна быть отдельная функция фильтрации для этого.
OIS
Разве этот код не рассматривает это как ошибку? Если фильтрация выполняется в другом месте, нужно позаботиться о том, чтобы она не дублировала знание правил проверки аргументов в отдельных местах.
grantwparks
3

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

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

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 быстро превращается в код спагетти.

е-удовлетворяться
источник
22
Вы сделали полную противоположность того, что он хотел ... простота.
TravisO
2

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

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

  return strlen(trim($val)) ? true : false;
}
Крис Клоуэр
источник
Неплохо. Ответ от PHPst делает то же самое, но более лаконично.
Аллен Лалонд
2

чтобы быть более устойчивым (табулирование, возврат ...), я определяю:

function is_not_empty_string($str) {
    if (is_string($str) && trim($str, " \t\n\r\0") !== '')
        return true;
    else
        return false;
}

// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
    var_export($value);
    if (is_not_empty_string($value)) 
        print(" is a none empty string!\n");
    else
        print(" is not a string or is an empty string\n");
}

источники:

bcag2
источник
1

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

function isSet($param)
{
    return (is_array($param) && count($param)) || trim($param) !== '';
}
PHPst
источник
0

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

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
NJInamdar
источник