如何連續執行多個程序?
這是我的程式碼:
$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); ...