Где я должен использовать isset () и! Empty ()


106

Я где-то читал, что isset()функция обрабатывает пустую строку как TRUE, следовательно isset(), не является эффективным способом проверки ввода текста и текстовых полей из HTML-формы.

Таким образом, вы можете использовать, empty()чтобы проверить, что пользователь что-то напечатал.

  1. Верно ли, что isset()функция обрабатывает пустую строку как TRUE?

  2. Тогда в каких ситуациях мне следует использовать isset()? Всегда ли использовать, !empty()чтобы проверить, есть ли что-нибудь?

Например вместо

if(isset($_GET['gender']))...

Используя это

if(!empty($_GET['gender']))...

Ответы:


136

isset vs.! empty

FTA:

isset () проверяет, имеет ли переменная значение, включающее (False, 0 или пустую строку), но не NULL. Возвращает TRUE, если var существует; FALSE в противном случае.

С другой стороны, функция empty () проверяет, имеет ли переменная пустое значение, пустая строка, 0, NULL или False. Возвращает FALSE, если var имеет непустое и ненулевое значение. "


47
FTA: Из статьи
Цзяньсинь Гао

5
empty()также возвращает истину для пустого массива.
Митя

Даже если empty()для 0 возвращается значение ИСТИНА, не рекомендуется использовать этот оператор для математических расчетов, если «0» случайно окажется строкой. Это может быть опасно. Вместо этого следует использовать основной >, <а ==операторы и преобразования переменных с использованием intval()или floatval().
kaleazy

33

В самом общем виде:

  • issetпроверяет , является ли переменная (или элемент массива или свойство объекта) существует (и не равно нулю)
  • empty проверяет, содержит ли переменная (...) непустые данные.


Чтобы ответить на вопрос 1 :

$str = '';
var_dump(isset($str));

дает

boolean true

Потому что переменная $strсуществует.


И вопрос 2 :

Вы должны использовать isset, чтобы определить, существует ли переменная ; например, если вы получаете данные в виде массива, вам может потребоваться проверить, установлен ли ключ в этом массиве.
Подумайте , например, о $_GET/ $_POST.

Теперь, чтобы работать над его ценностью, когда вы знаете, что такая ценность существует: это работа empty.


11

Также нельзя проверить правильность ввода.

  • isset() недостаточно, потому что, как уже отмечалось, он считает пустую строку допустимым значением.
  • ! empty() также не достаточно, потому что он отклоняет «0», которое может быть допустимым значением.

Использование в isset()сочетании с проверкой равенства для пустой строки - это минимум, который вам нужно для проверки того, что входящий параметр имеет значение, не создавая ложноотрицательных значений:

if( isset($_GET['gender']) and ($_GET['gender'] != '') )
{
  ...
}

Но под «абсолютным минимумом» я имею в виду именно это. Весь приведенный выше код определяет, есть ли какое-то значение для $_GET['gender']. Она не определяет , является ли значение для $_GET['gender']является действительным (например, один из("Male", "Female","FileNotFound") ).

Для этого см . Ответ Джоша Дэвиса .


Поскольку вы используете вольное сравнение, предложенный вами фрагмент будет давать ложные срабатывания при обработке нулевого / ложного нестрокового значения. 3v4l.org/aIWqA
mickmackusa 05

11

issetпредназначен для использования только для переменных, а не только для значений, поэтому isset("foobar")вызовет ошибку. Начиная с PHP 5.5, emptyподдерживаются как переменные, так и выражения.

Итак, ваш первый вопрос должен быть скорее, если issetвозвращает true для переменной, содержащей пустую строку. И ответ такой:

$var = "";
var_dump(isset($var));

В таблицах сравнения типов в руководстве РНР очень удобно для таких вопросов.

issetв основном проверяет, имеет ли переменная какое-либо значение, кроме null, поскольку несуществующие переменные всегда имеют значение null . emptyявляется своего рода противоположностью, issetно также обрабатывает целочисленное значение 0и строковое значение "0"как пустые. (Опять же, взгляните на таблицы сравнения типов .)


1
Обратите внимание, что empty()с PHP 5.5.0 также «поддерживает выражения, а не только переменные».
ComFreek

8

Если у вас есть $ _POST ['param'] и вы предполагаете, что это строковый тип, тогда

isset($_POST['param']) && $_POST['param'] != '' && $_POST['param'] != '0'

идентичен

!empty($_POST['param'])

4

isset () не является эффективным способом проверки ввода текста и текстовых полей из HTML-формы.

Вы можете переписать это как «isset () не является способом проверки ввода». Для проверки ввода используйте расширение фильтра PHP . filter_has_var()сообщит вам, существует ли переменная, а на filter_input()самом деле будет фильтровать и / или дезинфицировать ввод.

