2013-02-16 10 views
12

मैं अपने PHP कोड को mysql से mysqli में अपडेट कर रहा हूं लेकिन मुझे इस प्रश्न का उत्तर नहीं मिल रहा है: क्या mysqli अद्यतन क्वेरी परिणाम लौटाती हैं?क्या mysqli अद्यतन क्वेरी परिणाम लौटाना चाहिए?

mysql के साथ, मैं क्या कर सकता है

$result = mysql_query("UPDATE `data` SET `field1` = 1 WHERE `key` = '$mykey'); 

और $ परिणाम सच हो जाएगा, भले ही क्वेरी किसी भी पंक्तियों को वापस नहीं करता है।

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
$result = $stmt->get_result(); 

और $ परिणाम गलत है:

अब, हालांकि, mysqli कोड में, मैं कुछ इस तरह (स्पष्टता के लिए त्रुटि हैंडलिंग हटा दिया है)।

रिकॉर्ड के लिए, क्वेरी मान्य है (किसी भी टाइपो को अनदेखा कर दें जिसे मैंने इसे स्टैक ओवरफ्लो में ट्रांसक्रिप्ट कर दिया हो) और फ़ील्ड 1 को अपेक्षित रूप से डेटाबेस में अपडेट किया गया है। इसके अलावा, get_result() चुनिंदा प्रश्नों के लिए ठीक काम करता है, इसलिए यह get_result() उपलब्ध नहीं है।

असल में, मैं सिर्फ यह जानना चाहता हूं कि यह बदला व्यवहार अपेक्षित है या मुझे कहीं कुछ बग खोजने की कोशिश करनी चाहिए।

+0

ठीक है ... एक टिप्पणी प्रतीत होती है कि मुझे प्रलेखन की जांच करने के लिए कहा गया है, जो वास्तव में बताता है कि get_result "परिणामस्वरूप परिणाम देता है या विफलता पर गलत होता है।" मैं पहले से ही अपने प्रश्न पूछने से पहले पढ़ता हूं, और मुझे लगता है कि दस्तावेज सटीक होने पर मैं उत्सुक हूं। $ Stmt-> get_result() झूठी लौटने के बाद, मैंने $ stmt-> errno (जो 0 था) और $ stmt-> त्रुटि (जो खाली थी) की जांच की और क्वेरी सफलतापूर्वक निष्पादित करने लगती थी (क्योंकि डेटाबेस अपडेट किया गया था)। तो यह त्रुटि कहां हो रही है? – Swiftheart

उत्तर

11

तैयार बयान

$stmt->execute(); 

और execute() रिटर्न सफलता पर सही या विफलता पर गलत के साथ निष्पादित किया जाता है।

क्योंकि UPDATE, DELETE, INSERT कोई परिणाम नहीं मिला है, get_result() का उपयोग करने की कोई आवश्यकता नहीं है। यदि आपको प्रभावित पंक्तियों की कुल संख्या जानने की आवश्यकता है, तो आप mysqli_stmt_affected_rows() फ़ंक्शन का उपयोग कर ऐसा कर सकते हैं।

इसलिए अपने कोड इस

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
//You can get the number of rows affected by your query 
$nrows = $stmt->affected_rows; 
if (!$nrows) { 
    //Nothing has been updated 
} 
+0

हां ... मेरे पास मेरे नमूना कोड में लाइन $ stmt-> execute() है, और मेरे वास्तविक कोड में, मैं वापसी मान की जांच करता हूं। यह सच हो जाता है, तो यह ठीक है। मैं सिर्फ उत्सुक हूं कि _ $ stmt-> get_result() _ को सच होना चाहिए या नहीं। – Swiftheart

+0

अद्यतन उत्तर देखें। यदि आप 'UPDATE',' DELETE', 'INSERT' क्वेरी निष्पादित करते हैं तो आपको' get_result() 'का उपयोग करने की आवश्यकता नहीं है क्योंकि वे कोई परिणाम नहीं देते हैं। – peterm

+0

ग्रेट, धन्यवाद। मुझे बहुत संदेह था, लेकिन मैं कुछ बाहरी पुष्टि चाहता था। – Swiftheart

3

गैर चयन प्रश्नों कैसा लग सकता है एक "परिणाम सेट" की जरूरत नहीं है, इसलिए get_result उनके लिए अर्थहीन है। यदि आप जानना चाहते हैं कि एक संशोधन क्वेरी (UPDATE, INSERT, या DELETE), $stmt->affected_rows का उपयोग करें। क्वेरी ने कुछ भी किया है या नहीं, यह 0 या गैर-शून्य होगा।

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