2010-03-03 12 views
19

मैं डेटाबेस एक्सेस के लिए पीडीओ का उपयोग करने के लिए कुछ PHP कोड पुनः काम कर रहा हूं, लेकिन मैं "WHERE ... IN" क्वेरी के साथ समस्या में भाग रहा हूं।पीडीओ "WHERE ... IN" क्वेरी

मैं डेटाबेस से कुछ चीजों को हटाने की कोशिश कर रहा हूं, इस पर आधारित कि किसी आइटम पर कौन से आइटम चेक किए गए हैं। लंबाई और सूची की सामग्री को अलग अलग होंगे, लेकिन इस उदाहरण के लिए, कल्पना यह इस बात यह है कि:

$idlist = '260,201,221,216,217,169,210,212,213'; 

फिर क्वेरी इस तरह दिखता है:

$query = "DELETE from `foo` WHERE `id` IN (:idlist)"; 
$st = $db->prepare($query); 
$st->execute(array(':idlist' => $idlist)); 

जब मैं ऐसा करते हैं, केवल पहले आईडी हटा दिया गया है। (मुझे लगता है कि यह कॉमा और उसके बाद सब कुछ फेंकता है।)

मैंने $idlist एक सरणी बनाने की भी कोशिश की है, लेकिन फिर यह कुछ भी नहीं हटाता है।

पीडीओ तैयार कथन में वस्तुओं की सूची का उपयोग करने का उचित तरीका क्या है?

+0

आपको अपने प्रश्न में कोई समाधान नहीं जोड़ना चाहिए। यदि आपको लगता है कि एक बेहतर उत्तर है, तो अपने स्वयं के प्रश्न का उत्तर दें या मूल उत्तर में संपादन का सुझाव दें। – PhoneixS

+0

@PhoneixS ठीक सलाह, लेकिन आखिरकार मैंने 2010 में इस सवाल को छुआ और वास्तव में उस वर्ष से PHP के साथ काम नहीं किया है। अगर आपको पसंद है तो संपादित करने के लिए स्वतंत्र महसूस करें। –

उत्तर

24

जब से तुम नियंत्रण प्रवाह तर्क (अल्पविराम) तैयार बयान के साथ साथ मानों (संख्या) को शामिल नहीं कर सकते हैं मूल्य प्रति एक प्लेसहोल्डर की जरूरत है।

$idlist = array('260','201','221','216','217','169','210','212','213'); 

$questionmarks = str_repeat("?,", count($idlist)-1) . "?"; 

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` IN ($questionmarks)"); 

और पैरामीटर को बांधने के लिए लूप।

+0

बहुत उपयोगी - धन्यवाद! –

+2

अच्छा, धन्यवाद। मैं इसे इस तरह उपयोग करता हूं हालांकि: 'implode (', ', str_split (str_repeat ('? ', गिनती ($ idList))); ' – Alec

+6

या:' implode (',', array_fill (0, गिनती ($ idList), '?')); '(यदि गिनती> 0 जो उत्तर के लिए भी अनिवार्य है), ['array_fill'] (http://php.net/array_fill) देखें, [' str_repeat'] (http: //php.net/str_repeat) – hakre

-3

मैं $ idlist और सरणी बनाउंगा, फिर विशिष्ट आइटम को हटाने के लिए फ़ोरैच का उपयोग करके सरणी के माध्यम से बस लूप करें।

$idlist = array('260','201','221','216','217','169','210','212','213'); 

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` = ?"); 
$stmt->bindParam(1, $id); 

foreach ($idlist as $item){ 
    $id = $item; 
    $stmt->execute(); 
} 
+7

व्यावहारिक दृष्टिकोण, लेकिन महंगा! इसे एक प्रश्न में रखते हुए * बहुत * अच्छा होगा। –

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