为何请求返回'?'符号?为何变量$search的值被替换为?字符?
关于Laravel查询构建器返回
?符号的疑问解答 这俩问题其实是一回事儿——这可不是什么bug,是Laravel查询构建器的参数绑定机制在干活呢,而且这还是个非常重要的安全&性能优化特性!
我给你掰扯清楚为什么会这样:
- 防SQL注入的核心操作:要是直接把
$search的值硬拼进SQL里,万一有人传个恶意字符串(比如' OR 1=1 --),直接就把你的数据库查个底朝天了。用?当占位符,数据库会把后面绑定的变量当成纯数据处理,根本不会解析成SQL指令,从根源上堵死注入漏洞。 - 数据库性能优化:带占位符的SQL语句可以被数据库预编译,之后再执行相同结构的查询时,数据库直接复用之前的执行计划,不用重新解析SQL,速度更快、资源占用更少。
- 自动处理数据格式:参数绑定会自动帮你处理数据类型适配,比如字符串自动加引号、日期格式自动转换,你不用手动去拼这些格式,省得写错还容易出问题。
再看你的示例代码:
$search = 'words'; Post::where("description", 'like', "%".$search."%")->toSql();
toSql()方法本来就只返回带占位符的SQL模板,它不会把参数替换进去。实际执行查询的时候(比如调用->get()),Laravel会把$search的值作为参数传给数据库,数据库内部会完成?的替换,最终执行的逻辑等价于select * from postwheredescription like '%words%',只是不会直接生成这种拼接好的字符串而已。
要是你好奇绑定的参数是什么,可以用这个方法查看:
dd(Post::where("description", 'like', "%".$search."%")->getBindings());
它会返回一个数组,里面就是要替换?的实际值。
内容的提问来源于stack exchange,提问作者Alex Smirnov
相关产品推荐
相关产品推荐

