QueryBuilder中的参数(Doctrine / Symfony)

时间:2014-06-30 03:11:53

标签: symfony parameters doctrine

我有这段代码:

    $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()电话做错事,但我无法弄清楚是什么?

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:2)

setParameter()用于防止SQL注入攻击,因为许多WHERE子句依赖于用户输入。

这可能是问题的原因 - 我并不完全确定ORDER BY子句支持参数替换。我可能错了,但你的错误似乎表明(1)它不支持它,或者(2)你得到错误的输入。

你究竟从哪里获得了$sort?如果它来自某些用户输入,那么您可能希望在此处执行清理逻辑,只需在orderBy()方法中设置已解析的值。

考虑idname是实际字段的示例。当有人试图传递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);