iT邦幫忙

0

(已完成)php升級後PDO出現錯誤2014 Cannot execute queries while other unbuffered queries are active

舜~ 2020-12-04 14:59:252562 瀏覽
  • 分享至 

  • xImage

我升級php到7.4.13後
原本正常的程式出了問題

錯誤訊息如下:

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.

https://ithelp.ithome.com.tw/upload/images/20201204/20110337qfuY9WwI6L.jpg

有照著建議調整還是一樣,不知道問題出在哪邊?

sql語法

INSERT INTO client_and_server_lists(type, ip, ou, name) SELECT 'client' as type, IP, OrgName, Owner FROM drip_client_list

pdo 執行sql的execute方法
https://ithelp.ithome.com.tw/upload/images/20201204/20110337P7c0wxmFMT.jpg

PDO設定
https://ithelp.ithome.com.tw/upload/images/20201204/20110337szNlF3Mq2B.jpg

SQL語法本身沒問題,直接用phpMyAdmin執行是正常的
另外把SQL語法中的insert拿掉只保留後面的select又可以正常
不知道是不是 insert ... select....這種寫法在php 7.4版的pdo中會出現問題?


解法1

另外創一個executeNoFetch方法就好了
不過全站全部的script都要改了....

解法2
execute方法調整
針對錯誤碼 HY000 做例外處理~~


官方
Bug #80458 PDOStatement::fetchAll() throws for upsert queries
Bug #80458 PDOStatement::fetchAll() throws for upsert queries #6482
我想下一版應該就正常了~~

淺水員 iT邦大師 6 級 ‧ 2020-12-04 15:43:32 檢舉
我沒想過 insert 可以用 fetch 拿資料呢
能不能用等其他人回答
如果急用要不要考慮用 transaction 做看看?
通靈亡 iT邦高手 1 級 ‧ 2020-12-04 15:44:01 檢舉
INSERT INTO SELECT 為什麼需要用 fetchAll()?
你是不是把SELECT 跟 非SELECT的查詢共用了,把兩個方法分開吧。
舜~ iT邦高手 1 級 ‧ 2020-12-04 16:27:17 檢舉
!!!感恩解惑!! 但php升級前沒出錯阿,升級後突然變得嚴格了,想等之後有空再回頭來修正,有什麼方法暫時容錯不要那麼嚴格?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
ckp6250
iT邦好手 1 級 ‧ 2020-12-04 16:58:12

如果在 fetch 之前,先關掉 MYSQL_ATTR_USE_BUFFERED_QUERY
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
關完後,再fetch
$db->fetch(PDO::FETCH_ASSOC)

可行嗎?

舜~ iT邦高手 1 級 ‧ 2020-12-07 10:52:55 檢舉

不可行...THX

ckp6250 iT邦好手 1 級 ‧ 2020-12-07 11:24:11 檢舉

為何您的程式碼區塊無法複製?您那是貼圖檔嗎?
我也是用php7.4,我想測看看有無相同問題。

我要發表回答

立即登入回答