PHP PDOException — too many placeholders

异常信息如下:

[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})");