Лучший способ проверить переменную на пустую или пустую строку? - PullRequest
162 голосов
/ 19 декабря 2008

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

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

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

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

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

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

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

Ответы [ 10 ]

261 голосов
/ 19 декабря 2008
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}
104 голосов
/ 20 января 2010

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

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

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

29 голосов
/ 06 февраля 2014

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

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

19 голосов
/ 10 августа 2013

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

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

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

if ( !$question ) {
  // Handle error here
}
7 голосов
/ 19 декабря 2008

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

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

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

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

1 голос
/ 24 апреля 2019

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

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");
}

источники:

1 голос
/ 26 марта 2017

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

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

  return strlen(trim($val)) ? true : false;
}
1 голос
/ 01 апреля 2016

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

function isSet($param)
{
    return (is_array($param) && count($param)) || trim($param) !== '';
}
0 голосов
/ 15 февраля 2014

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

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...