2015-10-09 26 views
5

Geçenlerde sen PDO'daki boş değerler bağlayabilir öğrendim:PDO'da "null değil" bağlanıyor mu?

$stmt = $db->prepare('SELECT * FROM foo WHERE bar = :bar'); 
$stmt->execute(array(':bar'=>null)); 
$foo = $stmt->fetchAll(PDO::FETCH_OBJ); 

Bu başarıyla bar sütun null veritabanı, tüm foo getirmesi olacaktır. Bununla birlikte, şimdi tam tersini yapmak istiyorum. bar sütununun numaralı null olduğu tüm sütunları getirmek istiyorum.

bar = :bar'u bar IS NOT NULL ile değiştirebileceğimin farkındayım. Bununla birlikte, bundan kaçınmak isterim ve bunun yerine hazırlamalı ifadeler yaparak yaparım, çünkü bazen dinamik olarak sorgu dizesini oluşturmak zorundayım ve bunu elle yapmak çok fazla iş gerektirecektir.

Bu mümkün mü?

+0

[pixie] (https://github.com/usmanhalalit/pixie) gibi sorgu oluşturucu kitaplığını kullanabilir ve daha sonra dinamik sorguları kolayca oluşturabilir veya kendi sorgu oluşturucunuzu hazırlayabilirsiniz – Gal

+0

İki deyim oluşturursunuz, değerleri ve diğerlerini kullandığınız 'NULL DEĞİLDİR'. PDO ** parametrelerini ** yazacaktır. – Mjh

+0

@Mjh PDO/MySQL parametreleri * değerleri olarak değerlendirecektir. Dahil olan herhangi bir alıntı olabilir veya olmayabilir; İdeal olarak, yerel hazırlanmış ifadeler kullanıyorsanız, herhangi bir alıntı söz konusu değildir. Parametrelerin sözdizimi veya değerlerin bir parçası olarak ele alınmasında sadece bir fark var. – deceze

cevap

7

"NOT NULL" bağlayamazsınız. Yalnızca değerlerini'a bağlayabilirsiniz. "NULL DEĞİLDİR" bir değer değil, tamamen farklı bir sorgu sözdizimi.

$query = 'SELECT ... WHERE '; 
if (/* condition is NOT NULL */) { 
    $query .= 'foo IS NOT NULL'; 
    $stmt = $db->prepare($query); 
} else { 
    $query .= 'foo = :foo'; 
    $stmt = $db->prepare($query); 
    $stmt->bindValue('foo', $foo); 
} 
$stmt->execute(); 
+0

Tamam, sanırım bu onu hallediyor. Bunun gerçekte olduğundan daha zor olacağını düşündüm. Yardım için teşekkürler. –

2

ben size varsayım yanlış korkarım: Sadece değeri bu konuda size yardımcı olamaz bağlama, dinamik sorgu oluşturmak zorunda kalacaktır. NULL değerlerini genel olarak bağlayabilmenize rağmen, WHERE bar = NULL ifadesi, ham SQL veya PDO ile size hiçbir satır döndürmez. Bu tüm ifade NULL olarak değerlendirilecek ve herhangi bir satırla eşleşmeyecek. Bunun yerine, NULL olan veya bir değeri olan alanları eşleştirmek için, <=> numaralı işleçle aynı NULL güvenli bir işleç kullanabilirsiniz. Ancak, null olmayan değerlere sahip olmak için yine de başka bir sorgunuz olmalıdır.

İlgili konular