Wird 0 in PHP als leer behandelt?

143

Code wird mehr erklären:

$var = 0;

if (!empty($var)){
echo "Its not empty";
} else {
echo "Its empty";
}

Das Ergebnis gibt "Es ist leer" zurück. Ich dachte, empty () prüft, ob ich die Variable bereits gesetzt habe und Wert darin habe. Warum gibt es "Es ist leer" zurück?

mysqllearner
quelle
15
@stereo emptyist vielleicht die nützlichste, aber weithin missverstandene PHP-Funktion. Erfahren Sie, wie und wann Sie es verwenden sollen.
Täuschung
2
@stereo emptyist im Wesentlichen die Abkürzung für isset($var) && $var != false. Sie müssen Ihre emptysehr seltsame halten, um sich damit in den Fuß zu schießen. ; P
Täuschung
@stereo 1) Wo ist es "inkonsistent"? Es funktioniert wie es heißt. 2) Ein loser Vergleich einer Variablen mit, falseohne einen "undefinierten Variablen" -Fehler auszulösen, ist nutzlos? Vermutlich tun Sie das nie ... 3) Die Auswahl der falschen Funktion in einem Sicherheitskontext bedeutet nicht, dass die Funktion selbst schlecht, nutzlos oder inkonsistent ist. es bedeutet nur, dass jemand die falsche Funktion für den Job gewählt hat.
Täuschung
18
@deceze - Wenn eine Funktion so häufig missverstanden wird empty(), hat sie wahrscheinlich den falschen Namen.
Martinstoeckli

Antworten:

189

http://php.net/empty

Die folgenden Dinge gelten als leer:

  • "" (eine leere Zeichenfolge)
  • 0 (0 als Ganzzahl)
  • 0,0 (0 als Schwimmer)
  • "0" (0 als Zeichenfolge)
  • NULL
  • FALSCH
  • array () (ein leeres Array)
  • var $ var; (eine deklarierte Variable, jedoch ohne Wert in einer Klasse)

Beachten Sie, dass dies genau die gleiche Liste ist wie für einen Booleschen Zwang false. emptyist einfach !isset($var) || !$var. Versuchen Sie es issetstattdessen.

täuschen
quelle
Also muss ich so prüfen: if (isset ($ var) && $ var! = 0) {Do Something} ??
Mysqllearner
1
@mysql Für diesen Fall könnten Sie genauso gut verwenden !empty($var), aber beachten Sie, dass dies nicht das gleiche ist, was Sie in der Frage geschrieben haben. Was zu verwenden ist, hängt ganz davon ab, welche Werte Sie als betrachten möchten true. Vergleichen Sie einfach die Unterschiede zwischen issetund emptyund wählen Sie die richtige Kombination für die richtige Situation.
Täuschung
7
@mysqllearner: issetRenditen , Truewenn $var=0. Aber was Sie damit meinen, if(isset($var) && $var != 0)ist dasselbe wieempty
Felix Kling
@mysqllearner isset erkennt, ob es NICHT leer ist. Verwenden Sie stattdessen! isset, um zu überprüfen, ob es leer ist.
1
@Deji Da PHP seine Wurzeln als Web-Sprache hat und Werte in HTTP-Anforderungen immer Zeichenfolgen sind, '0'wird dies als äquivalent zu behandelt 0. Das ist eine zentrale Designphilosophie von PHP. Ich stimme zu, dass dies eine äußerst umstrittene Entscheidung ist , bin jedoch nicht hier, um diese Entscheidung mit Ihnen zu erörtern. Innerhalb der PHP-Logik ist IMO emptyals Äquivalent zu == falseMinus-Hinweisen in Ordnung. Dass einige Dinge in PHP ganz anders sein sollten als sie, ist ein anderes Thema.
Täuschung
76

Ich habe mich gefragt , warum niemand die äußerst praktisch vorgeschlagen Typ Vergleichstabelle . Es beantwortet jede Frage zu den allgemeinen Funktionen und vergleicht Operatoren.

Ein Ausschnitt:

Expression      | empty($x)
----------------+--------
$x = "";        | true    
$x = null       | true    
var $x;         | true    
$x is undefined | true    
$x = array();   | true    
$x = false;     | true    
$x = true;      | false   
$x = 1;         | false   
$x = 42;        | false   
$x = 0;         | true    
$x = -1;        | false   
$x = "1";       | false   
$x = "0";       | true    
$x = "-1";      | false   
$x = "php";     | false   
$x = "true";    | false   
$x = "false";   | false   

