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();
}

ただし、致命的なエラーでは機能しません。キャッチされない例外'Doctrine \ ORM \ Query \QueryException'とメッセージ'[構文エラー]行0、列77:エラー:文字列の終わりが必要です。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 \ Desktop in C:\ Users \ user \デスクトップ\プロジェクト\インタビュー\アプリケーション\ライブラリ\Doctrine\ ORM \ Query \ QueryException.php(42行目)

パラメータでソートタイプを設定する他の方法はありますか?

4

2 に答える 2

2

まず、値をDQLに直接入力します(c.isremoved = 0)。これは、Bramが正しく指摘しているように発生しないはずです。パラメータをクエリに「バインド」する必要があります。これらは正しくエスケープされ、潜在的なSQLインジェクション攻撃を軽減します。

次に、使用する$ sortTypeパラメーターには、ASCまたはDESCのいずれかが含まれている必要があります。この関数に渡すことを期待している値がわかりません。しかし、Bramが示したように、これをテストして、2つの値のうちの1つだけを使用することを確認する必要があります。

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 に答える