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
相关产品推荐
相关产品推荐

