在项目中遇到一个问题,TP3.2封装的select()查询 , 类似下面的场景
$codeList = ['xxxxxxxxxxxxxxxxxxxxx', 'yyyyyyyyyyyyyyyyyyyyy', 'zzzzzzzzzzzzzzzzzzzz',...........................]; (大约900个元素)
$where['code'] = ['in', $codeList];
M('table')->field('id,name')->where($where)->select();
TP报错:array_map(): Argument #2 should be an array .........................
怀疑查询条件数组$codeList过大,导致sql查询语句过长出现异常?
取到正常执行 Sql 的 $codeLsit,(我这边是$codeList 取298正常,299及以上报错)
自己在mysql命令行:将正常执行Sql后面又添加了2个code ,(模拟where code in 300个元素的查询),
mysql 报错:Got a packet bigger than 'max_allowed_packet' bytes
max_allowed_packet:mysql控制其通信缓冲区最大值 大小的变量
有时候大的查询、插入、更新会受max_allowed_packet 参数限制,导致写入或者更新失败。
1、查看配置:SHOW VARIABLES LIKE '%max_allowed_packet%';
版本不同可能会有不同的默认值,通常为1048576(1M) 或者 4194304(4M),但是我的显示1024K
2、修改:
方法1:
编辑my.cnf修改(windows下my.ini),在[mysqld]段、mysql的server配置段修改 max_allowed_packet = 4M(自行选择合适大小)
方法2:进入mysql 控制台,在命令行中运行 set global max_allowed_packet = 4*1024*1024;
退出mysql命令行,然后重新登录
show VARIABLES like '%max_allowed_packet%';
查看下max_allowed_packet是否编辑成功
注:方法2中,如果重启mysql服务,max_allowed_packet的值会还原成默认的初始值,命令行里设定的值不会永久有效。