2009-05-18 6 views
11

, ben veritabanından bir değer çekin ve onu 0 olup olmadığını kontrol etmek gerekir. Yine bugün ona bakıldığında Ama orada bir hata farkPHP'de 0'a kıyasla en iyi nasıl? Üzerinde çalıştığım bir kod bit olarak

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

toplam: Başlangıçta, bu yazmıştı bu değer, veritabanından geliyor yana

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

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

genellikle o bir dize olacağı anlamına gelir, bu yüzden ben bu yapabileceğini varsayalım:

if ($myVal === "0") 

ama aslında bir tamsayı ile uğraşan olmak istiyorum çünkü karşı sezgisel görünüyor ve inci dizelerle çalıştığımızı gösterecek gibi görünüyor. (O size mantıklı umut.) Ayrıca, herhangi bir DB erişimci alan türü göz önüne alındığında, bunların uygun türe değerleri kullanacağı ortaya beklenmedik olmamalıdır. Bir dize veya bir int olabilecekken

Ne yöntem değeri 0 olup olmadığını kontrol etmek kullanıyorsunuz?

+0

+1 PHP'nin tür hokkabazlığı söz konusu olduğunda çok basit ancak şaşırtıcı derecede ilginç bir soru gibi görünüyor. – cletus

cevap

19

Kısa versiyona dize döküm için:

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

veya

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

Uzun versiyon:

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

oh zekidir - bunu başka bir şekilde değiştirmeyi düşünmezdim! – nickf

+1

Tahminimce, uzun versiyon aslında daha hızlı bir versiyon. === hızlı bir karşılaştırma çünkü bu tür dönüşümler yok. – jmucchiello

+0

@Jm: muhtemelen haklısınız. Yazmak daha sinir bozucu. :) – cletus

2

Şu anda var iyi şudur:

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

Bu durum her zaman false değerini döndürür, çünkü sorunuzda söylediğiniz gibi db değerleri dizeler olarak döndürülür. $ myVal bir dizedir ve karşılaştırma burada duracaktır. Karşılaştırmayı yapmadan önce değerinizi bir tamsayıya dönüştürmelisiniz. –

+1

Aslında bgy, is_numeric() bir sayısal değer dizesi için true değerini döndürür. Bkz. Http://au2.php.net/is_numeric – thomasrutter

0

kullanmayı deneyin intval() Bir int

if(intval($myVal) == 0) 
+3

(intval ("bu, sıfıra eşit olmamalıdır") == 0) true – nickf

+0

-1: intval ('null') 0 döndürür – ya23

+0

Bir dize bir dize Döküm dize basamaklarla başlamadıkça 0 olur. "Foo" dizesi 0'a dönüşür, "35foo" dizesi 35'e dönüşür. – dirtside

1

geri veritabanından almak değerleri dizelerdir, ancak orijinal veri türü sonra muhtemelen DAO (Data Access Object istiyorum, tam sayıdır, tam o çekiyor ne olursa olsun Eğer veri) beklediğiniz veri türlerine şeyler dökmek için. Bu şekilde, değerlere bakan PHP kodu, beklediği veri türüne bakıyor.

sorun DB tanımlayan veri türleri ve PHP tanımlayan veri türleri arasında 1-1 yazışma olmadığını, elbette vardır. Ancak, çoğunlukla bu bir sorun değildir, çünkü normalde kullandığımız çoğu tür için eşdeğer tipler vardır: int, float, bool, string.

görüşünüzü veritabanını sorgulamak yerine ve bu değerleri kontrol yerde arasında, bu değerler beklediğiniz veri türlerine döküm gerektiğini vardır. Sadece int (10) ve varchar (50) içeren bir MySQL tablosunda mysql_fetch_object() ile test ettim; Her iki alan da PHP tarafından her zaman "string" olarak çekildi. Bu nedenle, int olarak değerlendirilen alanlardan birini istiyorsanız, onunla bir şey yapmadan önce bir int olarak yayınlayın. Örneğin: kapsüllenmiş var ki

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

sorgulama ve RealRow malzeme, bir sınıf/yöntem içinde olmalıdır; bu şekilde, table'dan veri alan kodunuzun HERHANGİ bir parçası, her zaman uygun veri türlerine ayarlanmış olan her şey $ RealRow nesnesini alır.Elbette, veri türlerinizi değiştirirseniz, bu, dökümle ilgilenmek için DAO'yu manuel olarak düzenlemeyi gerektirir; Ayrıca, her bir alanın türünü almak için DB'yi sorgulamak da mümkün olacaktır ("Tablodan Tabloyu Göster") ve alanları otomatik olarak alanları uygun veri türüne dönüştürür.

+0

"myTable'DAN FULL COLUMNS GÖSTER" komutu, her alanın veri türlerini belirlemenin çok daha kolay bir yoludur. Ancak, bazen, bu soyutlama seviyesi belli bir durum için üst üste olabilir. – nickf

+0

"SHOW [FULL] COLUMNS" aslında veri tiplerini temel türlere, gösterim alanlarına, imzasız vb. Ayrı alanlara ayırdı, böylece programlamaya daha erişilebilir oldu. Şu anda çıktının "Tip" alanını elle ayırmak zorundasın ... ama eminim ki birisi bunun için bir kütüphaneye sahip. – dirtside

1

Ben sadece

if ($myVal == 0) 

Ben $ MyVal "foo" olup olmadığı hakkında endişe gerekli olduğunu sanmıyorum kullanmak gerektiğini düşünüyorum. Bu değerin sadece bir sayı olacağını asla kendiniz söylediniz. Başka bir deyişle

, hiç MyVal "foo" olmak $ yaşarsanız, hata "foo" == 0, hata bir numara olması gerekiyor zaman $ MyVal "foo", olmasıdır olmadığı.

0
if(('integer' === gettype($is_anonymous) && $is_anonymous === 0) 
    || 
    ('string' === gettype($is_anonymous) && $is_anonymous === '0')  
) { 
    echo 'matches'; 
} 
+0

Bu kod soruyu yanıtlayabilirken, neden ve/veya bu kodun soruyu nasıl yanıtladığıyla ilgili ek bağlam sağlayarak uzun vadeli değerini artırır. –

İlgili konular