2010-01-03 10 views
6

ठीक है, इसलिए मैं जिस परियोजना पर काम कर रहा हूं उसके लिए मैं PDO wrapper का उपयोग कर रहा हूं, और मैं यह पता लगाने की कोशिश कर रहा हूं कि एक DELETE क्वेरी सफल थी या नहीं।मैं पीडीओ के साथ हटाई गई पंक्तियों की संख्या कैसे प्राप्त कर सकता हूं?

/** 
* A pretty straight-forward query to delete a row from the verification 
* table where user_id is $user_id and code is $code 
*/ 
$result = $this->database->query("DELETE FROM verification " . 
           "WHERE user_id = %u AND code = %s", 
           $user_id, 
           $code); 

/** 
* This function will grab the PDO's exec() return, which should 
* return the number of rows modified. 
*/ 
if($this->database->getNumAffected($result) > 0) 
    return true; 
else 
    return false; 

समस्या यह है कि क्या वास्तव में हटाने, क्वेरी एक पंक्ति को हटा देता है या नहीं,, $ this-> database-> getNumAffected ($ परिणाम) हमेशा रिटर्न '0': यहाँ कोड मैं का उपयोग कर रहा है।

आप रैपर को देख सकते हैं, लेकिन मूल रूप से यह $-> डेटाबेस-> getNumAffected ($ परिणाम) बस वही मान देता है जो पीडीओ :: exec() वापस आ जाएगा।

मैं आवरण के बिना इस कोड की कोशिश की (सीधे पीडीओ में,) और मैं एक ही समस्या थी लेकिन रिवर्स: यह हमेशा वापस आ '1' (। है कि पंक्ति या नष्ट कर दिया गया नहीं)

किसी भी मदद होगी अत्यधिक सराहनीय।

संपादित करें: this पर आधारित SO सवाल, मैं सब ठीक कर रहा हूं ... मुझे समझ में नहीं आता कि यह क्यों काम नहीं कर रहा है।

उत्तर

2

आपकी अपेक्षा के अनुरूप यह काम नहीं करता है, क्योंकि यह है कि आप प्रयोग कर रहे हैं() कभी उपयोग नहीं करता है पीडीओ :: कार्यकारी 'आवरण' - यह लपेटता एक पीडीओ बयान में सब कुछ। आपके द्वारा प्रदत्त URL, 'जिज्ञासा' विधि एक सरणी जो बयान संभाल शामिल लौटना चाहिए से 'डेटाबेस' वर्ग के संस्करण 2.2.6 के लिए स्रोत कोड की एक त्वरित पढ़ने के अनुसार:

502 $statement = $this -> getDatabaseConnection() -> prepare ($query); 
... 
587 $ret = array ($statement, func_get_args(), $lastIndex); 
588  
589 return ($ret); 

तो, यह मानते हुए कि आपका $this->database->query() इस डेटाबेस क्लास 'query विधि को कॉल कर रहा है, आपको $result[0]->rowCount() करने में सक्षम होना चाहिए।

ध्यान दें कि आपकी प्रतिक्रिया का दावा है कि "रैपर जो [आप हैं] पंक्ति पंक्ति() फ़ंक्शन के साथ मौजूद त्रुटि के कारण पंक्ति गणना() के एक अलग संस्करण का उपयोग करता है" सत्य नहीं है - रैपर उपकरण एक numRows, लेकिन यह PDOStatement::rowCount() जैसा ही नहीं है, जो कथन संभाल के अंदर बरकरार है database::query() से लौटा।

+0

मुझे यकीन नहीं है कि इसका मतलब क्या है आप exec() का उपयोग नहीं करते हैं, Ctrl + F दबाएं और निष्पादित करें (। उत्तर के लिए धन्यवाद। –

+2

मेरा मतलब है कि यह पीडीओ :: exec() का उपयोग नहीं करता है, लेकिन PDOStatement :: execute() का उपयोग करता है, जो एक पूरी तरह से अलग बात है। यह शायद php.net/pdo पर जाने के लिए उपयोगी होगा और पीडीओ ऑब्जेक्ट (और इसकी 'exec()' विधि) के बीच अंतर सीखें और PDOStatement ऑब्जेक्ट (और इसकी 'execute()' विधि)। वहाँ कुछ वास्तव में महत्वपूर्ण अंतर हैं। – TML

+0

आह, ठीक है, यह समझ में आता है। उत्तर के लिए बहुत बहुत धन्यवाद, और मैं उस पर ध्यान दूंगा। मुझे नहीं पता पीडीओ के बारे में बहुत कुछ, जब मैंने इसे सीखना शुरू किया (जिसे इस रैपर बनाने वाले व्यक्ति द्वारा प्रेरित किया गया था), मुझे तुरंत इसके लिए उपयोग करने के लिए एक रैपर दिया गया था। मुझे लगता है कि रैपर का एकमात्र लाभ यह है कि आपको चर टाइप करना है, इसलिए यदि यह गलत प्रकार है (उदाहरण के लिए एक स्ट्रिंग जब यह एक पूर्णांक होना चाहिए,) यह एक त्रुटि देता है। ओह, मुझे यह मेरी पहली टिप्पणी में कहना था: मैं समझता हूं कि numRows() rowCount() से बहुत अलग है, और जिस तरह से numRows() काम करता है, मैं इसका उपयोग नहीं करता हूं। –

4
$query = $this->database->prepare("DELETE FROM verification WHERE user_id = :user_id AND code = :code", array('user_id' => $user_id, 'code' => $code)); 
$query->execute(); 

if ($query->rowCount() > 0) { 
    return TRUE; 
} 
return FALSE; 
+0

हम्म, मैं जिस रैपर का उपयोग कर रहा हूं वह पंक्ति गणना() फ़ंक्शन के साथ मौजूद त्रुटि की वजह से rowCount() का एक अलग संस्करण उपयोग करता है। रैपर में numRows() बस एक SELECT COUNT (*) क्वेरी करता है, इसलिए यह रैपर के लिए काम नहीं करेगा। –

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

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