2013-03-04 4 views
1

Я хотел бы иметь тип сортировки в качестве параметра. Так что я написал функцию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(); 
} 

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

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

ответ

0

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

Просто CONCAT с помощью простого 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); 
1

Во-первых, ваш ввод значения непосредственно в 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(); 
} 
Смежные вопросы