Laravel orderByRaw用户ID数组与绑定

时间:2017-03-22 11:56:21

标签: php laravel sql-injection sqlbindparameter

因此,对于我的服务器,我想将一个ID数组传递给我的Laravel服务器以获取用户列表。同时,我希望返回的数据库查询结果也保持与我传入的ID参数数组相同的顺序。

我目前有以下工作:

$strIDs = $request->input('user_ids');
$u_ids = explode(",",$strIDs);
$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderByRaw(DB::raw("FIELD(user_id, $strIDs)"))->get();

但是我知道有一种叫做SQL注入攻击的东西,推荐的事情是将SQL语句的参数与变量绑定以防止这些问题。

在进行了一些其他搜索后,我尝试了以下操作,但语法不正确:

$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderByRaw(DB::raw("FIELD(user_id, ':values')", ['values' => $strIDs]))->get();

有人能看出我做错了吗?

2 个答案:

答案 0 :(得分:1)

如果您使用的是laravel 5,请尝试使用orderBy

orderBy有一个参数来选择Descend vs Ascendent,在你的情况下,你应该使用:

$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderBy('user_id', 'ASC')->get();

实施例

您的输入是:[13,87,29]

如果您使用 ASC ->orderBy('user_id', 'ASC') 输出将是:[13,29,87]

如果您使用 DESC ->orderBy('user_id', 'DESC') 输出将是:[87,29,13]

答案 1 :(得分:0)

如果您想要防止您的应用程序进行sql注入,您应该使用预准备语句。并且,不需要使用Laravel原始查询,因为Laravel具有这些简单查询的内部函数,并将自动为您进行准备和绑定。

只需使用:

$users = User::whereIn('user_id',$u_ids)->notDeleted()->orderBy('user_id')->get();

它会阻止您的应用程序进行sql注入。希望我已经回答了你的问题。