Czy w php 0 jest traktowane jako puste?

144

Kod wyjaśni więcej:

$var = 0;

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

Wynik zwraca „Jest pusty”. Pomyślałem, że puste () sprawdzi, czy ustawiłem już zmienną i mam wartość w środku. Dlaczego zwraca „Jest pusty”?

mysqllearner
źródło
15
@stereo emptyjest prawdopodobnie najbardziej użyteczną, ale powszechnie niezrozumianą funkcją PHP. Dowiedz się, jak i kiedy go używać.
deceze
2
@stereo emptyto skrót od isset($var) && $var != false. Musisz się emptybardzo dziwnie trzymać, żeby strzelić sobie tym w stopę. ; P
deceze
@stereo 1) Gdzie jest to „niespójne”? Działa tak, jak napisano na puszce. 2) Luźne porównywanie zmiennej falsebez wywoływania błędu „niezdefiniowana zmienna” jest bezużyteczne? No cóż, chyba nigdy tego nie zrobisz… 3) Wybór niewłaściwej funkcji w kontekście bezpieczeństwa nie oznacza, że ​​sama funkcja jest zła, bezużyteczna lub niespójna; oznacza to po prostu, że ktoś wybrał niewłaściwą funkcję do tego zadania.
deceze
18
@deceze - jeśli funkcja jest tak powszechnie źle rozumiana empty(), prawdopodobnie ma niewłaściwą nazwę.
martinstoeckli

Odpowiedzi:

189

http://php.net/empty

Następujące rzeczy są uważane za puste:

  • „” (pusty ciąg)
  • 0 (0 jako liczba całkowita)
  • 0,0 (0 jako liczba zmiennoprzecinkowa)
  • „0” (0 jako ciąg)
  • ZERO
  • FAŁSZYWE
  • array () (pusta tablica)
  • var $ var; (zadeklarowana zmienna, ale bez wartości w klasie)

Zauważ, że jest to dokładnie ta sama lista, co w przypadku przymusu na wartość logiczną false. emptyjest po prostu !isset($var) || !$var. Spróbuj issetzamiast tego.

zamrozić
źródło
Więc muszę sprawdzić w ten sposób: if (isset ($ var) && $ var! = 0) {Zrób coś} ??
mysqllearner
1
@mysql W tym przypadku równie dobrze możesz użyć !empty($var), ale pamiętaj, że to nie to samo, co napisałeś w pytaniu. To, czego użyć, zależy całkowicie od wartości, które chcesz traktować true. Wystarczy porównać różnice między isseti emptyi wybrać odpowiednią kombinację dla odpowiedniej sytuacji.
deceze
7
@mysqllearner: issetzwraca Trueif $var=0. Ale to, co masz na myśli, if(isset($var) && $var != 0)to to samo, coempty
Felix Kling,
@mysqllearner isset wykrywa, czy NIE jest pusty. aby sprawdzić, czy jest pusty, użyj zamiast tego! isset.
1
@Deji Ponieważ PHP ma swoje korzenie jako język WWW, a wartości w żądaniach HTTP są zawsze ciągami znaków, '0'jest traktowane jako równoważne 0. To podstawowa filozofia projektowania PHP. Zgadzam się, że jest to niezwykle dyskusyjny wybór, jednak nie jestem tutaj, aby z wami debatować nad tym wyborem. W logice PHP, emptyjako odpowiednik == falsepowiadomień minus, jest w porządku IMO. To, że niektóre rzeczy powinny wyglądać inaczej w PHP niż są, to inny temat.
deceze
76

Zastanawiałem się, dlaczego nikt nie zasugerował niezwykle poręcznej tabeli porównawczej typów . Odpowiada na wszystkie pytania dotyczące wspólnych funkcji i porównywania operatorów.

Fragment:

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   

Wraz z innymi ściągami zawsze trzymam wydruk tego stołu na biurku, na wypadek, gdyby nie był pewien

