0

PDOを使用してMYSQLからデータを取得しようとしていますが、うまくいきません。

これが私が試したことです:

$postQuery = $DBH->prepare("SELECT title, views, rating, thumb FROM posts WHERE category=:category and status=1 ORDER BY :sort DESC");
$postQuery ->bindParam(':category', $category);
$postQuery ->bindParam(':sort', $sort);
$postQuery ->execute();

これはエラーなしで機能しますが、カテゴリと並べ替えを無視して、すべての投稿をアルファベット順に返します。

私はこれを試しました:

$postQuery = $DBH->query("SELECT title, views, rating, thumb FROM posts WHERE category={$category} and status=1 ORDER BY {$sort} DESC");

これは機能しましたが、準備されたステートメントの保護が得られません。一方のステートメントが機能するのに、もう一方のステートメントが機能しない理由についてのアイデアはありますか?

4

2 に答える 2

3

バインドされたパラメーター:sortは、SQL 識別子ではなく、文字列リテラルに展開されます。つまり、次の行に沿って何かを効果的に評価しています。

ORDER BY 'rating' DESC

このようなリテラルはすべてのレコードで一定であるため、結果セットの順序には影響しません。

識別子をパラメーター化することはできないため、SQL のその部分を準備済みステートメントに連結する必要があります (最も安全な方法は$sort、ニーズに適したロジックに基づいて、あらかじめ決められた一連の安全な値から設定することです)。

于 2012-11-19T18:31:50.170 に答える
1

ORDER BY 句ではプレースホルダーを使用できません。この質問を参照してください:準備された PDO ステートメントを使用して ORDER BY パラメータを設定するにはどうすればよいですか?

于 2012-11-19T18:36:07.020 に答える