2011-08-16 10 views
7
$stmt = $dbh->prepare('SELECT id, name FROM folders WHERE parent_folder_id = :id'); 
$stmt->bindValue(':id', $folder_id, PDO::PARAM_INT); 

Yukarıdaki kodu kullanıyorum. Bir klasörde bir parent_folder_id varsa, başka bir klasörde olduğu anlamına gelir. Bu sütun NULL ise, kök klasör olduğu anlamına gelir.PDO ile hem INT hem de NULL kabul etmek istiyorsam nasıl değer girilir?

$ folder_id dosyası NULL ise, NULL öğesinden sonra 0 olarak davranacaktır (bu nedenle, bu sütundaki değer NULL değil 0 olduğu için kodla sonuç elde edemiyorum). Üçüncü bağımsız değişkeni PDO :: PARAM_NULL olarak değiştirirsem hala sonuç alamıyorum. Bunun nedeni, "WHERE parent_folder_id = NULL" sorgusunu "WHERE parent_folder_id is NULL" ile aynı olmayan "WHERE parent_folder_id = NULL" olarak değerlendirdiğinden eminim.

PDO'nun bunu doğru bir şekilde ele almasının bir yolu var mı, yoksa "=" ile "=" değerini değiştirmek ve bindValue üçüncü parametresini doğru olanla değiştirmek için SQL deyimi satır içi ile oluşturmalı mıyım?

cevap

6

MySQL'i kullanıyorsanız, null değerini karşılaştırabilen standart olmayan NULL-safe equal operator <=>'u kullanabilirsiniz. boş olmayan değerler.

$stmt = $dbh->prepare('SELECT id, name FROM folders WHERE parent_folder_id <=> :id'); 
$stmt->bindValue(':id', $folder_id, PDO::PARAM_INT); 

Bu operatör her zaman = eşittir ile NULL'A şey karşılaştırmak çalışırsanız ne olsun ki, doğru veya NULL, yanlış değil döner.

ANSI SQL, benzer şekilde çalışan bir IS [NOT] DISTINCT FROM yüklemini tanımlar, ancak tüm satıcılar tarafından desteklenmez (henüz).

+2

Teşekkürler! Bu hile yaptı ve bana da bir şey öğrettiniz, daha önce hiç <=> kullanmamıştım (yikes, biraz partiye, ha?). Bu bana gelecekte bir sürü baş ağrısı kurtaracak, bu kesin :) – Gazillion

0

Belki bu?

<?php 
    $stmt = $dbh->prepare('SELECT id, name FROM folders WHERE parent_folder_id = :id'); 
    if (is_null($folder_id)) { 
    $stmt->bindParam(':id',null, PDO::PARAM_NULL); 
    } else { 
    $stmt->bindParam(':id', $folder_id, PDO::PARAM_INT); 
    } 

Test edilmedi

olsa DÜZENLEME: Böyle

Daha bir şey:

<?php 
    if (is_null($folder_id)) {  
     $stmt = $dbh->prepare('SELECT id, name FROM folders WHERE parent_folder_id IS NULL'); 
    } else { 
     $stmt = $dbh->prepare('SELECT id, name FROM folders WHERE parent_folder_id = :id'); 
     $stmt->bindParam(':id', $folder_id, PDO::PARAM_INT); 
    } 

Bunun optimum olmadığını biliyorum ama PDO hala adamcağız ...

+0

Bu, hiçbir sonuç almadığım sorunu çözmez çünkü NULL ise, bunun yerine sql sorgumu hazırladığım şekilde değiştirmem gerekir. Eğer durum buysa (inline-if ile) ancak PDO'nun bunu benim için değiştirecek kadar akıllı olduğunu ve nasıl yapacağımı bilmiyorum. – Gazillion

+0

PDO'ya fazla güvenme: ana bakıcı yaklaşık 2 yıl önce ayrıldı ve bu yana proje oldukça durdu. –

+0

Teşekkürler, akılda tutulacağım :) – Gazillion

2

NULL-safe equal operator, <=>'u kullanabilirsiniz. Sorgunuz SELECT id, name FROM folders WHERE parent_folder_id <=> :id

şeklinde olmalıdır. Başka bir veritabanına geçtiğinizde ve sorguyu güncellemeniz gerekiyorsa, bazılarının aynı şeyle ilgili olan bir NOT DISTINCT FROM vardır.

+0

Üzgünüz, ben yayınladığım zaman Bill'in cevabını görmedim – shesek

+0

Teşekkürler, doğru cevaptı ama çok yavaş (birkaç saniye hehehe))! ;) – Gazillion

İlgili konular