Wo soll ich isset () und! Empty () verwenden?

105

Ich habe irgendwo gelesen, dass die isset()Funktion eine leere Zeichenfolge als behandelt TRUEund daher isset()keine effektive Möglichkeit ist, Texteingaben und Textfelder aus einem HTML-Formular zu validieren.

Sie können also empty()überprüfen, ob ein Benutzer etwas eingegeben hat.

  1. Stimmt es, dass die isset()Funktion eine leere Zeichenfolge als behandelt TRUE?

  2. In welchen Situationen sollte ich dann verwenden isset()? Sollte ich immer verwenden !empty(), um zu überprüfen, ob etwas vorhanden ist?

Zum Beispiel statt

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

Verwenden Sie dies

if(!empty($_GET['gender']))...
Schienbein
quelle
mögliches Duplikat von Warum sowohl isset () als auch! empty ()
überprüfen

Antworten:

135

isset vs.! leer

Freihandelsabkommen:

"isset () prüft, ob eine Variable einen Wert hat, der (False, 0 oder leere Zeichenfolge), aber nicht NULL enthält. Gibt TRUE zurück, wenn var vorhanden ist; andernfalls FALSE.

Andererseits prüft die Funktion empty (), ob die Variable einen leeren Wert hat: leere Zeichenfolge, 0, NULL oder False. Gibt FALSE zurück, wenn var einen nicht leeren Wert und einen Wert ungleich Null hat. "

dassouki
quelle
47
Freihandelsabkommen: Aus dem Artikel
Jianxin Gao
5
empty()Gibt auch true für ein leeres Array zurück.
Mitya
Auch wenn empty()TRUE für 0 zurückgegeben wird, ist es keine gute Idee, diesen Operator für die Mathematik zu verwenden, falls "0" versehentlich eine Zeichenfolge ist. Dies kann gefährlich sein. Verwenden Sie stattdessen grundlegende >, <und ==Operatoren und convert Variablen intval()oder floatval().
Kaleazy
32

Im Allgemeinen:

  • issettestet, ob eine Variable (oder ein Element eines Arrays oder eine Eigenschaft eines Objekts) vorhanden ist (und nicht null ist)
  • empty testet, ob eine Variable (...) nicht leere Daten enthält.


Um Frage 1 zu beantworten :

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

gibt

boolean true

Weil die Variable $strexistiert.


Und Frage 2 :

Sie sollten isset verwenden, um festzustellen, ob eine Variable vorhanden ist . Wenn Sie beispielsweise Daten als Array abrufen, müssen Sie möglicherweise überprüfen, ob ein Schlüssel in diesem Array vorhanden ist.
Denken Sie an $_GET/ $_POST, zum Beispiel.

Nun, um an seinem Wert zu arbeiten, wenn Sie wissen, dass es einen solchen Wert gibt: das ist die Aufgabe von empty.

Pascal MARTIN
quelle
11

Es ist auch keine gute Möglichkeit, nach gültigen Eingaben zu suchen.

  • isset() ist nicht ausreichend, da - wie bereits erwähnt - eine leere Zeichenfolge als gültiger Wert betrachtet wird.
  • ! empty() ist auch nicht ausreichend, weil es '0' ablehnt, was ein gültiger Wert sein könnte.

Die Verwendung in isset()Kombination mit einer Gleichheitsprüfung für eine leere Zeichenfolge ist das absolute Minimum, das Sie benötigen, um zu überprüfen, ob ein eingehender Parameter einen Wert hat, ohne falsche Negative zu erstellen:

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

Aber mit "absolutes Minimum" meine ich genau das. Der obige Code bestimmt lediglich, ob es einen Wert für gibt $_GET['gender']. Es ist nicht festzustellen , ob der Wert für $_GET['gender']ist gültig (zB eines ).("Male", "Female","FileNotFound")

Siehe dazu die Antwort von Josh Davis .

Gemeinschaft
quelle
Da Sie einen losen Vergleich verwenden, gibt Ihr vorgeschlagenes Snippet falsch positive Ergebnisse aus, wenn Sie einen Null-ish / falsey-Wert ohne Zeichenfolge verarbeiten. 3v4l.org/aIWqA
mickmackusa
11

issetist nur für Variablen und nicht nur für Werte vorgesehen und isset("foobar")löst daher einen Fehler aus. Ab PHP 5.5 emptywerden sowohl Variablen als auch Ausdrücke unterstützt.

Also Ihre erste Frage sollte eher , wenn sein issetkehrt wahr für eine Variable , die eine leere Zeichenfolge enthält. Und die Antwort lautet:

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

Die Typvergleichstabellen im PHP-Handbuch sind für solche Fragen sehr praktisch.

issetGrundsätzlich wird geprüft, ob eine Variable einen anderen Wert als null hat, da nicht vorhandene Variablen immer den Wert null haben . emptyist eine Art Gegenstück zu isset, behandelt aber auch den ganzzahligen Wert 0und den Zeichenfolgenwert "0"als leer. (Schauen Sie sich noch einmal die Typvergleichstabellen an .)

Gumbo
quelle
1
Beachten Sie, dass ab empty()PHP 5.5.0 auch "Ausdrücke und nicht nur Variablen unterstützt".
ComFreek
8

Wenn Sie ein $ _POST ['param'] haben und davon ausgehen, dass es sich um einen Zeichenfolgentyp handelt, dann

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

