2012-09-25 59 views
6

我在使用PHP5.4和MySql使用PDO時遇到異常。PHP5 MySql和PDO異常

我已閱讀幾乎所有其他帖子,博客,手冊,代碼段,我可以與此錯誤有關的所有內容,並嘗試了所有我沒有看到過的內容。

所以我希望它是特定於我在特定代碼中做錯的事情,您可以將它指出給我。

以下是錯誤:

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.

這裏是代碼,導致這種錯誤的部分:

第一部分:

 $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); 

第二部分:

 public function applyProductCategory(entity\Product $product) { 
      $productId = $product->getProductId(); 
      try { 
       /** exception thrown on this line **/ 
       $stmt = $this->dbConn->prepare("CALL getCategoryByProductId(?)"); 

       $stmt->bindParam(1, $productId, \PDO::PARAM_INT); 
       $stmt->execute(); 

       while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)){ 
        $category = new entity\ProductCategory(); 

        $product->setCategory($category); 
       } 
      } 
      catch (\PDOException $e) { 
       echo $e->getMessage(); 
       print($e->getTraceAsString()); 
      } 
     } 

這裏是我的數據庫類:

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

我們解釋它以純功能方面,有什麼我基本上這裏做的是越來越受歡迎的產品清單,通過他們循環和讓所有的相關的產品數據,如產品類別等...

所以這個錯誤,發生在第一個產品在循環中,即第二次我呼籲applyProductCategory()它工作正常,沒有問題。另一件事是,applyProductCategory下面大約有4個調用來檢索其他類型的關聯數據,並且在做這件事時從來沒有發生任何錯誤。

所以最後,我所有的熱門產品都很好,除非第一個產品從來沒有與其關聯的ProductCategory。

期待找到我錯過的方式來造成這種情況。希望你能指出我正確的方向。

+0

你爲什麼要逃避'PDO'? – Erik

+1

@Erik,我不是逃避PDO我使用PHP命名空間和斜槓是必需的,所以PHP不會在我的班級尋找PDO。 – samazi

+0

酷!你每天都會學到新的東西:) – Erik

回答

2

使用未設置($語句)之前的權利試圖在那裏它拋出錯誤

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

我碰到了同樣的錯誤之前和固定它的一些原因。我之前在這裏找到答案PDO Unbuffered queries

+0

非常感謝你的工作,就像一個魅力。 – samazi

+0

只需要注意,我將$ unset($ stmt)直接放在$ rows = fetchAll()之後,因爲錯誤是在一個單獨的類中拋出的,所以$ stmt在這個新的範圍內。 – samazi

+0

Gotcha。這就說得通了。很高興它的工作。 – FajitaNachos