繁体   English   中英

PHP5 MySql和PDO异常

[英]PHP5 MySql and PDO Exception

在将PDO与PHP5.4和MySql一起使用时,我遇到了异常。

我几乎阅读了所有其他帖子,博客,手册,代码段以及与此错误相关的所有内容,并且尝试了所有我所看到的一切,但是没有运气。

因此,我希望它特定于我在特定代码中做错的事情,您可以向我指出。

这是错误:

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]:常规错误:2006 MySQL服务器已消失

现在以简单的功能术语来解释它,我在这里基本上要做的是获取流行产品的列表,遍历它们并获取所有相关的产品数据,例如ProductCategory等。

因此,此错误仅在循环中的第一个产品上发生,即第二次我调用applyProductCategory()它工作正常,没有问题。 另一件事是,在applyProductCategory下面大约还有4个调用来检索其他类型的关联数据,并且在执行任何操作时都不会引发任何错误。

所以最后,我所有流行的产品都不错,除了第一个产品从未与之关联的ProductCategory。

期待找出导致我失败的原因。 希望你能指出正确的方向。

在抛出错误之前尝试使用unset($ stmt)

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

我之前遇到了相同的错误,由于某种原因修复了该错误。 我以前在这里找到了答案PDO无缓冲查询

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM