2012-09-25 23 views
6

Ho avuto un'eccezione durante l'utilizzo di PDO con PHP5.4 e MySql.PHP5 Eccezione MySql e PDO

Ho letto quasi ogni altro post, blog, manuale, frammento, tutto ciò che posso riguardare a questo errore e ho provato tutto quello che ho visto senza fortuna.

Quindi spero che sia specifico per qualcosa che ho fatto di sbagliato nel mio particolare codice e puoi indicarmelo.

Ecco l'errore:

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.

Qui sono le parti di codice che portano a questo errore:

Prima parte:

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

Seconda parte:

 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()); 
      } 
     } 

Qui è la mia classe di database:

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() {} 
} 

Si può notare che ho una chiamata a $stmt->closeCursor() che ho commentato. Quando includo questa riga di codice ottengo il seguente errore:

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

Ora di spiegarlo in termini di funzionalità semplici, quello che sto praticamente facendo qui è sempre un elenco di prodotti popolari, loop attraverso di loro e ottenere tutte le dati di prodotto associati come ProductCategory ecc ...

Quindi questo errore si verifica solo per il primo prodotto nel ciclo, ovvero la seconda volta che chiamo applyProductCategory() funziona correttamente, nessun problema. L'altra cosa è che al di sotto di applyProductCategory ci sono altre 4 chiamate per recuperare altri tipi di dati associati e non ci sono mai stati errori durante il processo.

Quindi, alla fine, tutti i miei prodotti popolari vanno bene, tranne il primo prodotto che non ha mai associato un ProductCategory.

Non vedo l'ora di scoprire cosa ho perso lungo la strada per causare questo. Spero che tu possa indicarmi le giuste direzioni.

+0

perché stai sfuggendo a 'DOP'? – Erik

+1

@Erik, non sto sfuggendo a PDO Sto usando gli spazi dei nomi php e la barra è richiesta in modo che php non cerchi PDO nella mia classe. – samazi

+0

Fantastico! Impari qualcosa di nuovo ogni giorno :) – Erik

risposta

2

Cercando usando unset ($ stmt) a destra prima dove è gettando l'errore

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

Ho incontrato lo stesso errore prima e quello fissato per qualche ragione. Ho trovato la risposta qui in precedenza PDO Unbuffered queries

+0

Grazie mille ha funzionato come un fascino. – samazi

+0

Giusto per notare, ho inserito il unset ($ stmt) direttamente dopo $ rows = fetchAll() perché l'errore è stato generato in una classe separata, quindi $ stmt è in un nuovo ambito a quel punto. – samazi

+0

Gotcha. Ciò ha senso. Sono contento che ha funzionato. – FajitaNachos