You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 8 原生查询LIKE语句如何正确绑定参数避免SQL注入

问题原因

你第一种写法执行失败的核心原因是:SQL语句中占位符:field被放在了单引号包裹的字符串内部,Laravel的参数绑定机制不会解析单引号内的占位符,只会将其识别为普通的字符串内容,导致参数无法被正确替换,因此查询执行失败。
而第二种直接拼接变量的写法虽然能执行,但完全没有做参数转义,存在极高的SQL注入风险,绝对不能在生产环境使用。


正确写法1:将通配符整合到绑定参数中

不需要在SQL语句里写%,把通配符直接加到要绑定的参数值上即可:

DB::connection($con)->select( DB::raw("
select
    distinct c.id as companies_id,
    name,
    symbol
from
    product t
left outer join companies c on
    c.id = t.companies_id
where symbol like :field or name like :field
order by
    symbol asc;"),
    ['field' => "%{$field}%"]
);

正确写法2:使用SQL的CONCAT函数拼接通配符

也可以在SQL层面用CONCAT函数拼接通配符和参数,此时参数直接传原始值即可:

DB::connection($con)->select( DB::raw("
select
    distinct c.id as companies_id,
    name,
    symbol
from
    product t
left outer join companies c on
    c.id = t.companies_id
where symbol like CONCAT('%', :field, '%') or name like CONCAT('%', :field, '%')
order by
    symbol asc;"),
    ['field' => $field]
);

以上两种写法都走了Laravel的参数绑定机制,会自动对参数内容做转义处理,既可以正常执行查询,也完全规避了SQL注入风险。

内容的提问来源于stack exchange,提问作者Carol.Kar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 01:06:04