Nasıl iyi PHP 0'a karşılaştırmak için?

5 Cevap php

Ben üzerinde çalışıyorum, bir kod bit, ben veritabanından bir değer çekin ve 0 olup olmadığını kontrol etmeniz gerekir. : Başlangıçta, ben bu yazmıştı

if ($myVal == 0) { ...

Bugün yine baktım ama ne zaman, ben orada bir hata fark ettim:

var_dump("foo" == 0);  // bool(true)

// and while we're here...
var_dump(intval("foo")); // int(0)

Bu değer veritabanından geliyor bu yana, yani usually bir dize olacağı anlamına gelir, bu yüzden ben bu yapabileceğini varsayın:

if ($myVal === "0")

ama ben aslında bir tamsayı ile ilgili olmak istiyorum çünkü karşı sezgisel görünüyor, ve bu biz dizeleri ile çalışıyoruz olduğunu göstermek için görünür. (I hope that makes sense to you.) Ayrıca, alan türü verilen, herhangi bir DB accessor onların uygun türü değerleri döküm olacağını beklenmedik olmamalıdır.

Hangi yöntem bunu bir dize veya bir int olabilir zaman 0 değerine kontrol etmek için kullanabilirim?

5 Cevap

Kısa versiyon:

if ("$myVal" === '0')

veya

if (strval($myVal) === '0')

Uzun versiyon:

if ($myVal === 0 || $myVal === '0')

Elimdeki en iyi şu anda şudur:

is_numeric($myVal) && $myVal == 0

Ben sadece kullanmak gerektiğini düşünüyorum

if ($myVal == 0)

Ben $ MyVal "foo" olup olmadığı konusunda endişe gerekli olduğunu sanmıyorum. Bu değer sadece hiç bir sayı olacak olduğunu kendin söyledin.

Hiç $ MyVal "foo" olma deneyimi Başka bir deyişle, hata "foo" == 0 o bir numara olması gerekirken, hata, $ MyVal "foo" olmasıdır değildir.

Int dize döküm için () intval kullanmayı deneyin

if( intval($myVal) == 0 )

Geri veritabanından almak değerler dizeleri, ama orijinal veri türü tamsayı ise, o zaman muhtemelen DAO (Data Access Object, veya ne olursa olsun o veriyi çekiyor) sen beklemek veri türleri şeyler döküm istiyorum. Bu şekilde, değerleri bakıyor PHP kodu beklediği veri türü bakıyor.

Sorun DB tanımlayan veri türleri arasında 1-1 yazışma olmadığını, tabii ki, ve veri türleri PHP tanımlar. Int, float, bool, dize: Biz normalde kullandığınız türlerinin çoğu için eşdeğer türleri var Ancak, çoğunlukla bu, bir sorun değildir.

Görüşünüzü veritabanını sorgulamak yerine, ve bu değerleri kontrol yeri arasında, bu değerler beklediğiniz veri türleri döküm olmalıdır olmasıdır. Ben sadece bir int (10) ve bir varchar (50) içeren bir MySQL masaya mysql_fetch_object () ile test; Her iki alanlar daima PHP ile tip "string" olarak çekilmiştir. İsterseniz onunla bir şey yapmak Yani önce bir int olarak ele alanlardan biri, bir int döküm. Örneğin:

$rs = mysql_query("SELECT * FROM table");
while ($row = mysql_fetch_object($rs)) {
    $RealRow->id = (int)$row->id;
    $RealRow->name = $row->name;
    // etc.
}

// ... later ...

if ($RealRow->status == 0) {
    // do something
}

Bu kapsüllü o kadar sorgu ve RealRow şeyler, bir sınıf / yöntem içinde olmalıdır; bu şekilde, veri alır kodunuzu HERHANGİ parçası table her zaman her şeyi doğru veri türlerine ayarlanmış olacaktır, bunun yerine $ RealRow nesneyi alacak. Tabii ki, sizin veri türlerini değiştirmek ise, bu elle döküm ile başa çıkmak için DAO düzenleme gerektirir; aynı zamanda (bir "FROM tablo sütunları göster" ile) her alanın türü almak için DB sorgulamak mümkün olacak, ve automatically doğru veri türüne alanları döküm olacaktır.