Gdzie mam użyć isset () i! Empty ()


106

Czytałem gdzieś, że isset()funkcja traktuje pusty ciąg jako TRUE, dlatego isset()nie jest skutecznym sposobem walidacji danych wejściowych i pól tekstowych z formularza HTML.

Możesz więc użyć empty()do sprawdzenia, czy użytkownik coś wpisał.

  1. Czy to prawda, że isset()funkcja traktuje pusty ciąg jako TRUE?

  2. W jakich sytuacjach powinienem używać isset()? Czy powinienem zawsze !empty()sprawdzać, czy coś jest?

Na przykład zamiast

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

Korzystanie z tego

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

Odpowiedzi:


136

isset vs.! empty

FTA:

„isset () sprawdza, czy zmienna ma wartość zawierającą (False, 0 lub pusty łańcuch), ale nie NULL. Zwraca TRUE, jeśli istnieje zmienna; FALSE w przeciwnym razie.

Z drugiej strony funkcja empty () sprawdza, czy zmienna ma pustą wartość pusty ciąg, 0, NULL lub False. Zwraca FALSE, jeśli zmienna ma niepustą i różną od zera wartość. "


47
FTA: Z artykułu
Jianxin Gao

5
empty()zwraca również wartość true dla pustej tablicy.
Mitya

Nawet jeśli empty()zwraca PRAWDA dla 0, nie jest dobrym pomysłem używanie tego operatora do obliczeń matematycznych w przypadku, gdy „0” jest przypadkowo łańcuchem. To może być niebezpieczne. Zamiast korzystać z podstawowych >, <a ==operatorzy i zmienne Konwersja za pomocą intval()lub floatval().
kaleazy

33

W najbardziej ogólny sposób:

  • issetsprawdza, czy zmienna (lub element tablicy lub właściwość obiektu) istnieje (i nie jest null)
  • empty sprawdza, czy zmienna (...) zawiera niepuste dane.


Aby odpowiedzieć na pytanie 1 :

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

daje

boolean true

Ponieważ zmienna $stristnieje.


I pytanie 2 :

Do określenia, czy zmienna istnieje , należy użyć isset ; na przykład, jeśli otrzymujesz jakieś dane jako tablicę, może być konieczne sprawdzenie, czy klucz jest ustawiony w tej tablicy.
Pomyśl na przykład o $_GET/ $_POST.

Teraz, aby popracować nad jego wartością, kiedy wiesz, że istnieje taka wartość: to jest zadanie empty.


11

Żaden z nich nie jest dobrym sposobem sprawdzenia poprawności danych wejściowych.

  • isset() nie jest wystarczające, ponieważ - jak już wspomniano - uważa pusty ciąg za prawidłową wartość.
  • ! empty() nie jest również wystarczające, ponieważ odrzuca „0”, które może być prawidłową wartością.

Używanie w isset()połączeniu z kontrolą równości względem pustego ciągu to absolutne minimum, które musisz zweryfikować, czy parametr przychodzący ma wartość bez tworzenia fałszywych negatywów:

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

Ale przez „absolutne minimum” mam na myśli dokładnie to. Cały powyższy kod określa, czy istnieje jakaś wartość $_GET['gender']. To ma nie ustalić, czy wartość $_GET['gender']jest ważna (na przykład jeden ).("Male", "Female","FileNotFound")

Zobacz odpowiedź Josha Davisa .


Ponieważ używasz luźnego porównania, sugerowany fragment kodu da fałszywe alarmy podczas obsługi wartości niebędącej ciągiem zerowym / falsey. 3v4l.org/aIWqA
mickmackusa

11

issetma być używany tylko dla zmiennych, a nie tylko wartości, więc isset("foobar")spowoduje zgłoszenie błędu. Od PHP 5.5 emptyobsługuje zarówno zmienne, jak i wyrażenia.

Więc twoje pierwsze pytanie powinno brzmieć, jeśli issetzwraca prawdę dla zmiennej, która przechowuje pusty łańcuch. A odpowiedź brzmi:

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

Te tabele porównania typu w podręczniku PHP jest bardzo przydatny do takich pytań.

issetzasadniczo sprawdza, czy zmienna ma wartość inną niż null, ponieważ nieistniejące zmienne mają zawsze wartość null . emptyjest rodzajem części licznika, issetale traktuje również wartość całkowitą 0i wartość ciągu "0"jako puste. (Ponownie spójrz na tabele porównawcze typów ).


1
Zauważ, że empty()także "obsługuje wyrażenia, a nie tylko zmienne" od PHP 5.5.0.
ComFreek

8

Jeśli masz $ _POST ['param'] i założysz, że jest to typ ciągu

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

jest identyczny z

!empty($_POST['param'])

4

