php保存成乱序,php – 调用MySQL存储过程时出现乱序错误
我正在嘗試使用PDO調用存儲過程,但在嘗試對結果進行獲取時遇到以下錯誤.
警告:數據包亂序.預計1收到16.數據包大小= 163
我的存儲過程使用兩個游標,我在從臨時表中選擇之前關閉它.我懷疑這可能是問題,因為我可以直接在MySQL中調用我的SP并且可以看到結果.在遷移到php_pdo_mysql.dll之前使用php_mysql擴展時,我也沒遇到過這個SP的問題.
我還可以使用PDO在PHP中調用包含INPUT參數的其他更簡單的存儲過程,并且可以在沒有任何錯誤的情況下獲取結果.
以下是返回錯誤的代碼:
$db = new PDO('mysql:host='.__DB_HOST__.';dbname='.__DB_NAME__.';charset=utf8', __DB_USER__, __DB_PASS__);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
/* DOES NOT WORK */
$queryResult = $db->prepare("CALL GetResults(:siteId,null)");
$siteId = 19;
$queryResult->bindValue(':siteId', $siteId, PDO::PARAM_INT);
$queryResult->execute();
$result = $queryResult->fetchAll(PDO::FETCH_ASSOC); // returns packets out of order warning
print_r($result);
我在Try / Catch塊中有這個代碼,沒有拋出任何異常.實際上,PHP在瀏覽器中將其顯示為警告.
我的存儲過程簽名如下所示:
CREATE DEFINER=`root`@`localhost`
PROCEDURE `GetResults`(IN siteIdParam INT(11), IN siteSearchText VARCHAR(45))
我也不確定問題是否將null作為一個參數傳遞.有時第一個參數傳遞null,有時它是第二個.但無論它總是直接在MySQL服務器上運行.
我嘗試了bindParam和bindValue,結果相同.我也可以發布我的SP但它可能有點矯枉過正.
有沒有辦法打開PDO擴展的其他日志記錄?
任何想法或建議?如果您需要更多信息,請告訴我.
注意:我使用的是PHP v5.5.4和MySQL v5.6.14.
解決方法:
在花了很多時間試圖隔離我的代碼部分來解決這個問題后,我注意到在將ATTR_EMULATE_PREPARES標志設置為true后錯誤消失了.
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
這告訴PDO模擬準備好的語句,而不是MySQL本地模擬.根據我一直在閱讀的內容,如果您使用的是最新版本的MySQL和PHP,通常建議關閉此標志(默認情況下為true).您可以在此SO article中找到有關該信息的更多信息.
我相信這是MySQL的一個錯誤(我遇到了5.6.17版本的問題).關于這個特定問題的討論不多,所以希望這可以節省其他時間的故障排除.這個問題也在this MySQL bug page討論過,但是在我的情況下,發布的解決方案對我沒有幫助.
標簽:php,mysql,sql,pdo,stored-procedures
來源: https://codeday.me/bug/20190713/1454505.html
總結
以上是生活随笔為你收集整理的php保存成乱序,php – 调用MySQL存储过程时出现乱序错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone14可以升级iOS16.4b
- 下一篇: mysql 1千万 like优化_MYS