Neben anderen Cheatsheets habe ich immer eine Hardcopy dieses Tisches auf meinem Schreibtisch, falls ich mir nicht sicher bin

Dan Soap
quelle
2
Sie sollten jetzt Ihren Spickzettel aktualisieren. Ich werde Ihnen noch mehr geben ... 0.0 = wahr, 0.00 = wahr, "0.0" = falsch
sagte Mohd Ali
34

Bei numerischen Werten sollten Sie die Funktion is_numeric verwenden:

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}
Khandad Niazi
quelle
1
Gute Lösung,
12

Verwenden Sie strlen()stattdessen. Ich bin auf dasselbe Problem gestoßen, indem ich 1/0 als mögliche Werte für einige Variablen verwendet habe. Ich verwende if (strlen($_POST['myValue']) == 0), um zu testen, ob meine Variable ein Zeichen enthält oder nicht.

Calin Rusu
quelle
Fügen Sie einfach ein @strlen hinzu, um das Fehlerprotokoll wegzulassen, nur für den Fall ... um kein großes Protokoll zu erstellen
Miguel
Warum würdest du setzen @strlen. Solange Sie eine Variable übergeben, sollte sie keinen Fehler ausgeben. Wenn Ihre Strlen leer ist, wird der Wert als 0
aufgezeichnet
2
Wenn die Variable nicht gesetzt ist, werden Sie wahrscheinlich einen Fehler erhalten.
Evren Yurtesen
11

Ich wurde vor kurzem auch mit meiner Hose erwischt. Das Problem, mit dem wir uns häufig befassen, sind nicht festgelegte Variablen - beispielsweise ein Formularelement, das möglicherweise vorhanden war oder nicht, aber für viele Elemente 0(oder die Zeichenfolge, '0'die genauer durch den Beitrag kommt, aber dennoch als "Falsey" bewertet wird). ) ist ein legitimer Wert, beispielsweise in einer Dropdown-Liste.

Verwenden Sie empty()zuerst und dann strlen()ist Ihr Bestes, wenn Sie dies auch benötigen, als:

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}
Oliver Williams
quelle
6

Aus sprachlicher Sicht hat leer die Bedeutung wertlos . Wie die anderen sagten, müssen Sie verwenden, isset()um zu überprüfen, ob eine Variable definiert wurde, was Sie auch tun.

Elzo Valugi
quelle
1
Diese einfache Antwort hat mir geholfen, ein 0Versus- nullProblem mit Leichtigkeit zu klären . Vielen Dank!
Giacomo1968
4

empty()gibt true für alles zurück, was ausgewertet wird FALSE, es ist tatsächlich ein 'not' ( !) in Verkleidung. Ich denke du meintestisset()

Soulmerge
quelle
4

Um 0 als Wert in der Variablen zu akzeptieren, verwenden Sie isset

Überprüfen Sie, ob die Variable leer ist

$var = 0;

if ($var == '') {
    echo "empty";
} else {
    echo "not empty"; 
}
//output is empty

Überprüfen Sie, ob die Variable gesetzt ist

$var = 0;

if (isset($var)) {
    echo "not empty";
} else {    
    echo "empty";
}
//output is not empty
bhu1st
quelle
4

Es funktioniert für mich!

//
if(isset($_POST['post_var'])&&$_POST['post_var']!==''){
echo $_POST['post_var'];
}

//results:
1 if $_POST['post_var']='1'
0 if $_POST['post_var']='0'
skip if $_POST['post_var']=''
Toan Nguyen Thai
quelle
1

Die folgenden Dinge gelten als leer:

  • "" (eine leere Zeichenfolge)
  • 0 (0 als Ganzzahl)
  • "0" (0 als Zeichenfolge)
  • NULL
  • FALSCH
  • array () (ein leeres Array)
  • var $ var; (eine deklarierte Variable, jedoch ohne Wert in einer Klasse)

Aus dem PHP-Handbuch

In Ihrem Fall $varist 0, so empty($var)wird zurückkehren true, werden negiert Sie das Ergebnis , bevor es zu testen, so läuft der else - Block „geben Its empty“ als Ausgabe.

Codaddict
quelle
1

Aus dem Handbuch: Gibt FALSE zurück, wenn var einen nicht leeren Wert und einen Wert ungleich Null hat.

