Php, 0 boş olarak kabul edilir?


144

Kod daha fazlasını açıklayacaktır:

$var = 0;

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

Sonuç "Boş" döndürür. Ben boş () zaten değişken ayarlamak ve içinde değer olup olmadığını kontrol edecek düşündüm. Neden "Boş" döndürüyor ??


15
@stereo emptybelki de en kullanışlı ama çok yanlış anlaşılan PHP fonksiyonudur. Nasıl ve ne zaman kullanacağınızı öğrenin.
deceze

2
@stereo emptyaslında kısadır isset($var) && $var != false. emptyBununla kendinizi ayağa vurmak için çok garip olmalısınız . ; P
deceze

@stereo 1) "Tutarsız" nerede? Kalayda söylediği gibi çalışır. 2) Bir değişkeni false"tanımsız değişken" hatasını tetiklemeden gevşek bir şekilde karşılaştırmak işe yaramaz mı? Oh, sanırım bunu asla yapmazsın ... 3) Güvenlik bağlamında yanlış işlevi seçmek, işlevin kendisinin kötü, yararsız veya tutarsız olduğu anlamına gelmez; bu sadece birisinin iş için yanlış işlevi seçtiği anlamına gelir.
deceze


18
@deceze - Bir işlev bu kadar yaygın bir şekilde yanlış anlaşılırsa empty(), muhtemelen yanlış ada sahiptir.
martinstoeckli

Yanıtlar:


189

http://php.net/empty

Aşağıdaki şeyler boş olarak kabul edilir:

  • "" (boş bir dize)
  • 0 (tam sayı olarak 0)
  • 0.0 (şamandıra olarak 0)
  • "0" (dize olarak 0)
  • BOŞ
  • YANLIŞ
  • array () (boş bir dizi)
  • var $ var; (bildirilen ancak sınıfta değeri olmayan bir değişken)

Bu listenin Boole'ye uygulanan bir baskı ile tam olarak aynı liste olduğunu unutmayın false. emptybasitçe !isset($var) || !$var. issetBunun yerine deneyin .


Yani, böyle kontrol etmeliyim: if (isset ($ var) && $ var! = 0) {Bir Şey Yap} ??
mysqllearner

1
@mysql Bu durumda da kullanabilirsiniz !empty($var), ancak bunun soruya yazdıklarınızla aynı olmadığını unutmayın. Ne kullanılacağı tamamen hangi değerleri dikkate almak istediğinize bağlıdır true. Sadece issetve arasındaki farkları karşılaştırın ve emptydoğru durum için doğru kombinasyonu seçin.
deceze

7
@mysqllearner: eğer issetdöndürür . Ama ne demek istediğinizle aynıTrue$var=0if(isset($var) && $var != 0)empty
Felix Kling

@mysqllearner isset boş olmadığını algılar. boş olup olmadığını kontrol etmek için! isset kullanın.

1
@Deji PHP'nin kökleri bir web dili olduğundan ve HTTP isteklerindeki değerler her zaman dize '0'olduğundan eşdeğer olarak kabul edilir 0. Bu PHP'nin temel bir tasarım felsefesidir. Bunun son derece tartışmalı bir seçim olduğuna katılıyorum, ancak bu seçimi sizinle tartışmak için burada değilim. PHP'nin mantığı içinde, eksi bildirimlere emptyeşdeğer olarak == falseiyi IMO'dur. Bazı şeylerin PHP'de olduğundan çok farklı olması, farklı bir konudur.
deceze

76

Kimsenin neden son derece kullanışlı Tip karşılaştırma tablosunu önermediğini merak ediyordum . Ortak fonksiyonlar hakkındaki her soruyu cevaplar ve operatörleri karşılaştırır.

Parçacık:

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   

Diğer hile sayfalarının yanı sıra, emin olamamam durumunda her zaman bu masanın bir kopyasını masamda tutarım


2
Hile sayfanızı şimdi güncellemelisiniz Size biraz daha vereceğim ... 0.0 = doğru, 0.00 = doğru, "0.0" = yanlış
Sayed Mohd Ali

34

Sayısal değerlerde is_numeric işlevini kullanmalısınız:

$var = 0;

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

1
'0' veya 0'a karşı kontrol etmeniz gerektiğinde güzel bir çözüm
nicooo.

12

strlen()Bunun yerine kullanın . Bazı değişkenler için olası değerleri 1/0 kullanarak aynı sorunu koştu. Değişkemde if (strlen($_POST['myValue']) == 0)bir karakter olup olmadığını test etmek için kullanıyorum .


büyük bir günlük oluşturmamak için hata günlüğünü atlamak için bir @strlen ekleyin
Miguel

Neden koydun @strlen? Bir değişkeni ilettiğiniz sürece hata vermemelidir.
Strlen boşsa

2
Değişken ayarlanmamışsa, bir hata alacağınıza inanıyorum.
Evren Yurtesen

11

Son zamanlarda bu bir de benim pantolon aşağı yakalandı. Sıklıkla uğraştığımız sorun ayarlanmamış değişkenlerdir - orada olabilecek veya olmayabilir, ancak birçok öğe için 0(veya '0'yayından daha doğru gelen ancak yine de "falsey" olarak değerlendirilecek olan bir form öğesi diyelim) ) bir açılır listede yer alan meşru bir değerdir.

empty()ilk önce kullanmak ve sonra strlen()da buna ihtiyacınız varsa en iyisi, gibi:

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

6

