2009-07-29 12 views
8

जब भी मैं mysql में स्टोर प्रक्रिया को कॉल करने का प्रयास करता हूं जो परिणाम सेट भेजता है, तो यह मुझे कहता रहता है कि "दिए गए संदर्भ में परिणाम सेट वापस नहीं कर सकता"।दिए गए संदर्भ में परिणाम सेट वापस नहीं कर सकता

मैं इसे गूगल कर दिया है और कुछ ने कहा कि यह mysql बग, कुछ ने कहा कि आप अपने mysqli ड्राइवर बदल सकते हैं और चाहिए ....

स्थिति:

mysqli ड्राइवर क्लाइंट API लाइब्रेरी संस्करण 5.0.51a का उपयोग करना, पीएचपी संस्करण 5.2.4-2ubuntu5.6, Zend 1.9 आर सी 1 mysqli अनुकूलक का उपयोग करना।

मुझे क्या करना चाहिए !?

उत्तर

1

सुनिश्चित नहीं है कि यह आपकी समस्या का समाधान है, लेकिन PHP के हाल के संस्करण के साथ प्रयास करने के बारे में क्या?
पीएचपी 5.2.4 निश्चित रूप से काफी पुराना है - तो, ​​अगर यह PHP के mysqli चालक में एक बग है, यह बाद से ...

वास्तव में सही किया गया हो सकता है, एक त्वरित खोज के बाद, यह एक तरह एक समस्या लगती है आप साक्षी पीएचपी 5.2.3 और PHP 5.2.4 के बीच पेश किया जाता है किया गया है (और PHP 5.2.5 में यहां अभी भी था)।
bug #42548 : PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!)

क्या आप PHP 5.2.9 या 5.2.10 जैसे कुछ परीक्षण करने में सक्षम हैं?
मैं जानते हैं कि ये भी :-(आप :-(


स्रोतों से संकलित करने के लिए हो सकता है पिछले उबंटू स्थिर संस्करण में, उबंटू द्वारा प्रदान नहीं कर रहे हैं फिर भी एक और विचार mith PDO_MySql एडाप्टर की कोशिश करना होगा: हो सकता है संभव है कि एक साथ काम करेंगे?
यह/बहुत ज्यादा मुसीबत खड़ी बिना एडाप्टर बदलने के लिए परीक्षण करने के लिए घंटे लेने के बिना संभव हो सकता है?


आप Zend फ्रेमवर्क 1.9 के साथ काम कर रहे हैं के रूप में, यहाँ एक और पद है कि रुचि हो सकती है है आप, और परीक्षण करना आसान हो सकता है: stored procedure error after upgrade to 1.8

कोशिश करने का एक आसान समाधान ज़ेंड फ्रेमवर्क 1.7 पर वापस जाना होगा; क्या यह आपके लिए संभव होगा, बस परीक्षण करने के लिए?


वैसे भी ... शुभकामनाएं!
और, यदि आपको समाधान मिल गया है, तो यह इंगित करना न भूलें कि समस्या क्या थी, और आपने इसे कैसे हल किया ;-)

+0

आपकी सटीकता के लिए धन्यवाद, आपकी बहुत अच्छी सलाह। – Farid

+0

क्या यह समस्या 5.2.17 में वापस आ सकती है? मुझे एक ही त्रुटि मिल रही है लेकिन CentOS PHP बाद के संस्करण। – Clutch

+0

शायद कुछ अन्य समस्याएं जैसे कि मुझे xammp और windows – Sydwell

5

उत्तर आपके PHP को अपग्रेड करना है, मैंने अभी तक 5.3 को अपग्रेड कर दिया है। 0, और यह काम कैंडी पसंद है!

+1

का उपयोग करके संस्करण 5.3.1 पर समान समस्या मिली है, आप जिस समाधान को चुनते हैं उसे देने के लिए धन्यवाद :-) (बस सावधान रहें: PHP 5.3 का उपयोग करके आपके कोड में कहीं और अन्य परेशानी हो सकती है, क्योंकि यह बहुत सारी नई चीज़ें लाएं ^^) –

1

मैं एक अनुबंध पर हाल ही में इस समस्या थी। ग्राहक windoze और php 5.2.6 पर एक codebase का उपयोग कर रहा था और मेरे स्थापना linux और php 5.3.1 जो कुछ भी हमने किया, वे नहीं तो अंत में वे मुझे एक windoze विस्टा मशीन दे दी है में सहयोग होता था और हम php 5.2 स्थापित 6 और हम चले गए। कहानी का नैतिक: संस्करण मिलान संख्या। अजीब ग्राहकों मैं किसी अन्य काम में इस किया था कभी पहले कभी नहीं। लेकिन हे, आप सबकुछ नहीं जान सकते हैं। बहुत निश्चित रूप से नहीं ने MySQL मुद्दा, बस पीएचपी।

