我正在尝试使用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存储过程时出现乱序错误相关推荐

  1. 关于调用Oracle存储过程时发生“BCD Overflow”错误的处理

    笔者最近在使用TSQLStoredProc调用Oracle存储过程时发现,即使存储过程体为空时,都会发生 BCD Overflow 错误,该表部分定义如下: PLANE_ALL_PARAMETER表: ...

  2. c++调用mysql存储过程_C++中ADO调用MySQL存储过程失败,诡异的语法异常,求解中,附源码...

    C++中ADO调用mysql存储过程失败,诡异的语法错误,求解中,附源码 不管怎么调整,死活都出现下面的错误 C++ADO代码我实在找不到什么错误了,难道是MySQL有什么问题,或者有其他需要注意的地 ...

  3. hibernate mysql 存储过程_hibernate调用mysql存储过程

    hibernate调用mysql存储过程 在最近的项目中,碰到一小段数据库数据分析的程序,需要结合多张表联合查询或涉及到子查询,项目主要采用的java ee开发,使用了hibernate框架,由于这些 ...

  4. jsp实现mysql存储过程_JSP调用MySQL存储过程收藏

    JSP调用MySQL存储过程收藏 1使用不带参数的存储过程 使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列.不带参数的 call 转义序列的语法如下所示: {c ...

  5. SpringBoot Mybatis注解调用Mysql存储过程并接收多个OUT结果集(多个mode=IN和mode=OUT参数)

    其他同学提供的方式大部分都是Map接收调用mysql存储过程返回OUT结果集,要么游标,要么单个OUT,然后再次加工成想要的对象.涉及到直接用注解实现自动转换OUT参数结果集为对象时,都是忽略带过. ...

  6. vb获得mysql的值,VB.NET调用MySQL存储过程并获得返回值的方法

    本文实例讲述了VB.NET调用MySQL存储过程并获得返回值的方法.分享给大家供大家参考.具体实现方法如下: Dim myConnectionString As String = "Data ...

  7. mysql存储过程 php_PHP调用MYSQL存储过程实例

    说一下 在PHP页面中调用MYSQL存储过程的方法 以下是几个例子 仅供参考 实例一:无参的存储过程 $conn = mysql_connect('localhost','root','root') ...

  8. go mysql存储过程_Golang 调用MySQL存储过程

    Golang 调用MySQL存储过程 最近写项目发现,很多逻辑业务的实现,写到数据库的存储过程中,然后调用,真的非常方便.后端代码量大大减少,最重要的是性能高,速度快! 引用说明:项目使用数据库ORM ...

  9. mysql inputoutput_PHP:同时使用INPUT和OUTPUT参数(不“ INOUT”)调用MySQL存储过程

    从PHP,我想在MySQL中调用存储过程.该过程采用输入 和 输出参数- 而不是 " INOUT" 参数. 对于一个简单的示例,说我在MySQL中具有以下存储过程: DELIMIT ...

最新文章

  1. OpenCV 4.2.0 发布,Intel 开源的计算机视觉库
  2. http并发,操作系统如何识别对应的进程,线程请求
  3. 1756冗余_AB冗余模块1756-RM
  4. python深拷贝实现原理,js递归实现深拷贝
  5. STM32工作笔记0055---认识pcbdoc文件Schdoc文件
  6. python配置文件转dict
  7. 了解计算机PS,PS教程:你应该了解的PS基础绘图工具
  8. 线性代数第6章答案(仅供参考!!!)
  9. 中国地图json 文件下载
  10. Android APK反编译教程
  11. 梦洁高端化,能解决中国人的睡眠问题吗?
  12. 学习java之java帝国的诞生
  13. html页面布局实验原理,html网页制作实验报告.doc
  14. RTX 4070TI和RTX 4080差距 RTX4070ti和4080区别对比
  15. NeuroAI作者,冷泉港主任独家专访:忽视神经科学给我们的启示是愚蠢的
  16. 数据的聚合与分组运算
  17. 优缺点 快速扫描 硬盘监测_MHDD快速检测硬盘坏道
  18. OSPF与BGP联动
  19. android hook api
  20. PHP反射ReflectionClass、ReflectionMethod

热门文章

  1. Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫
  2. 早期更多失败– Java 8
  3. 32和64位jvm_我应该使用32位还是64位JVM?
  4. java 生成器 设计模式_Java中的生成器设计模式
  5. spring social_Spring Social入门–第2部分
  6. solr创建索引_Solr:创建拼写检查器
  7. Java设计模式教程
  8. 在JavaEE中使用CDI的简单面向方面的编程(AOP)
  9. 记录合规性–关于TCK,规格和测试
  10. Cobertura和Maven:集成和单元测试的代码覆盖率