我有这段代码:
$sort = (is_null($sort)) ? 'i.name' : $sort;
$order = (!is_null($order) && $order == 'ASC') ? 'ASC' : 'DESC';
$queryBuilder
->select('s')
->from('Model:Item', 'i')
->where('i.isRemoved = false')
->orderBy(':sort', $order)
->setParameter('sort', $sort);
但是我收到了这个错误:
[1/2] QueryException: SELECT i FROM Model:Item i WHERE i.isRemoved = false ORDER BY :sort DESC
我必须对setParameter()
电话做错事,但我无法弄清楚是什么?
有什么想法吗?感谢
答案 0 :(得分:2)
setParameter()
用于防止SQL注入攻击,因为许多WHERE
子句依赖于用户输入。
这可能是问题的原因 - 我并不完全确定ORDER BY
子句支持参数替换。我可能错了,但你的错误似乎表明(1)它不支持它,或者(2)你得到错误的输入。
你究竟从哪里获得了$sort
?如果它来自某些用户输入,那么您可能希望在此处执行清理逻辑,只需在orderBy()
方法中设置已解析的值。
考虑id
和name
是实际字段的示例。当有人试图传递i.description
时会发生什么?整个SQL都会失败。但如果你做了这样的事情,那就不行了:
$sort = (in_array($sort, array('i.id', 'i.name')))
? $sort
: 'i.name';
// Now you've effectively sanitized the value
// i.e. It's *always* going to be either 'i.id' or 'i.name'
// So there's no reason to need something like setParameter()
$queryBuilder
->select('s')
->from('Model:Item', 'i')
->where('i.isRemoved = false')
->orderBy($sort);