Dilbilimsel açıdan bakıldığında boş , değersiz demektir . Diğerlerinin söylediği gibi, isset()bir değişkenin tanımlanıp tanımlanmadığını kontrol etmek için kullanmanız gerekecek .


1
Bu basit yanıt, 0karşı bir nullkonuyu kolaylıkla gidermeme yardımcı oldu . Teşekkürler!
Giacomo1968

4

empty()değerlendirilen her şey için doğru döndürür FALSE, aslında !kılık değiştirmiş bir 'değil' ( ) 'dir . Bence demek istedinisset()


4

Değişken kullanımda değer olarak 0 kabul etmek isset

Değişkenin boş olup olmadığını kontrol edin

$var = 0;

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

Değişkenin ayarlanıp ayarlanmadığını kontrol edin

$var = 0;

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

4

Benim için çalışıyor!

//
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']=''

1

Aşağıdaki şeyler boş olarak kabul edilir:

  • "" (boş bir dize)
  • 0 (tam sayı olarak 0)
  • "0" (dize olarak 0)
  • BOŞ
  • YANLIŞ
  • array () (boş bir dizi)
  • var $ var; (bildirilen ancak sınıfta değeri olmayan bir değişken)

Gönderen PHP Manual

Senin durumda $varolduğunu 0, bu yüzden empty($var)dönecektir truebaşka blok "vererek çalışacak, böylece, bunu test etmeden önce sonucunu negating edilir Its emptyçıktı olarak".


1

El kitabından: var boş ve sıfır dışında bir değere sahipse FALSE değerini döndürür.

Aşağıdaki şeyler boş olarak kabul edilir:

  • "" (boş bir dize)
  • 0 (tam sayı olarak 0)
  • "0" (dize olarak 0) NULL
  • FALSE dizi () (boş bir dizi) var
  • var $; (bildirilen ancak sınıfta değeri olmayan bir değişken)

Daha fazla: http://php.net/manual/en/function.empty.php


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

Benim durumumda bu kod çalıştı.


0

Aslında isset sadece değişkenin ayarlanıp ayarlanmadığını kontrol edin.Bu durumda değişkeninizin gerçekten sıfır veya boş olup olmadığını kontrol etmek istiyorsanız bu örneği kullanabilirsiniz:

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

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

sadece uyarı için $ myVar == 0 boş işlev gibi davranır.


0

boş boş anlamına gelir .. ne olursa olsun deceze diyor.

Ben yaparken

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

Bunu bekliyorum var_dump(empty($var)); yanlış döneceğini umuyorum.

Eğer bir dizideki şeyleri kontrol ediyorsanız, her zaman önce yapmanız gerekir isset($var).


0

yalnızca 0 ($_POST['input_field_name'])!=0yerine kullanın !($_POST['input_field_name'])==0, boş olarak değerlendirilmez.


0

Hala bir açıklama ve çözüm arayan insanlar olup olmadığından emin değilim. Yukarıdaki yorumlar her şeyin DOĞRU / YANLIŞ / 1/0 arasındaki farklar hakkında olduğunu söylüyor.
Sadece 2 sentimi gerçek değeri görüntüleme yolu için getirmek istiyorum.

BOOLE

Boole veri tipiyle çalışıyorsanız, DOĞRU ve YANLIŞ bir sonuç arıyorsunuz; MySQL'de saklarsanız, 1 resp olarak depolanır. 0 (yanlış bir şey yapmıyorsam, bu sunucunuzun belleğinde aynıdır).

PHP'deki değeri görüntülemek için, bunun doğru (1) veya yanlış (0) olup olmadığını kontrol etmeniz ve istediğinizi görüntülemeniz gerekir: "DOĞRU" veya "YANLIŞ" veya muhtemelen "1" veya "0".
Dikkat, 0'dan büyük (veya farklı) her şey PHP'de TRUE olarak kabul edilecektir. Örn: 2, "abc" vb. Hepsi DOĞRU döndürür.

BIT, TINYINT

Bir sayı veri türüyle çalışıyorsanız, depolanma şekli aynıdır.
Değeri görüntülemek için PHP'ye bir sayı olarak işlemesini söylemeniz gerekir. Bulduğum en kolay yol onu 1 ile çarpmak.


0

uygun örnek. veritabanında int türü alanı (örnek cep telefonu numarası) oluşturun ve bir form aracılığıyla aşağıdaki veritabanı için boş bir değer gönderin veya SQL kullanarak ekleyin. int türünde olduğu ve boş veya boş olarak kaydedilemediği için 0 veritabanına kaydedilecekler. bu nedenle boştur ancak 0 olarak kaydedilecektir, böylece PHP ile veri getirdiğinizde ve boş değerleri kontrol ettiğinizde. çok faydalı ve mantıklı bir şekilde doğru.

0.00, 0.000, 0.0000 .... 0.0 ... 0 da boştur ve yukarıdaki örnek ayrıca float, double, ondalık (ondalık 0.000 gibi farklı varyantlara sahiptir) gibi farklı veri tiplerini veritabanında saklamak için de kullanılabilir.


0

Değerin ayarlanıp ayarlanmadığını kontrol etmek için isset () kullanmanız gerekir.


Merhaba @Veershetty, Stack Overflow'a hoş geldiniz. Cevabınız için teşekkürler, ancak mevcut, daha ayrıntılı cevaplara yeni bir şey eklemiyor gibi görünüyor. Cevabı, diğer yanıtlardan eksik ayrıntı eklemek için düzenleyin veya yeni bir şey eklemiyorsa cevabınızı silmeyi düşünün.
Gricey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.