문제

결과 세트를 다시 보내는 MySQL에서 매장 절차를 호출하려고 할 때 "주어진 컨텍스트에서 결과 세트를 반환 할 수 없다"고 계속 말합니다.

나는 그것을 구글이고 일부는 그것이 MySQL 버그라고 말했고, 일부는 MySQLI 드라이버를 변경해야한다고 말했다.

상황 :

MySQLI 드라이버 클라이언트 API 라이브러리 버전 5.0.51A, PHP 버전 5.2.4-2ubuntu5.6, Zend 1.9 RC 1 MySQLI 어댑터를 사용합니다.

어떻게해야하나요!?

도움이 되었습니까?

해결책

이것이 당신의 문제에 대한 해결책인지 확실하지 않지만 최신 버전의 PHP를 시도하는 것은 어떻습니까?
PHP 5.2.4는 확실히 꽤 오래되었습니다. 따라서 PHP의 MySQLI 드라이버의 버그라면 그 이후로 수정되었을 수 있습니다.

실제로, 빠른 검색 후에, 당신이 목격 한 것이 PHP 5.2.3과 PHP 5.2.4 사이에 소개 된 것과 같은 문제로 보입니다 (여전히 PHP 5.2.5에 있습니다).
보다 버그 #42548 : 프로 시저 XXX는 주어진 컨텍스트에서 결과 세트를 반환 할 수 없습니다 (5.2.3에서 작동합니다 !!)

PHP 5.2.9 또는 5.2.10과 같은 방법으로 테스트 할 수 있습니까?
나는 이것들이 Ubuntu에 의해 제공되지 않는다는 것을 알고 있습니다. 마지막 Ubuntu 안정 버전에서도 :-( 당신은 소스에서 컴파일해야 할 수도 있습니다 :-(


또 다른 아이디어는 mith pdo_mysql 어댑터를 시도하는 것입니다.
테스트하는 데 몇 시간이 걸리지 않고 너무 많은 문제를 일으키지 않고 어댑터를 변경할 수 있습니까?


Zend Framework 1.9와 협력 할 때 여기에 관심이 있고 테스트하기가 더 쉬울 수있는 또 다른 게시물이 있습니다. 업그레이드 후 1.8로 저장된 프로 시저 오류

이를 시도하는 쉬운 해결책은 Zend Framework 1.7로 돌아가는 것입니다. 단지 테스트 할 수 있습니까?


어쨌든 ... 행운을 빕니다!
그리고 해결책을 찾으면 문제가 무엇인지, 어떻게 해결했는지를 나타내는 것을 잊지 마십시오 ;-)

다른 팁

답은 PHP를 업그레이드하는 것입니다. 방금 광산을 5.3.0으로 업그레이드했으며 Candy와 같은 작품입니다!

나는 최근 계약 에서이 문제를 겪었습니다. 클라이언트는 Windoze 및 PHP 5.2.6에서 코드베이스를 사용하고 있었고 내 설치는 Linux 및 PHP 5.3.1 우리가 한 모든 일이 무엇이든, 결국에는 Windoze Vista 기계를 주었고 PHP 5.2를 설치했습니다. .6 우리는 갔다. 이야기의 도덕 : 버전 매칭 카운트. 이상한 cus 나는 다른 직업에서 전에는 한 번도 본 적이 없습니다. 하지만 이봐, 당신은 모든 것을 알 수 없습니다. 분명히 MySQL 문제가 아니라 PHP.

PHP 5.2.10에서도 완벽하게 작동합니다.

이전 버전에서 MySQLI :: Multi_Query를 성공적으로 사용하여 문제가있는 절차를 호출하고 올바른 결과를 얻었습니다.

나는이 질문이 고대라는 것을 알고 있지만 여전히 5.2.4로 작업 하고이 오류를 얻는 사람들에게는이 문제를 해결하기 위해 새로운 MySQL PDO 객체를 만드는 것을 고려할 수 있습니다.

Dev 서버에서 5.2.4를 사용하여 개발 한 WordPress 플러그인의 역 호환성을 보장합니다.

아래는 5.2.4 (Dev 서버에서 실행)에서 절차를 성공적으로 호출하는 데 사용하는 절차 적 호출을 중심으로 래퍼이며 일반적으로 오류가 제공되는 제작 서버 (제공하지 않는 최신 버전을 실행합니다. 오류) .

WordPress는 특정하지만 직선 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);


    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top