2009-12-29 18 views
8

के साथ mysqli_fetch_object का उपयोग करना संभव है mysqli_fetch_object mysql_query() का उपयोग करके देखे गए सभी उदाहरण, मैं इसे तैयार बयान के साथ काम नहीं कर सकता। क्या किसी को पता है कि इस कोड स्निपेट में क्या गलत है, क्योंकि fetch_object शून्य लौटाता है।क्या एक तैयार कथन

$sql = "select 1 from dual"; 
printf("preparing %s\n", $sql); 
$stmt = $link->prepare($sql); 
printf("prepare statement %s\n", is_null($stmt) ? "is null" : "created"); 
$rc = $stmt->execute(); 
printf("num rows is %d\n", $stmt->num_rows); 
$result = $stmt->result_metadata(); 
printf("result_metadata %s\n", is_null($result) ? "is null" : "exists"); 
$rc = $result->fetch_object(); 
printf("fetch object returns %s\n", is_null($rc) ? "NULL" : $rc); 
$stmt->close(); 

उत्पादन होता है:

preparing select 1 from dual 
prepare statement created 
num rows is 0 
result_metadata exists 
fetch object returns NULL 
+0

निश्चित रूप से पंक्तियों की संख्या> 0 होना चाहिए? – jcuenod

उत्तर

0

मैं नहीं मानता इंटरफ़ेस की तरह काम करता है।

दस्तावेज़ीकरण और उदाहरण (http://www.php.net/manual/en/mysqli.prepare.php) पर जाकर ऐसा लगता है कि $ stmt-> निष्पादन() परिणाम परिणाम नहीं देता है, लेकिन एक बुलियन सफलता/विफलता (http://www.php.net/manual/en/mysqli-stmt.execute.php) दर्शाता है। वास्तव में परिणाम प्राप्त करने के लिए, आपको $ stmt-> bind_result (http://www.php.net/manual/en/mysqli-stmt.bind-result.php) का उपयोग करके परिणामसेट (निष्पादित कॉल से पहले) में चर को बाध्य करने की आवश्यकता है।

यह सब करने के बाद, आप वर्तमान पंक्ति से कॉलम मानों के साथ बाध्य चर भरने के लिए $ stmt-> fetch()() को बार-बार कॉल कर सकते हैं। मुझे $ stmt-> fetch_object() का कोई उल्लेख नहीं दिखता है और न ही मैं देखता हूं कि यह इंटरफ़ेस वर्णित एक चर बाध्यकारी योजना के साथ कैसे काम कर सकता है।

तो यह "सामान्य" परिणाम mysqli तैयार आंकड़ों से प्राप्त करने की कहानी है।

आपके कोड में, ऐसा कुछ है जो मुझे संदेह है कि एक त्रुटि है, या कम से कम मुझे यकीन नहीं है कि आप ऐसा करना चाहते हैं। आप लाइन:

$result = $stmt->result_metadata(); 

, resultset मेटाडाटा है, जो खुद एक resultset के रूप में प्रस्तुत किया जाता है assignes $ परिणाम चर करने के लिए। दस्तावेज़ के अनुसार (http://www.php.net/manual/en/mysqli-stmt.result-metadata.php) आप केवल इन 'विशेष' प्रकार के परिणामों पर विधियों का सबसेट उपयोग कर सकते हैं, और fetch_object() उनमें से एक नहीं है (कम से कम यह स्पष्ट रूप से सूचीबद्ध नहीं है)।

शायद यह एक बग है कि fetch_object() इन मेटाडेटा परिणामों के लिए लागू नहीं किया गया है, शायद आपको इसके बारे में bugs.mysql.com पर एक बग दर्ज करना चाहिए।

+0

मैं fetch_object का उपयोग करना चाहता हूं इसलिए मुझे कक्षा को परिभाषित करने और सदस्य चर को स्पष्ट रूप से बाध्य करने की आवश्यकता नहीं है। मैं तैयार बयान के लिए अपना खुद का fetch_object बनाने की कोशिश करूंगा। – BeWarned

11

यह वह कोड है जिसका उपयोग मैं तैयार कथन से ऑब्जेक्ट बनाने के लिए करता हूं।
शायद यह माइस्क्ली के उप-वर्ग में उपयोग किया जा सकता है?

$query = "SELECT * FROM category WHERE id = ?"; 
    $stmt = $this->_db->prepare($query); 

    $value = 1; 
    $stmt->bind_param("i", $value); 

    $stmt->execute(); 

    // bind results to named array 
    $meta = $stmt->result_metadata(); 
    $fields = $meta->fetch_fields(); 
    foreach($fields as $field) { 
     $result[$field->name] = ""; 
     $resultArray[$field->name] = &$result[$field->name]; 
    } 

    call_user_func_array(array($stmt, 'bind_result'), $resultArray); 

    // create object of results and array of objects 
    while($stmt->fetch()) { 
     $resultObject = new stdClass(); 

     foreach ($resultArray as $key => $value) { 
      $resultObject->$key = $value; 
     } 

     $rows[] = $resultObject; 
    } 

    $stmt->close(); 
+0

धन्यवाद, मैं आपके कोड – BeWarned

7

MySql मूल निवासी चालक विस्तार (mysqlnd), get_result विधि है: यदि आप एक गैर अशक्त वस्तु उम्मीद कर रहे हैं वापस करने

$stmt->execute(); 
$obj = $stmt->get_result()->fetch_object(); 
+1

की तरह कुछ कर रहा हूं यह एक अच्छा समाधान है; आपको ओओ स्टाइल को '$ obj-> db_field_name;' आदि के साथ पुनर्प्राप्त करने देता है, ठीक वही, जो मैं खोज रहा था, धन्यवाद। – Timmy

+2

चेतावनी: यह केवल तभी काम करता है जब आप 'mysqlnd' ड्राइवर – Populus

+0

@Populus धन्यवाद का उपयोग कर रहे हैं, उत्तर निकाय में जोड़ा गया है। – T30

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