Обратите внимание, что вам не нужно использовать filter_has_var()до, filter_input()и если вы запросите переменную, которая не установлена, filter_input()просто вернется null.


3

Когда и как использовать:

  1. isset ()

Истина для 0, 1, пустая строка, строка, содержащая значение, истина, ложь

Ложь для нуля

например

$status = 0
if (isset($status)) // True
$status = null 
if (isset($status)) // False
  1. Пустой

Ложь для 1, строка, содержащая значение, true

Истина для нуля, пустая строка, 0, ложь, например

$status = 0
if(empty($status)) // true
$status = 1
if(empty($status)) // False

2

isset используется, чтобы определить, существует ли экземпляр чего-либо, то есть, если переменная была создана ... это не связано со значением параметра ...

Паскаль МАРТИН ... +1 ...

empty () не генерирует предупреждения, если переменная не существует ... поэтому isset () предпочтительнее при проверке существования переменной, когда вы собираетесь ее изменить ...


1

Использование emptyдостаточно:

if(!empty($variable)){
    // Do stuff
}

Кроме того, если вам нужно целочисленное значение, возможно, стоит проверить это intval($variable) !== FALSE.


2
Кроме того, intval () никогда не возвращает FALSE.
Джош Дэвис,

1
его НЕ достаточно, так как '0' является допустимой строкой, но не для empty... isset/ filter_has_varдолжен использоваться для проверки существования var.
Юша Алеайуб


1

Я пришел сюда в поисках быстрого способа проверить, есть ли в переменной какое-либо содержимое. Ни один из ответов здесь не дал полного решения, поэтому вот оно:


Достаточно проверить, является ли вход ''или null, потому что:

Запросить URL .../test.php?var=результаты в$_GET['var'] = ''

Запросить URL .../test.phpрезультаты в$_GET['var'] = null


isset()возвращается falseтолько тогда, когда переменная существует и не установлена null, поэтому, если вы используете ее, вы получите trueпустые строки ( '').

empty()рассматривает как nullи ''пустой, но он также считает '0'пустым, что является проблемой в некоторых случаях применения.

Если вы хотите рассматривать '0'как пустой, используйте empty(). В противном случае используйте следующую проверку:

$var .'' !== ''оценивается falseтолько для следующих входных данных:

  • ''
  • null
  • false

Я использую следующую проверку, чтобы также отфильтровать строки, содержащие только пробелы и разрывы строк:

function hasContent($var){
    return trim($var .'') !== '';
}

0

Я использую следующее, чтобы избежать уведомлений, это проверяет, объявлен ли var в GET или POST, и с префиксом @ вы можете безопасно проверить, не является ли он пустым, и избежать уведомления, если var не установлен:

if( isset($_GET['var']) && @$_GET['var']!='' ){
    //Is not empty, do something
}

Оператор stfu ( @) не следует поощрять, и он не является обязательным для вашего фрагмента. Это плохой ответ. Вы делаете вольное сравнение. Вы также можете использовать !empty().
mickmackusa 05

1
Ооо ... Это отлично подходит для примера плохого кодирования. @доставит вам проблемы с отладкой, влияние страницы будет медленнее, и вы все равно можете иметь error_logболее 1 ГБ за один момент. Просто будь умным и пользуйся !empty(), !is_null()или что-то в этом роде.
Ивиян Стефан Стипич

0

isset () используется для проверки, установлена ​​ли переменная со значением или нет, а Empty () используется для проверки, является ли данная переменная пустой или нет.

isset () возвращает истину, если переменная не равна нулю, тогда как Empty () возвращает истину, если переменная является пустой строкой.


0
    $var = '';
// Evaluates to true because $var is empty
if ( empty($var) ) {
echo '$var is either 0, empty, or not set at all';
}
// Evaluates as true because $var is set
if ( isset($var) ) {
 echo '$var is set even though it is empty';
    }

Источник: Php.net


0

isset () проверяет, установлена ​​ли переменная, а не null:

http://us.php.net/manual/en/function.isset.php

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

http://us.php.net/manual/en/function.empty.php

<?php

$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>


0

! empty сделает свое дело. если вам нужно только проверить, существуют ли данные или нет, используйте isset, другой пустой может обрабатывать другие проверки

<?php
$array = [ "name_new" => "print me"];

if (!empty($array['name'])){
   echo $array['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array2 = [ "name" => NULL];

if (!empty($array2['name'])){
   echo $array2['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array3 = [ "name" => ""];

if (!empty($array3['name'])){
   echo $array3['name'];
}

//output : {nothing}  

////////////////////////////////////////////////////////////////////

$array4 = [1,2];

if (!empty($array4['name'])){
   echo $array4['name'];
}

//output : {nothing}

////////////////////////////////////////////////////////////////////

$array5 = [];

if (!empty($array5['name'])){
   echo $array5['name'];
}

//output : {nothing}

?>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.