Doctrine2: DQL с параметрами

Я хотел бы иметь тип сортировки в качестве параметра. Итак, я написал функцию

public function findInterval($pageNumber, $limit, $sortType) {
    $query = $this->_em->createQuery('Select c from Entities\Comment c where c.isremoved=0 ORDER BY c.creationdate ?1');
    $query->setParameter(1, $sortType);  //sortType is either ASC or DESC

    return $users = $query->getResult();
}

Но это не работает с фатальной ошибкой Неперехваченное исключение 'Doctrine \ ORM \ Query \ QueryException' с сообщением '[Синтаксическая ошибка] строка 0, столбец 77: Ошибка: ожидаемый конец строки, получил'? '' В C: \ Users \ пользователь \ Рабочий стол \ проекты \ интервью \ приложение \ библиотеки \ Doctrine \ ORM \ Query \ QueryException.php: 42 Трассировка стека: # 0 C: \ Users \ user \ Desktop \ projects \ интервью \ application \ libraries \ Doctrine \ ORM \ Query \ Parser.php (380): Doctrine \ ORM \ Query \ QueryException :: syntaxError ('строка 0, столбец 77: ...') # 1 C: \ Users \ user \ Desktop \ projects \ интервью \ application \ libraries \ Doctrine \ ORM \ Query \ Parser.php (745): Doctrine \ ORM \ Query \ Parser-> syntaxError ('конец строки') # 2 C: \ Users \ user \ Desktop \ projects \ интервью \ application \ libraries \ Doctrine \ ORM \ Query \ Parser.php (213): Doctrine \ ORM \ Query \ Parser-> QueryLanguage () # 3 C: \ Users \ user \ Desktop \ projects \ интервью \ application \ libraries \ Doctrine \ ORM \ Query \ Parser.php (288): Doctrine \ ORM \ Query \ Parser-> getAST () # 4 C: \ Users \ user \ Desktop \ projects \ интервью \ application \ libraries \ Doctrine \ ORM \ Query.php (23 0): Doctrine \ ORM \ Query \ Parser-> parse () # 5 C: \ Users \ user \ Deskt в C: \ Users \ user \ Desktop \ projects \ интервью \ application \ libraries \ Doctrine \ ORM \ Query \ QueryException .php в строке 42

Есть ли другой способ установить тип сортировки по параметру?


person Factory Girl    schedule 04.03.2013    source источник


Ответы (2)


Вы можете связывать параметры (используемые в where) только в подготовленных операторах. В любом случае нет необходимости использовать это в orderBy, потому что в этой части нет возможности для SQL-инъекции.

Просто конкатенируйте, используя простой PHP:

$sortType = ($sortType == 1) ? 'ASC' : 'DESC';
$query = $this->_em->createQuery('Select c from Entities\Comment c where c.isremoved=0 ORDER BY c.creationdate ' . $sortType);
person Bram Gerritsen    schedule 04.03.2013

Во-первых, вы помещаете значение прямо в ваш DQL (c.isremoved = 0), чего, как правильно указал Брам, не должно происходить. Вы должны только «привязать» параметры к вашему запросу, они будут правильно экранированы и уменьшат любую потенциальную атаку с использованием SQL-инъекций.

Во-вторых, используемый вами параметр $ sortType должен содержать ASC или DESC. Не уверен, какое значение вы ожидаете передать этой функции. Но, как показал Брэм, это следует проверить, чтобы убедиться, что вы используете только одно из двух значений.

public function findInterval($pageNumber, $limit, $sortType) 
{
    $sortType = ($sortType == 'ASC') ? $sortType : 'DESC';    // <-- this example defaults to descending
    $query = $this->_em->createQuery('SELECT c FROM Entities\Comment c WHERE c.isremoved = :isremoved ORDER BY c.creationdate ' . $sortType);
    $query->setParameter('isremoved', 0);

    return $users = $query->getResult();
}
person Lee Davis    schedule 04.03.2013