2009-07-29 20 views
8

Khi nào tôi cố gắng gọi thủ tục lưu trữ trong mysql gửi lại tập kết quả, nó vẫn nói rằng "không thể trả về tập kết quả trong ngữ cảnh đã cho".Không thể trả về tập kết quả trong bối cảnh đã cho

Tôi đã google nó và một số nói đó là lỗi mysql, một số cho biết bạn nên thay đổi tài xế mysqli của bạn và ....

trạng:

Sử dụng mysqli lái xe khách hàng phiên bản thư viện API 5.0.51a, Phiên bản PHP 5.2.4-2ubuntu5.6, Sử dụng Zend 1.9 RC 1 bộ điều hợp Mysqli.

Tôi nên làm gì đây !?

Trả lời

1

Không chắc chắn đây là giải pháp cho vấn đề của bạn, nhưng còn thử với phiên bản PHP mới hơn thì sao?
PHP 5.2.4 chắc chắn là khá cũ - vì vậy, nếu đó là một lỗi trong trình điều khiển mysqli của PHP, nó có thể đã được sửa chữa từ ...

Thực ra, sau khi tìm kiếm nhanh, có vẻ như vấn đề giống như bạn đang chứng kiến ​​đã được giới thiệu giữa PHP 5.2.3 và PHP 5.2.4 (và vẫn còn ở đây trong PHP 5.2.5).
Xem bug #42548 : PROCEDURE xxx can't return a result set in the given context (works in 5.2.3!!)

Bạn có thể thử nghiệm bằng thứ gì đó như PHP 5.2.9 hoặc 5.2.10 không?
tôi biết những điều này không được cung cấp bởi Ubuntu, ngay cả trong phiên bản ổn định cuối cùng Ubuntu :-(Bạn có thể phải biên dịch từ các nguồn :-(


Tuy nhiên, ý tưởng khác là để thử mith PDO_MySql bộ chuyển đổi: maybe nó sẽ làm việc với một trong những?
nó có thể thay đổi Adaptor mà không gây ra quá nhiều rắc rối/mà không cần dùng giờ để kiểm tra?


Khi bạn đang làm việc với Zend Framework 1.9, đây là một bài mà có thể quan tâm bạn và có thể dễ dàng kiểm tra hơn: stored procedure error after upgrade to 1.8

Một giải pháp dễ dàng để thử điều đó là quay lại Zend Framework 1.7; nó sẽ có thể cho bạn, chỉ để kiểm tra?


Dù sao ... Chúc may mắn!
Và, nếu bạn tìm thấy giải pháp, đừng quên chỉ ra vấn đề là gì và cách bạn giải quyết vấn đề ;-)

+0

Lời khuyên rất tốt từ bạn, cảm ơn sự chính xác của bạn. – Farid

+0

Sự cố này có thể trở lại trong 5.2.17 không? Tôi nhận được cùng một lỗi nhưng CentOS PHP phiên bản sau này. – Clutch

+0

Có lẽ một số vấn đề khác khi tôi tìm thấy vấn đề tương tự trên phiên bản 5.3.1 bằng cách sử dụng xammp và windows – Sydwell

5

Câu trả lời là nâng cấp php của bạn, tôi vừa mới nâng cấp lên 5.3. 0, và nó hoạt động như kẹo!

+1

Cảm ơn bạn đã đưa ra giải pháp mà bạn chọn :-) (Chỉ cần cẩn thận: sử dụng PHP 5.3 có thể dẫn đến các vấn đề khác trong mã của bạn) mang lại nhiều thứ mới ^^) –

1

Gần đây, tôi gặp sự cố này về hợp đồng. Các khách hàng đã sử dụng một codebase trên windoze và php 5.2.6 và cài đặt của tôi là linux và php 5.3.1 Bất cứ điều gì chúng tôi đã làm, họ sẽ không hợp tác vì vậy cuối cùng họ đã cho tôi một máy vista windoze và chúng tôi cài đặt php 5.2 .6 và chúng tôi đã đi. Đạo đức của câu chuyện: số lượng phù hợp với phiên bản. Weird cus Tôi chưa bao giờ có điều này bao giờ hết trong bất kỳ công việc khác. Nhưng hey, bạn không thể biết tất cả mọi thứ. Rất chắc chắn không phải là một vấn đề MySql, chỉ là PHP.

+0

Tôi đã lúng túng để có được vấn đề này trên PHP 5.2.6 khi cố gắng triển khai một hệ thống được phát triển trên một máy chủ phát triển PHP 5.3. Vì vậy, tôi sẽ phải nâng cấp. Lưu ý rằng có [vấn đề không tương thích ngược] (http://www.php.net/manual/en/migration53.incompatible.php). – Gruber

+0

@Gruber,? Luôn có những vấn đề không tương thích. Có gì đặc biệt về những phiên bản đó? – Pacerier

1

Nó hoạt động hoàn hảo với PHP 5.2.10.

Từ phiên bản cũ hơn, tôi đã sử dụng thành công mysqli :: multi_query để gọi thủ tục có vấn đề và nhận được kết quả phù hợp.

0

Tôi biết câu hỏi này là cổ, nhưng đối với những người vẫn làm việc với 5.2.4 và nhận được lỗi này, bạn có thể xem xét việc tạo một đối tượng PDS mysql mới để giải quyết vấn đề này.

Tôi vẫn sử dụng 5.2.4 trên máy chủ dev của mình để đảm bảo khả năng tương thích ngược cho các plugin WordPress mà tôi phát triển. Dưới đây là một trình bao bọc xung quanh các cuộc gọi thủ tục mà tôi sử dụng để gọi thành công các thủ tục trong cả 5.2.4 (chạy trên máy chủ dev của tôi), thường sẽ cho tôi lỗi và máy chủ sản xuất của tôi (chạy phiên bản mới hơn) không đưa ra lỗi).

WordPress cụ thể của nó, nhưng sẽ không khó để sửa đổi nó bằng cách sử dụng php thẳng.

/* 
* 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); 


    } 
Các vấn đề liên quan