ist identisch mit

!empty($_POST['param'])
macio.Jun
quelle
4

isset () ist keine effektive Methode zum Überprüfen von Texteingaben und Textfeldern aus einem HTML-Formular

Sie können dies umschreiben, da "isset () keine Möglichkeit ist, Eingaben zu validieren". Um Validieren Sie die Eingabe verwenden PHP Filter - Erweiterung . filter_has_var()Hier erfahren Sie, ob die Variable vorhanden ist, während filter_input()die Eingabe tatsächlich gefiltert und / oder bereinigt wird.

Beachten Sie, dass Sie nicht verwenden müssen , um filter_has_var()vor filter_input()und wenn Sie für eine Variable stellen , die nicht gesetzt ist, filter_input()wird einfach zurückgeben null.

Josh Davis
quelle
3

Wann und wie zu verwenden:

  1. isset ()

True für 0, 1, leere Zeichenfolge, eine Zeichenfolge, die einen Wert enthält, true, false

Falsch für null

z.B

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

False für 1, eine Zeichenfolge mit einem Wert, true

True für null, leere Zeichenfolge, 0, false, z

$status = 0
if(empty($status)) // true
$status = 1
if(empty($status)) // False
Fokwa Best
quelle
2

isset wird verwendet, um zu bestimmen, ob eine Instanz von etwas existiert, dh wenn eine Variable instanziiert wurde ... es geht nicht um den Wert des Parameters ...

Pascal MARTIN ... +1 ...

empty () generiert keine Warnung, wenn die Variable nicht vorhanden ist. Daher wird isset () bevorzugt, wenn Sie prüfen, ob eine Variable vorhanden ist, wenn Sie sie ändern möchten.

Mike
quelle
1

Verwenden emptyist genug:

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

Wenn Sie einen ganzzahligen Wert wünschen, sollten Sie dies auch überprüfen intval($variable) !== FALSE.

Du
quelle
2
Außerdem gibt intval () niemals FALSE zurück.
Josh Davis
1
Es ist NICHT genug, da '0' eine gültige Zeichenfolge ist, aber nicht für empty... isset/ filter_has_varmuss verwendet werden, um zu überprüfen, ob var vorhanden ist.
Yousha Aleayoub
1
isset($variable) === (@$variable !== null)
empty($variable) === (@$variable == false)
muhen
quelle
1

Ich bin hierher gekommen, um schnell zu überprüfen, ob eine Variable Inhalt enthält. Keine der Antworten hier lieferte eine vollständige Lösung, daher hier:


Es reicht zu überprüfen, ob die Eingabe ''oder ist null, weil:

URL- .../test.php?var=Ergebnisse anfordern in$_GET['var'] = ''

URL- .../test.phpErgebnisse anfordern in$_GET['var'] = null


isset()Gibt falsenur zurück, wenn die Variable existiert und nicht auf gesetzt nullist. Wenn Sie sie also verwenden, erhalten Sie trueleere Zeichenfolgen ( '').

empty()betrachtet beides nullund ''leer, aber es betrachtet auch '0'leer, was in einigen Anwendungsfällen ein Problem darstellt.

Wenn Sie '0'als leer behandeln möchten , verwenden Sie empty(). Verwenden Sie andernfalls die folgende Prüfung:

$var .'' !== ''wird falsenur für die folgenden Eingaben ausgewertet :

  • ''
  • null
  • false

Ich verwende die folgende Prüfung, um auch Zeichenfolgen mit nur Leerzeichen und Zeilenumbrüchen herauszufiltern:

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

Ich verwende Folgendes, um Benachrichtigungen zu vermeiden. Dadurch wird überprüft, ob die Variable in GET oder POST deklariert ist. Mit dem Präfix @ können Sie sicher überprüfen, ob sie nicht leer ist, und die Benachrichtigung vermeiden, wenn die Variable nicht festgelegt ist:

if( isset($_GET['var']) && @$_GET['var']!='' ){
    //Is not empty, do something
}
Aztrozero
quelle
Der "stfu operator" ( @) sollte nicht ermutigt werden und ist für Ihr Snippet nicht erforderlich. Dies ist keine gute Antwort. Sie machen einen losen Vergleich. Sie können auch verwenden !empty().
Mickmackusa
1
Ooo man ... Das ist großartig für das schlechte Codierungsbeispiel. @Wenn Sie Probleme beim Debuggen haben, ist die Auswirkung auf die Seite langsamer und Sie können error_login einem Moment immer noch über 1 GB haben . Seien Sie smart und Verwendung !empty(), !is_null()oder so ähnlich.
Ivijan Stefan Stipić
0

Mit isset () wird geprüft, ob die Variable mit dem Wert gesetzt ist oder nicht, und mit Empty () wird geprüft, ob eine bestimmte Variable leer ist oder nicht.

isset () gibt true zurück, wenn die Variable nicht null ist, während Empty () true zurückgibt, wenn die Variable eine leere Zeichenfolge ist.

Shreya Thakuri
quelle
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';
    }

Quelle: Php.net

csandreas1
quelle
0

isset () vs empty () vs is_null ()

Geben Sie hier die Bildbeschreibung ein

Foued MOUSSI
quelle
0

! leer wird den Trick machen. Wenn Sie nur überprüfen müssen, ob Daten vorhanden sind oder nicht, können Sie mit isset other empty andere Validierungen durchführen

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

?>

iNandi
quelle