Mysql

如何連續執行多個程序?

  • February 13, 2022

這是我的程式碼:

$query = "CALL user_top_categories_score(?, 'ALL', 0, 1)";
$sth = $this->dbh->prepare($query);
$sth->execute([$user_id]);
$category = $sth->fetchAll(PDO::FETCH_ASSOC);

$query = "CALL user_top_tags_score(?, 'ALL', 0, 3)";
$sth = $this->dbh->prepare($query);
$sth->execute([$user_id]);
$tags = $sth->fetchAll(PDO::FETCH_ASSOC);

它拋出這個錯誤:

致命錯誤:未擷取的 PDOException:SQLSTATE

$$ HY000 $$:一般錯誤:2014 在其他無緩衝查詢處於活動狀態時無法執行查詢。考慮使用 PDOStatement::fetchAll()。或者,如果您的程式碼只針對 mysql 執行,您可以通過設置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 屬性來啟用查詢緩衝。在 C:\xampp\htdocs\myweb\others\user.php:71 堆棧跟踪:#0 C:\xampp\htdocs\myweb\others\user.php(71): PDO->prepare(‘CALL user_top_t.. .’) #1 C:\xampp\htdocs\myweb\application\other.php(24): user->index() #2 C:\xampp\htdocs\myweb\index.php(152): require_once(’ C:\xampp\htdocs…’) #3 {main} 在第 71 行的 C:\xampp\htdocs\myweb\others\user.php 中拋出

我也使用過closeCursor()fetchAll()基於這個解決方案。但遺憾的是它引發了一個新錯誤:

警告:數據包亂序。預計收到 1 個 9. 第 72 行 C:\xampp\htdocs\myweb\others\user.php 中的數據包大小=7

警告:PDO::prepare(): MySQL server has gone away in C:\xampp\htdocs\myweb\others\user.php on line 72

致命錯誤:未擷取的 PDOException:SQLSTATE

$$ HY000 $$:一般錯誤:2006 MySQL 伺服器已在 C:\xampp\htdocs\myweb\others\user.php:72 中消失 堆棧跟踪:#0 C:\xampp\htdocs\myweb\others\user.php(72): PDO->prepare(‘CALL user_top_t…’) #1 C:\xampp\htdocs\myweb\application\other.php(24): user->index() #2 C:\xampp\htdocs\myweb\ index.php(152): require_once(‘C:\xampp\htdocs…’) #3 {main} 在第 72 行的 C:\xampp\htdocs\myweb\others\user.php 中拋出

知道如何解決這個問題嗎?


**注意1:**上面的每個查詢都單獨工作。我的意思是,當我呼叫一個程序時,它也可以工作。

**注意2:**每個過程都返回一個結果集。我的意思是這些過程中有一條SELECT語句,它可能返回多行。

完成 execute 和 fetch* 呼叫後,您需要 $sth->close() 。

這裡快速而骯髒的答案是執行以下操作

  • 準備每個查詢一次
  • 在單獨的語句句柄中準備每個查詢
  • 呼叫您的執行並將結果集保存在單獨的數組中

像這樣

$query = "CALL user_top_categories_score(?, 'ALL', 0, 1)";
$topcat_sth = $this->dbh->prepare($query);

$query = "CALL user_top_tags_score(?, 'ALL', 0, 3)";
$toptag_sth = $this->dbh->prepare($query);

$topcat_sth->execute([$user_id]);
$topcat_rs = $topcat_sth->fetchAll(PDO::FETCH_ASSOC);

$toptag_sth->execute([$user_id]);
$toptag_rs = $toptag_sth->fetchAll(PDO::FETCH_ASSOC);

...

引用自:https://dba.stackexchange.com/questions/183929