2013-01-04 11 views
15

में तैयार वक्तव्य का उपयोग कैसे कर सकता हूं हाय सब मुझे अपनी साइट में तैयार वक्तव्यों का उपयोग करने की आवश्यकता है। मैंने इसमैं कोडइग्निटर

$sql = "SELECT * FROM tbl_user WHERE uid=:id and activation_key=:key"; 
$query = $this->db->query( 
    $sql, 
    array(':id' => $uid ,':key' => $activation_key) 
); 

का उपयोग करने का प्रयास किया लेकिन यह काम नहीं कर रहा है। जब मैं :id और :key से ? बदलता हूं तो यह काम करता है।

उत्तर

28

कोडइग्निटर तैयार वक्तव्य का समर्थन नहीं करता है। आप सीआई के डाटाबेस वर्ग के लिए sourcecode को देखें, तो आपको लगता है कि वे बस से पारित कर दिया सरणी से डेटा के साथ प्रश्न चिह्न की जगह बाइंडिंग को हल देखेंगे:

वे केवल क्वेरी बाइंडिंग का समर्थन अज्ञात प्लेसहोल्डर के साथ। http://ellislab.com/codeigniter/user-guide/database/queries.html

क्वेरी बाइंडिंग

बाइंडिंग दे प्रणाली आप के लिए एक साथ प्रश्नों डाल द्वारा अपने क्वेरी सिंटैक्स को आसान बनाने के लिए सक्षम देखें। निम्न उदाहरण पर विचार करें:

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?"; 
$this->db->query($sql, array(3, 'live', 'Rick')); 

क्वेरी में प्रश्न चिह्न स्वचालित रूप से क्वेरी समारोह के दूसरे पैरामीटर में सरणी में मानों से बदल रहे हैं।

और http://ellislab.com/forums/viewthread/105112/#528915

हालांकि सीआई तैयार बयान का समर्थन नहीं करता है, यह क्वेरी बाइंडिंग समर्थन करता है। तैयार बयानों के साथ आपको कुछ प्रकार के तैयार() फ़ंक्शन और फिर कुछ प्रकार के निष्पादन() फ़ंक्शन को कॉल करना होगा। क्वेरी बाइंडिंग के साथ, आपको केवल एक फ़ंक्शन कॉल करना होगा और यह मूल रूप से वही काम करता है। इस वजह से, मुझे तैयार बयानों को तैयार बयानों से बेहतर पसंद है।

एक sidenote पर, :foo को ? बदलते केवल नामित बाइंडिंग (जो सीआई जाहिरा तौर पर या तो समर्थन नहीं करता है) करने के लिए अनाम से बदल रहा है। सिर्फ इसलिए कि आप या तो इसका उपयोग करते हैं या इसका मतलब यह नहीं है कि आप कथन तैयार कर रहे हैं।

+0

क्या मैं आपकी मदद की जरूरत है की अनुमति होगी। यहां देखें: http://stackoverflow.com/questions/38607368/how-to-implement-in-to-prepare-statement?noredirect=1#comment64603092_38607368 –

3

मैं इस प्रश्न पर आया क्योंकि मुझे एक समान समस्या का सामना करना पड़ा। जवाब सही है कि सीआई तैयार कथन का समर्थन नहीं करता है। हालांकि यह का मतलब नहीं है कि आप तैयार कथन का उपयोग नहीं कर सकते हैं!

निम्न उदाहरण मैं अपने कनेक्शन वर्ग के रूप में पीडीओ उपयोग कर रहा हूँ, लेकिन निम्नलिखित कोड काम करेंगे में:

$q = $this->db->conn_id->prepare('SELECT * FROM tbl_user WHERE uid=? and activation_key=?'); 
$q->execute(array($param1,$param2)); 
print_r($q->fetchAll()); 

नोट conn_id पीडीओ वस्तु जिसके विरुद्ध आप अपने तैयार बयान चला सकते है।

हालांकि यह आपके लिए क्वेरी स्ट्रिंग प्राप्त करने के लिए अनुमति नहीं देगा, जो देशी सीआई फ़ंक्शन अनुमति देता है। इसके लिए आपको Get Last Executed Query in PHP PDO जैसे कुछ की आवश्यकता होगी।

और भी अधिक, हालांकि यह आपके बयान बनाने के लिए क्वेरी बिल्डर का उपयोग करने से नहीं रोकता है जिसे आप पीडीओ तैयार करने में उपयोग कर सकते हैं।उदाहरण के लिए -

$db->where('uid = ?',null,false); 
$db->where('activation_key = ?',null,false); 
$q = $this->db->conn_id->prepare($db->get_compiled_select('tbl_user')); 

क्वेरी का निर्माण होगा और आप मूल क्वेरी को देखने के लिए आप उत्पादन $db->get_compiled_select('tbl_user');

+0

सीआई + सुरक्षित तैयार बयान – vivoconunxino