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

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

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

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

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

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

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

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

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

person shin    schedule 02.08.2009    source источник
comment
возможный дубликат Зачем проверять как isset(), так и !empty()   -  person Gajus    schedule 10.04.2014


Ответы (17)


иссет против !пусто

ЗСТ:

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

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

person dassouki    schedule 02.08.2009
comment
ЗСТ: из статьи - person Jianxin Gao; 12.09.2017
comment
empty() также возвращает true для пустого массива. - person Mitya; 12.03.2019
comment
Даже если empty() возвращает TRUE для 0, не рекомендуется использовать этот оператор для математических операций, если 0 случайно окажется строкой. Это может быть опасно. Вместо этого используйте основные операторы >, < и == и преобразуйте переменные с помощью intval() или floatval(). - person kaleazy; 14.02.2020

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

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


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

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

дает

boolean true

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


И вопрос 2:

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

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

person Pascal MARTIN    schedule 02.08.2009

Ни один из них не является хорошим способом проверить правильность ввода.

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

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

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

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

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

person Community    schedule 22.04.2012
comment
Поскольку вы используете свободное сравнение, предложенный вами фрагмент будет давать ложные срабатывания при обработке нулевого/ложного нестрокового значения. 3v4l.org/aIWqA - person mickmackusa; 05.02.2018

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

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

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

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

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

person Gumbo    schedule 02.08.2009
comment
Обратите внимание, что empty() также поддерживает выражения, а не только переменные, начиная с PHP 5.5.0. - person ComFreek; 29.12.2013

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

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

идентичен

!empty($_POST['param'])
person macio.Jun    schedule 26.01.2013

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

Вы можете переписать это так: "isset() не является способом проверки ввода". Чтобы проверить ввод, используйте расширение фильтра. filter_has_var() сообщит вам, существует ли переменная, а filter_input() фактически отфильтрует и/или очистит ввод.

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

person Josh Davis    schedule 02.08.2009

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

  1. isset ()

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

False для null

e.g

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

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

True для null, пустой строки, 0, false, например

$status = 0
if(empty($status)) // true
$status = 1
if(empty($status)) // False
person Fokwa Best    schedule 14.05.2017

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

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

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

person Mike    schedule 13.06.2014

isset() против empty() против is_null()

введите здесь описание изображения

person Foued MOUSSI    schedule 28.11.2019

Достаточно использовать empty:

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

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

person You    schedule 02.08.2009
comment
Кроме того, intval() никогда не возвращает FALSE. - person Josh Davis; 03.08.2009
comment
этого НЕ достаточно, поскольку «0» является допустимой строкой, но не для empty... isset/filter_has_var необходимо использовать для проверки существования var. - person Yousha Aleayoub; 16.08.2017

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

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

person Shreya thakuri    schedule 17.05.2018

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


Достаточно проверить, является ли ввод '' или 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 .'') !== '';
}
person potato    schedule 25.02.2020

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

if( isset($_GET['var']) && @$_GET['var']!='' ){
    //Is not empty, do something
}
person Aztrozero    schedule 07.08.2017
comment
Оператор stfu (@) не рекомендуется и не нужен для вашего фрагмента. Это плохой ответ. Вы делаете вольное сравнение. Вы также можете использовать !empty(). - person mickmackusa; 05.02.2018
comment
Ооо, чувак... Это отлично подходит для плохого примера кодирования. @ у вас возникнут проблемы с отладкой, воздействие на страницу будет медленнее, и вы все еще можете иметь error_log более 1 ГБ за один раз. Просто будьте умнее и используйте !empty(), !is_null() или что-то в этом роде. - person Ivijan Stefan Stipić; 11.02.2019

    $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

person csandreas1    schedule 10.07.2018

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

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

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

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";
}
?>
person Kowsigan Atsayam    schedule 26.03.2019

!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}

?>

person Gobinda Nandi    schedule 03.06.2020

Учтите, что поведение может меняться в разных версиях PHP.

Из документации

isset() Возвращает TRUE, если var существует и имеет любое значение, кроме NULL. ЛОЖЬ, иначе https://www.php.net/manual/en/function.isset.php

empty() не существует или если его значение равно FALSE https://www.php.net/manual/en/function.empty.php

(пусто($x) == (!isset($x) || !$x)) // возвращает true;

(!empty($x) == (isset($x) && $x)) // возвращает true;

person Justaman    schedule 13.11.2020