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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值