[英]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.