Кращий спосіб перевірити змінну на нульову чи порожню рядок?


174

Оскільки PHP - це динамічна мова, який найкращий спосіб перевірити, чи вказане поле порожнє?

Я хочу переконатися, що:

  1. null вважається порожнім рядком
  2. порожній лише пробіл вважається порожнім
  3. що "0" не вважається порожнім

Ось що у мене є:

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

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

Має бути простіший спосіб зробити це?


1
Я б сказав, щоб використовувати порожній ($ питання), але це також вважає 0 порожнім.
Powerlord

2
умови joda жахливі
користувач3791372

Відповіді:


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
Оскільки ОП просить "простішу" версію надзвичайно простої операції, я хочу сказати, що "кращим" є те, що насправді гарантується.
хаос

2
Я перетворив це на функцію. це повинно спростити ваш код підтвердження
Майкл Харен

7
яка мета! isset () тут? чим відрізняється is_null ()?
nickf

2
також повернути (! порожній ($ питання) || обрізати ($ питання) === '');
SpYk3HH

109

Стара публікація, але комусь це може знадобитися, як і я;)

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

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


4
І завжди є:if(strcmp('', $var) == 0)...
peter

12
Чому == 0, а не просто якщо (strlen ($ str))?
Номенон

14
@Noumenon Тому що це може погіршити читабельність, не вирішуючи нічого. Дуже легко прочитати вашу пропозицію як "якщо є довжина", тоді як це (звичайно) означає навпаки.
Маттіас Ослунд

11
Не допоможе лише рядок з пробілами, якщо хтось про це піклується
airboss

5
Якщо змінна не буде встановлена, це призведе до попередження
Костянтин Переяслов

25

Використовуйте порожню () функцію 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)

Для отримання більш детальної інформації перевірте порожню функцію


7
Плакат сказав, що НЕ хочуть вважати "0" порожнім
dougd_in_nc

18

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

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

Що також можна змінити для перевірки на успіх як такого:

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

чи можу я запропонувати "if (trim ($ n)) .. .." в іншому випадку, якщо var $ _POST (наприклад) просто "", це вважатиметься дійсним, тоді як у більшості випадків це так добре, як порожній рядок
StartupGuy

Якщо "" не є прийнятним значенням для конкретної функції, то використання обрізки було б чудовою ідеєю.
Адал

3
Це поверне помилкове значення "0", числове 0 або 0,0 та ЛІЖНЕ.
Ведмант

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 масово використовують такий вид цукру.

Але ви говорите про більше, ніж це, з вашою помилкою "// Handle here". Ви змішуєте 2 завдання: отримання даних та їх обробка. Це зовсім не те саме.

Є й інші механізми, за допомогою яких можна перевірити дані. Знову ж таки, фреймворки можуть показувати найкращі мотиви.

Створіть об’єкти, які представляють дані вашої форми, потім приєднайте процеси та поверніться до неї. Це набагато більше звучить, що злом швидкого сценарію PHP (і це вперше), але він багаторазовий, гнучкий та набагато менше схильний до помилок, оскільки перевірка форми зі звичайним PHP, як правило, швидко стає кодом spaguetti.


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

джерела:


1

Коли ви хочете перевірити, чи надається значення для поля, це поле може бути a string, an arrayабо undefined. Отже, достатньо наступного

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

0

empty (), що працював для цього, але поведінка empty () змінилася в кілька разів. Як завжди, php-документи завжди є найкращим джерелом точної поведінки, а коментарі на цих сторінках зазвичай дають гарну історію змін за час. Якщо ви хочете перевірити відсутність властивостей об'єкта, на даний момент дуже оборонним методом є:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.