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

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

// vs

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

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

摈弃世俗浮躁,追求技术精湛
Summer
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10

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

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

这样可以避免注入吧

3年前 评论

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

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

3年前 评论
$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;
3年前 评论

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

3年前 评论

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

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

3年前 评论
thebestxt 3年前
chowjiawei 3年前

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