Dan Soap
źródło
2
powinieneś teraz zaktualizować ściągawkę Dam ci więcej ... 0,0 = prawda, 0,00 = prawda, "0,0" = fałsz
Mohd Ali
34

W przypadku wartości liczbowych należy użyć funkcji is_numeric:

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}
Khandad Niazi
źródło
1
Niezłe obejście, gdy trzeba sprawdzić „0” lub 0
nicooo.
12

Użyj strlen()zamiast tego. Natrafiłem na ten sam problem, używając 1/0 jako możliwych wartości dla niektórych zmiennych. Używam if (strlen($_POST['myValue']) == 0)do sprawdzenia, czy w mojej zmiennej jest znak, czy nie.

Calin Rusu
źródło
po prostu dodaj @strlen, aby pominąć dziennik błędów, na wszelki wypadek ... aby nie tworzyć dużego dziennika
Miguel
Dlaczego miałbyś to umieścić @strlen. Dopóki przekazujesz zmienną, nie powinna ona generować błędu. Jeśli twój strlen jest pusty, zapisze wartość jako 0.
naszkicuj to
2
Jeśli zmienna nie jest ustawiona, wierzę, że wystąpi błąd.
Evren Yurtesen
11

Niedawno zostałem przyłapany na tym również ze spuszczonymi spodniami. Problem, z którym często mamy do czynienia, to nieustawione zmienne - powiedzmy element formularza, który mógł tam być lub nie, ale dla wielu elementów 0(lub ciąg znaków, '0'który trafiłby przez post, ale nadal byłby oceniany jako „falsey” ) jest uzasadnioną wartością, którą można znaleźć na liście rozwijanej.

używając empty()najpierw, a potem strlen()najlepiej, jeśli tego również potrzebujesz, ponieważ:

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}
Oliver Williams
źródło
6

Z językowego punktu widzenia puste ma znaczenie bez wartości . Jak powiedzieli inni, będziesz musiał użyć isset(), aby sprawdzić, czy zmienna została zdefiniowana, co właśnie robisz.

Elzo Valugi
źródło
1
Ta prosta odpowiedź pomogła mi wyjaśnić się 0w porównaniu nullproblem z obroną. Dzięki!
Giacomo1968
4

empty()zwraca prawdę dla wszystkiego, do czego się zwraca FALSE, w rzeczywistości jest to „nie” ( !) w przebraniu. Myślę, że miałeś na myśliisset()

soulmerge
źródło
4

Aby zaakceptować 0 jako wartość w zmiennej, użyj isset

Sprawdź, czy zmienna jest pusta

$var = 0;

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

Sprawdź, czy zmienna jest ustawiona

$var = 0;

if (isset($var)) {
    echo "not empty";
} else {    
    echo "empty";
}
//output is not empty
bhu1st
źródło
4

To działa dla mnie!

//
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
źródło
1

Następujące rzeczy są uważane za puste:

  • „” (pusty ciąg)
  • 0 (0 jako liczba całkowita)
  • „0” (0 jako ciąg)
  • ZERO
  • FAŁSZYWE
  • array () (pusta tablica)
  • var $ var; (zadeklarowana zmienna, ale bez wartości w klasie)

Z podręcznika PHP

W twoim przypadku $varjest 0, więc empty($var)wróci true, jesteś negując wynik przed testowania go, więc inny blok zostanie uruchomiony dając „ Its empty” jako wyjście.

codaddict
źródło
1

Z instrukcji: zwraca FALSE, jeśli zmienna ma niepustą i niezerową wartość.

Następujące rzeczy są uważane za puste:

  • „” (pusty ciąg)
  • 0 (0 jako liczba całkowita)
  • „0” (0 jako ciąg) NULL
  • FALSE tablica () (pusta tablica) zmienna
  • $ var; (zadeklarowana zmienna, ale bez wartości w klasie)

Więcej: http://php.net/manual/en/function.empty.php

