2012-06-27 9 views
5

मैं उपयोगकर्ता द्वारा प्रदत्त मानकों द्वारा खोज करने के लिए पैरामीटरयुक्त क्वेरी निष्पादित करना चाहता हूं। बहुत सारे पैरामीटर हैं और उनमें से सभी को हर समय आपूर्ति नहीं की जा रही है। मैं एक मानक क्वेरी कैसे कर सकता हूं जो सभी संभावित मानकों को निर्दिष्ट करता है, लेकिन इन पैरामीटरों में से कुछ को अनदेखा करते हैं यदि उपयोगकर्ता ने सार्थक पैरामीटर मान नहीं चुना है?विशेष रूप से WHERE मानदंडों को अनदेखा करें

यहाँ वर्णन करने के लिए कि मैं क्या जाहिर है के लिए

$sql = 'SELECT * FROM people WHERE first_name = :first_name AND last_name = :last_name AND age = :age AND sex = :sex'; 
$query = $db->prepare($sql); 
$query->execute(array(':first_name' => 'John', ':age' => '27'); 

जा रहा हूँ एक काल्पनिक उदाहरण है, इस काम नहीं करेगा क्योंकि प्रदान की पैरामीटर की संख्या की उम्मीद पैरामीटर की संख्या से मेल नहीं खाता। क्या मुझे WHERE क्लॉज में केवल निर्दिष्ट पैरामीटर को शामिल करने के साथ हर बार क्वेरी तैयार करना है, या इन पैरामीटरों में से कुछ को अनदेखा करने के लिए कोई तरीका है या चेक किए जाने पर हमेशा सत्य वापस आना है?

उत्तर

7
SELECT * FROM people 
WHERE (first_name = :first_name or :first_name is null) 
AND (last_name = :last_name or :last_name is null) 
AND (age = :age or :age is null) 
AND (sex = :sex or :sex is null) 

जब पैरामीटर, जिन्हें आप की जरूरत नहीं है के लिए आपूर्ति null गुजर।

ध्यान दें कि एक प्रश्न इस तरह से चलाने के लिए सक्षम होने के लिए, पीडीओ के लिए emulation mode आपकी क्वेरी बदलकर ON

+0

मुझे लगता है कि वह क्या चाहता है नहीं लगता। यह मिलान होगा 'first_name' का मिलान मूल्य है, या यदि यह शून्य है। लेकिन जो मैं समझता हूं, वह चाहता है कि वह 'first_name' किसी भी चीज़ से मिलान करे (जैसे कि उस कॉलम के लिए कोई WHERE क्लॉज नहीं था)। – netcoder

+0

@netcoder यह जांच नहीं कर रहा है कि first_name शून्य है, तो यह जांच रहा है कि '(first_name = @var या @var शून्य है)' –

+0

ओह, आप सही हैं, मैंने बहुत तेज़ पढ़ा है :) – netcoder

1

आप अपनी समस्या को हल नहीं कर सकता है चालू करने की है ... कई पुस्तकालयों कि के साथ मदद कर रहे हैं प्रश्न पूछना मैंने पहले भी Zend_Db_Select का उपयोग किया है लेकिन हर ढांचे की संभावना कुछ इसी तरह की है:

$sql = 'SELECT * FROM people WHERE 1 = 1'; 

WHERE 1 = 1 आप किसी भी शामिल नहीं हो सकेंगे:

$select = new Zend_Db_Select; 

$select->from('people'); 

if (!empty($lastName)) { 
    $select->where('lastname = ?', $lastname); 
} 

$select->order('lastname desc')->limit(10); 

echo $select; // SELECT * FROM people WHERE lastname = '...' ORDER BY lastname desc LIMIT 10 
2

पहले, करने के लिए बस अपने $sql स्ट्रिंग को बदलने के द्वारा शुरू अतिरिक्त पैरामीटर ...

अगला, अपने $sql स्ट्रिंग को किसी भी अतिरिक्त पैरामीटर के साथ चुनिंदा रूप से संयोजित करें जिसका अर्थपूर्ण मूल्य है:

$sql .= ' AND first_name = :first_name' 
$sql .= ' AND age = :age' 

आपका $sql स्ट्रिंग अब केवल पैरामीटर है कि आप प्रदान करने की योजना में शामिल है, तो आप के रूप में पहले आगे बढ़ सकते हैं:

$query = $db->prepare($sql); 
$query->execute(array(':first_name' => 'John', ':age' => '27'); 
0

मैं समाधान @juergen द्वारा दिए गए परीक्षण किया है, लेकिन यह बाद से एक PDOException देता है बाध्य चर की संख्या मेल नहीं खाती है। निम्नलिखित (ताकि सुरुचिपूर्ण नहीं) कोड मानकों का कोई की परवाह किए बिना काम करता है:

function searchPeople($inputArr) 
{ 
    $allowed = array(':first_name'=>'first_name', ':last_name'=>'last_name', ':age'=>'age', ':sex'=>'sex'); 

    $sql = 'SELECT * FROM sf_guard_user WHERE 1 = 1'; 

    foreach($allowed AS $key => $val) 
    { 
     if(array_key_exists($key, $inputArr)){ 
      $sql .= ' AND '. $val .' = '. $key; 
     } 
    } 

    $query = $db->prepare($sql); 
    $query->execute($inputArr); 
    return $query->fetchAll(); 
} 

उपयोग:

$result = searchPeople(array(':first_name' => 'John', ':age' => '27')); 
+0

क्या आप नामित पैरामीटर और PHP + PDO का नवीनतम संस्करण उपयोग कर रहे हैं? यह मेरे लिए ठीक काम करता है। – kotekzot

+0

हां, मैं नामांकित पैरामीटर और PHP 5.3.5 का उपयोग mysqlnd 5.0.7 के साथ कर रहा हूं। उपर्युक्त कोड ठीक काम करता है, लेकिन अगर मैं $ sql स्ट्रिंग को केवल @juergen d के साथ प्रतिस्थापित करता हूं तो PDOException देता है। उनकी विधि निश्चित रूप से अधिक सुरुचिपूर्ण है, और मैं इसका उपयोग करना पसंद करूंगा। कोई अंदाजा क्या गलत हो सकता है? – qais

+0

आपको अवांछित पैरामीटर के लिए शून्य की आपूर्ति करनी है। – kotekzot

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