pro*_*mer 4 php parameterized-query laravel eloquent laravel-4
假设我想显示一个完整的奖项列表,其中type ="color":
Awards Type 2013 Winner
====== ==== ===========
Blue Award color Tom
Red Award color
Green Award color Dan
Run Code Online (Sandbox Code Playgroud)
为了达到这个结果,我可以在Laravel中查询如下:
$year = '2013';
$awards = DB::table('awards')
->leftJoin('winners', function($join) use ($year)
{
$join->on('awards.id','=','winners.award_id');
$join->on('winners.year','=',DB::raw("'".$year."'"));
}
->where('awards.type','color')
->get();
Run Code Online (Sandbox Code Playgroud)
如果输出Laravel生成的SQL,您将看到只有WHERE子句被参数化,并且如果从不受信任的源获取它,则ON子句中的$ year 容易受到sql注入的攻击.此外,查询的缓存潜力也会降低,因为$ year会经常更改.注意:如果您认为我只是将第二个左连接条件添加到查询的WHERE,则 这些不一样.
有关如何获取查询的$ year部分的任何想法参数化?
这是一个奇怪的解决方法(不想扩展Builder和JoinClause类):
注意:这将打破查询链接,->因此注意where下面分开了.
$query = DB::table('awards')
->leftJoin('winners', function($join)
{
$join->on('awards.id','=','winners.award_id');
$join->on('winners.year','=',DB::raw('?'));
}
->setBindings(array_merge($query->getBindings(),array($year)));
$query->where('awards.type','color');
$awards = $query->get();
Run Code Online (Sandbox Code Playgroud)
更新:泰勒补充说 joinWhere,leftJoinWhere......他说"如果你有一个函数连接只是使用->where和->orWhere从闭包中." 我还没试过这个.