2012-09-25 8 views
6

PHP5.4 및 MySql과 함께 PDO를 사용하는 동안 예외가 발생했습니다.PHP5 MySql 및 PDO 예외

거의 모든 다른 게시물, 블로그, 매뉴얼, 스 니펫,이 오류와 관련된 모든 것을 읽었으며 내가 행운으로 보았던 모든 것을 시도했습니다.

그래서 나는 내 특정 코드에서 잘못한 부분에 대해 구체적으로 알려주고 나에게 지적 할 수 있기를 바랍니다.

첫 부분 :

 $stmt = $this->dbConn->prepare("CALL getPopularProducts()"); 
     $stmt->execute(); 
     $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); 

     //$stmt->closeCursor(); 

     foreach ($rows as $row) { 
      $p = new entity\LightingPole(); 
      /* doing basic set stuff here so code omitted */ 

      // apply category to product 
      $categroyTranslator = new ProductCategoryTranslator(); 
      $categroyTranslator->applyProductCategory($p); 

둘째 부분 :

여기

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

이 오류로 이어질 코드의 부분이다 : 여기

오류이며

namespace lib\database; 

class Database 
{ 
    protected static $instance; 

    public static function getInstance() 
    { 
     if(self::$instance == null) 
     { 
      $dsn = "mydsn"; 
      $user = "myuser"; 
      $password = "mypassword"; 
      self::$instance->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false); 
      self::$instance->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); 
      self::$instance->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); 
     } 
     return self::$instance; 
    } 

    private function __construct() {} 

    private function __clone() {} 
} 

당신은 내가 주석 한 $stmt->closeCursor()에 대한 호출을 알 수 있습니다 :

여기 내 데이터베이스 클래스입니다. 나는이 코드 줄을 포함 할 때 나는 다음과 같은 오류 얻을 :

이제

SQLSTATE[HY000]: General error: 2006 MySQL server has gone away

는, 일반 기능의 관점에서 설명하기를 제가 기본적으로 그들을 통해 반복, 인기 제품 목록을 점점 점점 여기서 뭘하고있는 모든 ProductCategory와 같은 관련 제품 데이터 ...

이 오류는 루프의 첫 번째 제품에서만 발생합니다. 즉, 두 번째로 applyProductCategory()이라고 부르면 문제가 없습니다. 다른 한가지는 applyProductCategory 아래에 연결된 데이터의 다른 유형을 검색하기위한 호출이 약 4 개 더 있으며 그 중 하나를 수행하는 동안 오류가 발생하지 않는다는 것입니다.

그래서 첫 번째 제품에는 절대로 관련된 ProductCategory가 없다는 점을 제외하고는 내 모든 인기 제품이 괜찮습니다.

나는 이것을 일으키는 길을 놓친 것을 발견하는 것을 고대하고 있습니다. 바라건대 당신은 올바른 방향으로 나를 가리킬 수 있습니다.

+0

왜 'PDO'를 탈출하고 있습니까? – Erik

+1

@Erik, 나는 PHP 네임 스페이스를 사용하고 있습니다. 나는 PDO를 벗어나고 있지 않습니다. PHP가 내 수업에서 PDO를 찾지 않도록 슬래시가 필요합니다. – samazi

+0

쿨! 당신은 매일 새로운 것을 배웁니다. – Erik

답변

2

는 전에 같은 오류로 실행 오류

unset($stmt); 
    $stmt = $this->dbConn->prepare("CALL getCategoryByProductId(?)"); 

을 던지고 그 어떤 이유로 그것을 고정 위치를 직전에 해제 ($ stmt에)를 사용하여 시도. 이전에 여기에서 답을 찾았습니다. PDO Unbuffered queries

+0

대단히 고마워요. 이것은 매력처럼 작동했습니다. – samazi

+0

$ stmt가 새로운 위치에 있기 때문에 오류가 별도의 클래스에 던져지기 때문에 unset ($ stmt)을 $ rows = fetchAll() 바로 뒤에 놓습니다. – samazi

+0

Gotcha. 그건 의미가 있습니다. 다행 했어. – FajitaNachos