1

我想将排序类型作为参数。所以我写了函数

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 exception 'Doctrine\ORM\Query\QueryException' with message '[Syntax Error] line 0, col 77: Error: Expected end of string, got '?'' in C:\Users \user\Desktop\projects\interview\application\libraries\Doctrine\ORM\Query\QueryException.php:42 堆栈跟踪:#0 C:\Users\user\Desktop\projects\interview\application\libraries\Doctrine\ORM\ Query\Parser.php(380): Doctrine\ORM\Query\QueryException::syntaxError('line 0, col 77:...') #1 C:\Users\user\Desktop\projects\interview\application\libraries \Doctrine\ORM\Query\Parser.php(745): Doctrine\ORM\Query\Parser->syntaxError('end of string') #2 C:\Users\user\Desktop\projects\interview\application\libraries\ Doctrine\ORM\Query\Parser.php(213): Doctrine\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 行

还有其他方法如何按参数设置排序类型吗?

4

2 回答 2

2

首先,您将值直接放入您的 DQL (c.isremoved = 0),正如 Bram 正确指出的那样,这不应该发生。您应该只将参数“绑定”到您的查询中,这些参数将被正确转义并减轻任何潜在的 SQL 注入攻击。

其次,您使用的 $sortType 参数应该包含 ASC 或 DESC。不确定您希望传递给此函数的值。但正如 Bram 所演示的,应该对此进行测试,以确保您只使用这两个值之一。

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();
}
于 2013-03-04T09:24:31.723 回答
-1

您只能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);
于 2013-03-04T08:08:37.350 回答