异常信息如下:
[PDOException]
SQLSTATE[HY000]: General error: 1390 Prepared statement contains too many placeholders
框架使用的TP5,在使用如下代码时,报错如下:切换为 Model 的形式使用也同意报错
$userIds = [];
for ($i = 0; $i < 70000; $i++) {
$userIds[] = (10000 + $i);
}
$userIds = join(',', $userIds);
$cursor = Db::table('users')->where('id', 'in', $userIds)->cursor();
排查:
TP5 的 where 方法应该是使用PDO的预处理,即:条件里面使用占位符组装SQL 语句,但MySql中的占位符最多只支持65535,所有就异常了!
解决:
直接自己组装SQL,然后使用 query 方法执行,相当于跳过占位符的限制
$cursor = Db::query("SELECT * FROM `users` where id in ({$userIds})");