Laravel Eloquent 中 whereRaw('age>?', [25]) 与 whereRaw("age>{$_GET['age']}") 的区别是什么?

请尝试在评论区里写下答案(如不能清楚表述,那么你可能没真正理解)。欢迎参与,为下一次求职做准备。
User::whereRaw('age > ?', [25])->get();

// vs

User::whereRaw("age > {$_GET['age']}")->get(); 

应该使用哪一种?为什么?

摈弃世俗浮躁,追求技术精湛
Summer
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

感觉挺像sql注入的问题,我支持第一种。第二种我可以做一个 ?age = "(select id from admin_user where id = 1);update admin_user set deleted = 1 where id = 1;"

2年前 评论
Mutoulee
User::whereRaw('age > ?', [25])->get();

这样可以避免注入吧

2年前 评论

应该使用第一种,防止 SQL 注入。
第一种使用了参数绑定,不论传入什么参数,都会被转换为字符串形式,避免了在解析 SQL 语句时运行前端恶意传过来的 JS、 SQL 等攻击脚本。

Laravel 在 ORM 查询中已经解决了这个问题,但是在使用 Raw() 原生方法时,需要注意使用参数绑定

2年前 评论
$age = " 1 or 1 = 1";

User::whereRaw('age > ?', [$age])->get();
// sql = select * from `users` where age > '1 or 1 = 1';

User::whereRaw("age > {$age}")->get(); 
// sql = select * from `users` where age > 1 or 1 = 1;
2年前 评论

肯定第一种了,Raw() 第二个参数叫bindings 就知道是使用pdo的占位符了

2年前 评论

我会反问面试官,为什么不用 User::where('age','>',$age)->get();,大不了就是回家等通知嘛 :smile:

whereRaw 我一般是用在那种必须使用原生 sql 的场景,比如根据不同条件修改不同的值

2年前 评论
thebestxt 2年前
chowjiawei 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!