2012-09-20 23 views
7

मैं mysqli तैयार कथन के बारे में शोध कर रहा था और मेरे पास इसके बारे में 2 प्रश्न हैं।mysqli तैयार कथन, परिणाम सेट को लूप कैसे करें

के रूप में मैं पढ़ रहा था, मैं यह पता लगाने की है कि एक तैयार बयान के निष्पादन के क्रम का अनुकरण तरह दिखता है:

$sql = 'SELECT image_id, filename, caption FROM images WHERE image_id = ?'; 

// connect to the database 
$conn = .... 

$stmt = $conn->stmt_init(); 

$stmt->prepare($sql); 

$stmt->bind_param('i', $id); 

$stmt->execute(); 

$stmt->bind_result($image_id, $filename, $caption); 

// optional: get total of records in the result set 
$stmt->store_result(); 
$numRows = $stmt->num_rows; 

// loop through the result set 
while ($stmt->fetch()) { 
    // code goes here... 
} 

or 

// fetch the result for one record 
$stmt->fetch() 

// free & close 
$stmt->free_result(); 
$stmt->close; 

$conn->close(); 

यहाँ मेरा पहला सवाल है:

के रूप में मैं पढ़ रहा था, यह भी निम्नलिखित का उल्लेख करता है:

यदि आप चर के परिणाम को बाध्य नहीं करते हैं, तो $ पंक्ति = $ stmt-> fetch() का उपयोग करें, और प्रत्येक चर को $ पंक्ति ['column_name'] के रूप में एक्सेस करें। तो,

क्या वे परिणाम सेट को लूप करने के लिए 2 विधियों में से किसी एक का उपयोग कर कोई पेशेवर/विपक्ष हैं? यदि कोई फर्क नहीं पड़ता है, तो पहले स्थान पर $ stmt-> bind_result का उपयोग करके परिणाम बाध्य क्यों करें? क्या बात है यदि मैं इसके बजाय $ row = $ stmt-> fetch() का उपयोग कर सकता हूं?

यहाँ मेरी अन्य सवाल है:

  • $ stmt-> free_result(); वास्तव में क्या मुक्त है? तैयार() या store_result() या अन्यथा?
  • $ stmt-> बंद करें; मैं वास्तव में क्या बंद कर रहा हूँ? stmt_init() या तैयार() या अन्यथा?

उम्मीद है कि अपने जवाब मुझे बेहतर तैयार बयान को समझने तो मैं सुरक्षित कुछ निर्माण कर सकते हैं कर देगा ...

धन्यवाद

उत्तर

4
  • $ stmt-> free_result() काफी क्या नाम करता है कहते हैं: यह परिणाम से जुड़े स्मृति को मुक्त करता है।

  • $ stmt-> बंद स्टेटमेंट सेट (वास्तव में कर्सर) बंद कर देता है, जिससे परिणाम सेट (फिर से) के माध्यम से लूप करना असंभव हो जाता है।

हालांकि manual कहता है: 'तुम हमेशा mysqli_free_result के साथ अपने परिणाम() मुक्त करना चाहिए, जब अपने परिणाम वस्तु की अब कोई आवश्यकता नहीं है', आम बात एक बयान पर free_result और करीब उपयोग करने के लिए नहीं है। बंद होने पर आप परिणाम सेट का उपयोग नहीं कर सकते हैं, या इसका पुन: उपयोग कर सकते हैं और जब php मर जाता है, तो स्मृति को वैसे भी मुक्त किया जाता है।

+0

यदि मैं एक और क्वेरी निष्पादित करना चाहता हूं तो क्या होगा? क्या मैं स्मृति मुक्त करता हूं और स्टेटमेंट हैंडल को खोलता हूं? या क्या मुझे पूरी तरह से स्टेटमेंट हैंडल को बंद करने और $ stmt = $ conn-> stmt_init() के साथ एक नया खोलने की आवश्यकता है; ? – Marco

+2

बस एक और प्रश्न निष्पादित करें और नजदीकी और नि: शुल्क के साथ कुछ भी न करें। कथन में नया परिणाम निर्दिष्ट करते समय, पुराने लोग बंद हो जाएंगे और स्वचालित रूप से मुक्त हो जाएंगे। – JvdBerg

+0

ठीक है इसलिए अधिक प्रश्नों के लिए मुझे मूल रूप से तैयार करने की आवश्यकता है, bind_param, execute, bind_result। प्रत्येक नई क्वेरी के लिए stmt_init की आवश्यकता नहीं है, बस एक बार, डेटाबेस कनेक्शन के समान, बस एक बार। सही? – Marco