Die folgenden Dinge gelten als leer:

  • "" (eine leere Zeichenfolge)
  • 0 (0 als Ganzzahl)
  • "0" (0 als Zeichenfolge) NULL
  • FALSE array () (ein leeres Array) var
  • $ var; (eine deklarierte Variable, jedoch ohne Wert in einer Klasse)

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

Adam Kiss
quelle
1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

In meinem Fall hat dieser Code funktioniert.

Kirsche
quelle
0

Tatsächlich wird nur geprüft, ob die Variable gesetzt ist oder nicht. Wenn Sie in diesem Fall prüfen möchten, ob Ihre Variable wirklich Null oder leer ist, können Sie dieses Beispiel verwenden:

$myVar = '';
if (empty($myVar))
{
  echo "Its empty";
}
echo "<br/>";

if ($myVar===0)
{
  echo "also zero!";
}

Nur zur Kenntnisnahme $ myVar == 0 verhält sich wie eine leere Funktion.

Arash
quelle
0

leer sollte leer bedeuten .. was auch immer Täuschung sagt.

Wenn ich es tue

$var = '';    
$var = '0';

Ich gehe davon aus, dass dies var_dump(empty($var));falsch zurückkommt.

Wenn Sie Dinge in einem Array überprüfen, müssen Sie immer isset($var)zuerst tun .

Paul Wolbers
quelle
0

Nur verwenden ($_POST['input_field_name'])!=0statt !($_POST['input_field_name'])==0dann wird 0 nicht als leer behandelt.

Manish Sharma
quelle
0

Ich bin mir nicht sicher, ob es noch Leute gibt, die nach einer Erklärung und einer Lösung suchen. Die obigen Kommentare sagen alles über die Unterschiede zwischen TRUE / FALSE / 1/0 aus.
Ich möchte nur meine 2 Cent für die Anzeige des tatsächlichen Werts mitbringen.

BOOLEAN

Wenn Sie mit einem booleschen Datentyp arbeiten, suchen Sie nach einem TRUE vs. FALSE-Ergebnis. Wenn Sie es in MySQL speichern, wird es als 1 bzw. 1 gespeichert. 0 (wenn ich mich nicht irre, ist dies auch im Speicher Ihres Servers so).

Um den Wert in PHP anzuzeigen, müssen Sie überprüfen, ob er wahr (1) oder falsch (0) ist, und anzeigen, was Sie wollen: "TRUE" oder "FALSE" oder möglicherweise "1" oder "0".
Achtung, alles, was größer (oder anders) als 0 ist, wird in PHP auch als WAHR betrachtet. Beispiel: 2, "abc" usw. geben alle TRUE zurück.

BIT, TINYINT

Wenn Sie mit einem Datentyp für Zahlen arbeiten, ist die Art und Weise, wie er gespeichert wird, dieselbe.
Um den Wert anzuzeigen, müssen Sie PHP anweisen, ihn als Zahl zu behandeln. Der einfachste Weg, den ich gefunden habe, besteht darin, ihn mit 1 zu multiplizieren.

Alex Tanner
quelle
0

richtiges Beispiel. Erstellen Sie einfach ein Feld vom Typ int (Beispiel für eine Handynummer) in der Datenbank und senden Sie einen leeren Wert für die folgende Datenbank über ein Formular oder fügen Sie es einfach mit SQL ein. Was wird in Datenbank 0 gespeichert, da es vom Typ int ist und nicht als leer oder null gespeichert werden kann? Daher ist es leer, wird aber als 0 gespeichert. Wenn Sie also Daten über PHP abrufen und nach leeren Werten suchen. es ist sehr nützlich und logisch korrekt.

0.00, 0.000, 0.0000 .... 0.0 ... 0 ist ebenfalls leer und das obige Beispiel kann auch zum Speichern verschiedener Wertetypen in Datenbanken wie float, double, decimal verwendet werden (Dezimalstellen haben unterschiedliche Varianten wie 0.000 usw.).

Sagte Mohd Ali
quelle
0

Sie müssen isset () verwenden, um zu überprüfen, ob der Wert festgelegt ist.

Veershetty
quelle
Hallo @Veershetty, willkommen bei Stack Overflow. Vielen Dank für Ihre Antwort, aber es scheint nichts Neues über bestehende, detailliertere Antworten hinzuzufügen. Bearbeiten Sie entweder die Antwort, um Details hinzuzufügen, die in anderen Antworten fehlen, oder löschen Sie Ihre Antwort, wenn nichts Neues hinzugefügt wird.
Gricey