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

मैं ऊपर कोड है। यदि किसी फ़ोल्डर में parent_folder_id है तो इसका मतलब है कि यह किसी अन्य फ़ोल्डर के अंदर है। यदि यह कॉलम नल है तो इसका मतलब है कि यह एक रूट फ़ोल्डर है।यदि मैं पीडीओ के साथ आईएनटी और न्यूल दोनों को स्वीकार करना चाहता हूं तो एक मूल्य कैसे बांधें?

मेरी समझ से अगर $ folder_id नल है तो यह 0 के रूप में इसका इलाज करेगा (इसलिए मुझे कोड के साथ कोई परिणाम नहीं मिलता है क्योंकि उस कॉलम में मान न्यूल है और 0 नहीं है)। यदि मैं पीडीओ :: PARAM_NULL को तीसरा तर्क बदलता हूं तो मुझे अभी भी कोई परिणाम नहीं मिलते हैं। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि यह क्वेरी को "WHERE parent_folder_id = NULL" के रूप में मूल्यांकन करता है जो "WHERE parent_folder_id NULL" के बराबर नहीं है।

क्या पीडीओ का यह सही तरीके से इलाज करने का कोई तरीका है या क्या मुझे "एस" को "है" के साथ बदलने के लिए एक इनलाइन के साथ अपना SQL कथन बनाना चाहिए और सही के साथ bindValue तीसरा पैरामीटर स्वैप करना चाहिए?

उत्तर

6

यदि आप MySQL का उपयोग कर रहे हैं, तो आप गैर मानक NULL-safe equal operator <=> का उपयोग कर सकते हैं, जो या तो शून्य या तुलना कर सकते हैं गैर-शून्य मान

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

इस ऑपरेटर हमेशा सच या, झूठी शून्य नहीं देता है, जो है अगर आप शून्य करने के लिए कुछ भी की तुलना करने के = के बराबर होती है के साथ की कोशिश है कि तुम क्या मिलता है।

एएनएसआई एसक्यूएल एक अनुमानित IS [NOT] DISTINCT FROM परिभाषित करता है जो समान रूप से काम करता है, लेकिन यह सभी विक्रेताओं (अभी तक) द्वारा समर्थित नहीं है।

+2

धन्यवाद! यह चाल है और आपने मुझे कुछ भी सिखाया है, मैंने कभी भी <=> का उपयोग नहीं किया था (यिक्स, पार्टी के लिए थोड़ा, एह?)। यह भविष्य में मुझे बहुत सारे सिरदर्द बचाएगा, यह निश्चित रूप से है :) – Gazillion

0

शायद यह?

<?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); 
    } 

जांची नहीं हालांकि

संपादित करें:

अधिक कुछ इस तरह:

<?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); 
    } 

मैं जानता हूँ कि यह इष्टतम नहीं है, लेकिन अभी भी पीडीओ गाड़ी है ...

+0

यह समस्या हल नहीं करता है कि मुझे कोई परिणाम नहीं मिलता है क्योंकि यदि यह शून्य है तो मुझे अपनी एसक्यूएल क्वेरी तैयार करने के तरीके को बदले में बदलना होगा। मुझे पता है कि अगर यह मामला था (एक इनलाइन-अगर) के साथ मैं यह कैसे करूँगा लेकिन मुझे एहसास है कि पीडीओ शायद मेरे लिए इसे बदलने के लिए पर्याप्त स्मार्ट है और मुझे नहीं पता कि कैसे। – Gazillion

+0

पीडीओ पर बहुत भरोसा मत करो: मुख्य रखरखाव लगभग 2 साल पहले छोड़ा गया था, और परियोजना के बाद से काफी रोक दिया गया है। –

+0

धन्यवाद, मैं इसे ध्यान में रखूंगा :) – Gazillion

2

आप NULL-safe equal operator, <=> उपयोग कर सकते हैं। आपकी क्वेरी SELECT id, name FROM folders WHERE parent_folder_id <=> :id

होना चाहिए क्या तुमने कभी एक और डेटाबेस के लिए बदल सकते हैं और क्वेरी को अद्यतन करने की जरूरत है, उनमें से कुछ एक NOT DISTINCT FROM जो एक ही बात के बारे में करता है।

+0

क्षमा करें, मैंने इसे पोस्ट किए जाने पर बिल का जवाब नहीं देखा – shesek

+0

धन्यवाद, सही जवाब था लेकिन आप बहुत धीमे थे (कुछ सेकंड तक)! ;) – Gazillion

संबंधित मुद्दे

 संबंधित मुद्दे