Adam Kiss
źródło
1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

W moim przypadku ten kod zadziałał.

Cherrish
źródło
0

Właściwie jest ustawiony, po prostu sprawdź, czy zmienna jest ustawiona, czy nie.W tym przypadku, jeśli chcesz sprawdzić, czy twoja zmienna jest naprawdę zerowa lub pusta, możesz użyć tego przykładu:

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

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

tylko dla powiadomienia $ myVar == 0 działa jak pusta funkcja.

wysypka
źródło
0

pusty powinien oznaczać pusty… cokolwiek mówi deceze.

Kiedy robię

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

Spodziewam się, że var_dump(empty($var));to zwróci fałsz.

jeśli sprawdzasz rzeczy w tablicy, zawsze musisz to zrobić w isset($var)pierwszej kolejności.

Paul Wolbers
źródło
0

użyj tylko ($_POST['input_field_name'])!=0zamiast !($_POST['input_field_name'])==0wtedy 0 nie jest traktowane jako puste.

Manish Sharma
źródło
0

Nie jestem pewien, czy nadal są ludzie, którzy szukają wyjaśnienia i rozwiązania. Powyższe komentarze mówią wszystko o różnicach między PRAWDA / FAŁSZ / 1 / 0.
Chciałbym tylko przynieść moje 2 centy za sposób wyświetlania rzeczywistej wartości.

BOOLEAN

Jeśli pracujesz z typem danych Boolean, szukasz wyniku TRUE vs. FALSE; jeśli zapiszesz go w MySQL, zostanie zapisany jako 1 lub odpowiednio. 0 (jeśli się nie mylę, to jest to samo w pamięci twojego serwera).

Aby wyświetlić wartość w PHP, musisz sprawdzić, czy jest to prawda (1) czy fałsz (0) i wyświetlić cokolwiek chcesz: „TRUE” lub „FALSE” lub ewentualnie „1” lub „0”.
Uwaga, wszystko większe (lub inne) niż 0 będzie również traktowane jako PRAWDA w PHP. Np .: 2, „abc” itp. Zwróci wartość TRUE.

BIT, TINYINT

Jeśli pracujesz z typem danych liczbowych, sposób ich przechowywania jest taki sam.
Aby wyświetlić wartość, musisz powiedzieć PHP, aby traktował ją jako liczbę. Najłatwiejszym sposobem, jaki znalazłem, jest pomnożenie go przez 1.

Alex Tanner
źródło
0

właściwy przykład. wystarczy utworzyć pole typu int (przykładowy numer telefonu komórkowego) w bazie danych i przesłać pustą wartość dla poniższej bazy danych za pomocą formularza lub po prostu wstawić za pomocą SQL. co zostanie zapisane w bazie danych 0, ponieważ jest typu int i nie może być zapisane jako puste lub puste. w związku z tym jest pusty, ale zostanie zapisany jako 0, więc podczas pobierania danych przez PHP i sprawdzania pustych wartości. jest to bardzo przydatne i logicznie poprawne.

0,00, 0,000, 0,0000 .... 0,0 ... 0 jest również puste, a powyższy przykład może być również użyty do przechowywania różnych typów wartości w bazie danych, takich jak zmiennoprzecinkowe, podwójne, dziesiętne (dziesiętne mają różne warianty, takie jak 0,000 i tak dalej.

Sayed Mohd Ali
źródło
0

Musisz użyć isset (), aby sprawdzić, czy wartość jest ustawiona.

Veershetty
źródło
Cześć @Veershetty, witamy w Stack Overflow. Dziękuję za odpowiedź, ale nie wydaje się, aby dodawać nic nowego do istniejących, bardziej szczegółowych odpowiedzi. Edytuj odpowiedź, aby dodać szczegóły, których brakuje w innych odpowiedziach, lub rozważ usunięcie odpowiedzi, jeśli nie dodaje ona nic nowego.
Gricey