
在 Laravel 中直接通过命名占位符(如 :codes)向 SQL IN 子句传入字符串拼接值会导致查询失效;正确做法是使用 whereIn() 方法,由框架自动安全处理数组参数并生成适配的预处理语句。
在 laravel 中直接通过命名占位符(如 :codes)向 sql in 子句传入字符串拼接值会导致查询失效;正确做法是使用 wherein() 方法,由框架自动安全处理数组参数并生成适配的预处理语句。
在原生 SQL 中,IN 子句要求每个值独立占位(如 WHERE codes IN (?, ?, ?)),而无法用单个占位符(如 :codes)代表多个值——这是 PDO 和绝大多数数据库驱动的底层限制。你尝试传入 "'test','last'" 作为字符串,实际执行的是 WHERE codes IN ('''test'',''last'''),即把整个字符串当做一个字面量值匹配,自然无结果。
✅ 推荐方案:使用 Laravel 查询构建器的 whereIn()
该方法会自动展开数组、绑定每个元素为独立参数,并防止 SQL 注入:
// ✅ 正确:传入数组,而非字符串
$codes = ['test', 'last'];
$results = DB::table('mytable')
->whereIn('codes', $codes)
->get();
// 或使用 Eloquent 模型(假设存在 MyModel)
$results = MyModel::whereIn('codes', $codes)->get();⚠️ 注意事项:
-
$codes必须是索引数组(如['test', 'last']),不能是关联数组或 JSON 字符串; - 若数据来自用户输入(如 URL 参数),务必先过滤/验证,例如:
$codes = array_filter(array_map('trim', request('codes', [])), 'is_string'); - 避免手动拼接 SQL(如
"IN ('" . implode("','", $arr) . "')"),这极易引发 SQL 注入漏洞; -
whereIn()支持最多 65,535 个参数(受 MySQLmax_allowed_packet限制),超量时需分批查询。
? 进阶提示:
若必须使用原生 SQL(如复杂联合查询),可动态生成占位符:
$codes = ['test', 'last'];
$placeholders = str_repeat('?,', count($codes) - 1) . '?';
$sql = "SELECT * FROM mytable WHERE codes IN ($placeholders)";
$results = DB::select($sql, $codes);但除非必要,优先选择 whereIn() —— 更安全、简洁且可读性强。



















