6

PHP5.4とMySqlでPDOを使用しているときに、例外が発生しました。

私は他のほとんどすべての投稿、ブログ、マニュアル、スニペット、このエラーに関連する可能性のあるすべてを読み、運が悪かったので見たすべてを試しました。

ですから、それが私の特定のコードで間違ったことをしたことに固有のものであり、あなたがそれを私に指摘できることを願っています。

エラーは次のとおりです。

SQLSTATE [HY000]:一般エラー:2014他のバッファリングされていないクエリがアクティブな間はクエリを実行できません。PDOStatement :: fetchAll()の使用を検討してください。または、コードがmysqlに対してのみ実行される場合は、PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性を設定してクエリバッファリングを有効にすることができます。

このエラーの原因となるコードの部分は次のとおりです。

最初の部分:

        $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]:一般的なエラー:2006MySQLサーバーがなくなりました

ここで簡単に機能的に説明すると、ここで基本的に行っているのは、人気のある製品のリストを取得し、それらをループして、ProductCategoryなどの関連するすべての製品データを取得することです...

したがって、このエラーは、ループ内の最初の製品でのみ発生します。つまり、2回目に呼び出すapplyProductCategory()と、問題なく動作します。もう1つは、applyProductCategory他のタイプの関連データを取得するための呼び出しがさらに約4つあり、それを実行しているときにエラーがスローされることはないということです。

つまり、最初の製品にProductCategoryが関連付けられていないことを除いて、私の人気のある製品はすべて問題ありません。

これを引き起こす過程で私が見逃したものを見つけることを楽しみにしています。うまくいけば、あなたは私を正しい方向に向けることができます。

4

1 に答える 1

2

エラーがスローされる直前にunset($ stmt)を使用しようとしています

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

以前に同じエラーが発生しましたが、何らかの理由で修正されました。私は以前にここで答えを見つけましたPDOバッファリングされていないクエリ

于 2012-09-25T00:36:39.760 に答える