我在使用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。
期待找到我錯過的方式來造成這種情況。希望你能指出我正確的方向。
你爲什麼要逃避'PDO'? – Erik
@Erik,我不是逃避PDO我使用PHP命名空間和斜槓是必需的,所以PHP不會在我的班級尋找PDO。 – samazi
酷!你每天都會學到新的東西:) – Erik