失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错 MySQL报General error: 1243错误...

MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错 MySQL报General error: 1243错误...

时间:2019-07-01 19:00:22

相关推荐

MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错 MySQL报General error: 1243错误...

背景:

用的ThinkPHP5的框架。(相比之前的3.2版本,版本5都用了PDO处理数据库)

症状:

报错信息:

SQLSTATE[HY000]: General error: 1243 Unknown prepared statement handler (1) given to mysqld_stmt_execute

具体的错误SQL,可能是任何一条正常的SQL。

不是每次必报错,是偶尔,但是出现频率较高。经过测试:1000次请求,可能会有30次错误。

错误排查:

本地测试,无问题(PHP直连MySQL)。

线上的ThinkPHP3.2系统,无问题(PHP通过MySQL-proxy代理连接数据库)。

然后排查得出怀疑对象,线上的PHPPDO与MySQL-proxy。

然后给ThinkPHP5的数据库配置加一条:

// 数据库连接参数'params' => [PDO::ATTR_CASE => PDO::CASE_LOWER,PDO::ATTR_EMULATE_PREPARES => true,],

线上线下测试,均未再出现此问题。

当然,这个解决方案并不是很好。预处理强制给PHP自身处理,不会更安全。但总归是找到了问题所在。

感谢一起讨论指点的朋友。

后记:用Mycat代理MySQL,无此报错。不过要注意一点:因为Mycat是JAVA开发的,所以对数据库里时间的字段,不能值为 0000-00-00 00:00:00,会报错。

以及感谢如下参考:

/topic/47606.html

/article/56612.htm

/manual/zh/pdo.setattribute.php

/manual/thinkphp5/211524

/q/1010000012302149/a-1020000013069236

题外:

/u/437615/blog/369481

如果觉得《MySQL-proxy代理导致PHP PDO::ATTR_EMULATE_PREPARES的预处理出错 MySQL报General error: 1243错误...》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。