isset () nie jest skutecznym sposobem sprawdzania poprawności danych wejściowych i pól tekstowych z formularza HTML

Możesz to przepisać jako „isset () nie jest sposobem na sprawdzenie poprawności danych wejściowych”. Aby sprawdzić poprawność danych wejściowych, użyj rozszerzenia filtru PHP . filter_has_var()powie ci, czy zmienna istnieje, podczas gdy filter_input()faktycznie będzie filtrować i / lub oczyszczać dane wejściowe.

Zauważ, że nie musisz używać filter_has_var()przed, filter_input()a jeśli poprosisz o zmienną, która nie jest ustawiona, filter_input()po prostu zwróci null.


3

Kiedy i jak używać:

  1. isset ()

Prawda dla 0, 1, pusty łańcuch, ciąg zawierający wartość, prawda, fałsz

Fałsz dla null

na przykład

$status = 0
if (isset($status)) // True
$status = null 
if (isset($status)) // False
  1. Pusty

Fałsz dla 1, ciąg znaków zawierający wartość, prawda

Prawda dla null, pusty łańcuch, 0, fałsz, np

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

2

isset służy do określenia, czy istnieje instancja czegoś, to znaczy, czy została utworzona instancja zmiennej ... nie dotyczy ona wartości parametru ...

Pascal MARTIN ... +1 ...

Empty () nie generuje ostrzeżenia, jeśli zmienna nie istnieje ... dlatego isset () jest preferowana podczas testowania istnienia zmiennej, gdy zamierzasz ją zmodyfikować ...


1

Korzystanie emptywystarczy:

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

Dodatkowo, jeśli chcesz uzyskać wartość całkowitą, warto to sprawdzić intval($variable) !== FALSE.


2
Ponadto intval () nigdy nie zwraca FALSE.
Josh Davis,

1
to NIE wystarczy, ponieważ „0” jest poprawnym łańcuchem, ale nie dla empty... isset/ filter_has_varmusi być użyte do sprawdzenia, czy istnieje zmienna.
Yousha Aleayoub

1
isset($variable) === (@$variable !== null)
empty($variable) === (@$variable == false)

1

Przyszedłem tutaj, szukając szybkiego sposobu na sprawdzenie, czy zmienna ma jakąś treść. Żadna z odpowiedzi tutaj nie zapewniła pełnego rozwiązania, więc oto jest:


Wystarczy sprawdzić, czy na wejściu jest ''lub null, ponieważ:

Wynik żądania adresu URL .../test.php?var=w$_GET['var'] = ''

Wynik żądania adresu URL .../test.phpw$_GET['var'] = null


isset()zwraca falsetylko wtedy, gdy zmienna istnieje i nie jest ustawiona na null, więc jeśli jej użyjesz, otrzymasz truepuste ciągi ( '').

empty()uwzględnia oba nulli ''puste, ale uwzględnia również '0'puste, co jest problemem w niektórych przypadkach użycia.

Jeśli chcesz traktować '0'jako pusty, użyj empty(). W przeciwnym razie skorzystaj z następującego sprawdzenia:

$var .'' !== ''ocenia falsetylko dla następujących danych wejściowych:

  • ''
  • null
  • false

Używam następującego sprawdzenia, aby odfiltrować ciągi zawierające tylko spacje i znaki końca wiersza:

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

0

Używam poniższego, aby uniknąć powiadomień, to sprawdza, czy var jest zadeklarowany w GET lub POST i z prefiksem @ możesz bezpiecznie sprawdzić, czy nie jest pusty i uniknąć powiadomienia, jeśli var nie jest ustawiony:

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

@Nie należy zachęcać do używania operatora „stfu” ( ) i nie jest on konieczny w przypadku fragmentu kodu. To nie jest dobra odpowiedź. Robisz luźne porównanie. Równie dobrze możesz użyć !empty().
mickmackusa

1
Ooo stary ... To jest świetne dla przykładu złego kodowania. @spowoduje problemy z debugowaniem, wpływ strony jest wolniejszy i nadal możesz mieć error_logponad 1 GB w jednej chwili. Po prostu bądź mądry i używaj !empty(), !is_null()czy coś w tym stylu.
Ivijan Stefan Stipić

0

isset () służy do sprawdzenia, czy zmienna ma ustawioną wartość, czy nie, a Empty () służy do sprawdzenia, czy dana zmienna jest pusta, czy nie.

isset () zwraca wartość true, gdy zmienna nie ma wartości null, podczas gdy Empty () zwraca wartość true, jeśli zmienna jest pustym ciągiem.


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';
    }

Źródło: Php.net




0

! pusty wystarczy. jeśli chcesz tylko sprawdzić, czy dane istnieją, czy nie, użyj isset, inne puste może obsłużyć inne walidacje

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

?>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.