+0

PHP 5.3.6 पर सर्वर को विकसित करने की कोशिश करते समय PHP 5.2.6 पर यह समस्या प्राप्त करने के लिए मुझे flummoxed था। तो मुझे अपग्रेड करना होगा। ध्यान दें कि [पिछड़े असंगतता मुद्दे] हैं (http://www.php.net/manual/en/migration53.incompatible.php)। – Gruber

+0

@ ग्रबर,? हमेशा पिछड़े असंगत मुद्दे हैं। उन संस्करणों के बारे में इतना खास क्या है? – Pacerier

1

यह PHP 5.2.10 के साथ भी पूरी तरह से काम करता है।

पहले के संस्करण से, मैंने सफलतापूर्वक एक समस्याग्रस्त प्रक्रिया को कॉल करने और सही परिणाम प्राप्त करने के लिए mysqli :: multi_query का सफलतापूर्वक उपयोग किया है।

0

मुझे पता है कि यह प्रश्न प्राचीन है, लेकिन अभी भी 5.2.4 के साथ काम करने और यह त्रुटि प्राप्त करने के लिए, आप इस समस्या के आसपास काम करने के लिए एक नया mysql पीडीओ ऑब्जेक्ट बनाने पर विचार कर सकते हैं।

मैं अभी भी अपने dev सर्वर पर 5.2.4 का उपयोग करता हूं ताकि वर्डप्रेस प्लगइन्स के विकास के लिए पिछड़ा संगतता सुनिश्चित हो सके।

नीचे प्रक्रियात्मक कॉल के चारों ओर एक रैपर है जिसका उपयोग मैं 5.2.4 (मेरे देव सर्वर पर चलाने) में प्रक्रियाओं को सफलतापूर्वक कॉल करने के लिए करता हूं, जो आम तौर पर मुझे त्रुटि देता है, और मेरा उत्पादन सर्वर (जो एक नया संस्करण चलाता है त्रुटि नहीं देता है)।

इसका वर्डप्रेस विशिष्ट है, लेकिन सीधे PHP का उपयोग करके इसे संशोधित करना मुश्किल नहीं होगा।

/* 
* Need to cache connection so we don't keep creating connections till we hit max. 
*/ 

private $_dbhCache=null; 

/** 
    * mySQL Call Proc 
    * 
    * Provides a wrapper around calling a mySQL stored procedure to ensure against a 5.2.4 bug that 
    * causes procedure calls to fail. 
    * Error:'can't return a result set in the given context' 
    * 
    * references: 
    * http://stackoverflow.com/questions/1200193/cant-return-a-result-set-in-the-given-context 
    * http://php.net/pdo_mysql#69592 //i got empty result set but pointed me in the right direction 
    * http://php.net/pdo_mysql#80306 //this worked, but returned 0-indexed and assoc, i edited it so it only returns assoc mimicking $wpdb->get_results(
    * http://www.php.net/manual/en/pdo.connections.php 
    * http://www.php.net/manual/en/pdostatement.fetch.php explains about FETCH_ASSOC 
    * 
    * @param string $proc The mySQL stored procedure string, including paramaters, but without the call statement. e.g.: "my_procedure_name('my_paramater')"; 
    * @return string The results of the procedure call 
    */ 
    public function mySQLCallProc($proc) { 
     global $wpdb; 
     $query = "call $proc"; 

     try { 

      /* 
      * Attempt to call the procedure normally. 
      * 
      */ 

      $query_result = $wpdb->get_results($query, ARRAY_A); 

      /* 
      * Check for a database error 
      * and throw an exception if one is found. 
      * We can then attempt it again using a workaround. 
      */ 

      if ($wpdb->last_error !== '') { 



       throw new Exception('Database Error While Calling Procedure'); 
} 

     } catch (Exception $e) { 

      try { 

       /* 
       * Create a PDO Object for the connection 
       */ 
    if (is_null($this->_dbhCache)) { 
        $dbh = new PDO('mysql:host=' . DB_HOST . ';port=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASSWORD, array(PDO::ATTR_PERSISTENT => true)); 
$this->_dbhCache=$dbh ;    
}else{ 
    $dbh = $this->_dbhCache; 
} 
       /* 
       * Prepare and call the procedure. 
       */ 
       $stmt = $dbh->prepare("call $proc"); 

       $stmt->execute(); 

       /* 
       * fetch all rows into an associative array. 
       */ 

       $query_result = $stmt->fetchAll(PDO::FETCH_ASSOC); //FETCH_ASSOC gets results as an assoc array. without it, you'll receive both assoc and 0-indexed array 





    } catch (PDOException $e) { 

        print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 

    } 


    } 

     return ($query_result); 


    }