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

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

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

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

Вот что у меня есть на данный момент:

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

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

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

Я бы сказал использовать пустой ($ вопрос), но он также считает, что 0 пуст.

Powerlord 19.12.2008 19:06

йода условия ужасные

user3791372 30.05.2017 03:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
184
2
257 762
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}

Хотя это решает проблему, я не уверен, что это проще. +1 в любом случае

Allain Lalonde 19.12.2008 18:36

Поскольку OP просит «более простую» версию чрезвычайно простой операции, я собираюсь сказать, что на самом деле оправдано «лучше».

chaos 19.12.2008 18:49

Я превратил это в функцию. это должно упростить ваш код проверки

Michael Haren 19.12.2008 18:51

Использование функции - лучший способ упростить это, я делаю то же самое

TravisO 20.12.2008 06:45

какова цель здесь! isset ()? чем он отличается от is_null ()?

nickf 07.05.2010 17:44

также return (! empty ($ question) || trim ($ question) === '');

SpYk3HH 08.04.2013 17:41

@nickf В этом случае они идентичны. is_null() выдает ошибку при передаче необъявленной переменной, но аргумент функции всегда объявляется. !isset() имел больше смысла в исходном ответе, который не был функцией.

Brian Ortiz 01.09.2013 09:36

@ SpYk3HH: Нет, потому что empty считает ноль пустым, а OP указывает, что 0 НЕ считается пустым. Если один знал, что вход был строкой, то у вас почти правильный подход, за исключением того, что вы забыли удалить ! - должно быть empty, а не !empty.

ToolmakerSteve 31.07.2015 23:30

Кстати, экспериментируя, я обнаружил, что trim(null) и trim($a), где $ a не был объявлен, возвращают пустую строку, поэтому функцию можно упростить до return trim($question==='');

ToolmakerSteve 01.08.2015 00:29

@ SpYk3HH больше экспериментов, которые показывают, что использование пустого чревато ошибками. empty("0") возвращает true. empty(" 0") возвращает false. Сколько людей знают эти тонкости? Использование empty может привести к незначительным ошибкам; Я бы этого избегал.

ToolmakerSteve 01.08.2015 00:33

а если на входе массив?

user3791372 30.05.2017 03:30

Он проверяет, является ли массив нулевым или пустым!

user794846 15.06.2017 16:13

Быстрая придирка, разве PHP не использует camel_case? Зачем использовать PascalCase для этой функции?

DavidsKanal 19.06.2019 12:36

Исправление моего предыдущего комментария (неправильная правая скобка): может просто сделать return trim($question)==='';

ToolmakerSteve 13.11.2020 03:32

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

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

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

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

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

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

Вы сделали прямо противоположное тому, что он хотел ... простоты.

TravisO 20.12.2008 06:46

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

Разве этот код не рассматривает это как ошибку? Если фильтрация выполняется где-то еще, следует позаботиться о том, чтобы она не дублировала сведения о правилах проверки аргументов в отдельные места.

grantwparks 27.03.2011 07:01

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

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

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

И всегда есть: if (strcmp('', $var) == 0)...

peter 01.06.2012 00:37

Почему == 0, а не только if (strlen ($ str))?

Noumenon 01.02.2013 10:06

@Noumenon Потому что это ухудшит читаемость, ничего не решая. Очень легко прочитать ваше предложение как «если есть длина», в то время как оно (конечно) означает обратное.

Mattias Åslund 05.07.2013 17:01

Не поможет только строка с пробелами, если это кому-то нужно.

airboss 11.12.2013 22:04

Если переменная не установлена, появится предупреждение.

Konstantin Pereiaslov 19.06.2014 20:43

Было бы неплохо добавить обрезку между strlen и $ str, чтобы удалить пробелы.

Jay Patel - PayPal 11.03.2015 20:43

Если у вас включен declare(strict_types=1);, вы получите сообщение об ошибке, если $ var имеет значение null. Вы должны либо сделать $var === null || strlen($var) === 0, либо использовать empty($var)

Dan Morphis 11.09.2018 00:59

@DanMorphis - кроме вас не следует использовать empty() для ситуации, запрошенной OP, так как это будет неверно для таких строк, как '0' и '0.0' (будет false, но OP хочет true для строк, содержащих контент).

ToolmakerSteve 24.08.2020 03:51

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

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

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

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

могу ли я предложить "if (trim ($ n)) .." в противном случае, если переменная $ _POST (например) просто "", она будет считаться действительной, тогда как в большинстве случаев это так же хорошо, как и пустая строка

StartupGuy 13.02.2014 22:44

Если "" не является приемлемым значением для конкретной функции, то использование обрезки будет отличной идеей.

Adal 20.02.2014 23:02

Это вернет false для «0», числовой 0 или 0,0 и FALSE.

Vedmant 06.01.2020 13:04

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

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

Плакат сказал, что они НЕ хотят считать "0" пустым

dougd_in_nc 20.11.2018 17:43

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

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

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

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

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

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

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

Неплохо. Ответ PHPst делает то же самое, но более кратко.

Allain Lalonde 27.03.2017 16:38

для большей надежности (табуляция, возврат…) я определяю:

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

источники:

Другие вопросы по теме