SQL ORDER BY с использованием подготовленных операторов

Я пробовал все различные варианты этого кода и не могу заставить его работать, может ли кто-нибудь указать мне в правильном направлении?

if(isset($_GET['s']) And isset($_GET['o'])) { if(strip_tags(htmlspecialchars($_GET['s'])) === 's') $sortingby = 'sender'; if(strip_tags(htmlspecialchars($_GET['s'])) === 't') $sortingby = 'title'; if(strip_tags(htmlspecialchars($_GET['s'])) === 'd') $sortingby = 'timestamp'; if(strip_tags(htmlspecialchars($_GET['o'])) === 'a') $orderingby = 'ASC'; if(strip_tags(htmlspecialchars($_GET['o'])) === 'd') $orderingby = 'DESC'; echo '<br />'; echo $sortingby; echo $orderingby; } $stmt = $pdo->prepare("SELECT * FROM messages WHERE receiver = :id AND rhide = 0 ORDER BY :sortingby :orderingby "); $stmt->execute(array( ':id'=>$id, ':sortingby'=>$sortingby, ':orderingby'=>$orderingby )); $messages = $stmt->fetchAll(PDO::FETCH_ASSOC); 

Переменные присваиваются правильно, когда я их выдаю, просто кажется, что мой контент игнорируется

Посмотрите на эти ссылки:

Mysqli Подготовить заявления + Binding Order BY

В качестве ссылки php.net вы обнаружили состояния, вы не можете использовать переменные связывания для идентификаторов. Вам понадобится обходной путь. mysql_real_escape_char , безусловно, будет одним из способов.

… а также …

Как использовать подготовленный оператор pdo для порядка и ограничений?

По этой причине поля ORDER BY должны быть частью строки SQL, переданной в метод prepare() , а не привязываться к запросу до execute() .

================================================== ========

ДОПОЛНЕНИЕ:

Поскольку вы уже эффективно проверяете имена столбцов и предложение «ASC / DESC» перед вашей «подготовкой», нет никакой опасности SQL Injection.

Я бы просто построил строку:

 $sql = "SELECT * FROM messages WHERE " . "receiver = :id AND rhide = 0 " . "ORDER BY " . $sortingby . " " . $orderingby; $stmt = $pdo->prepare($sql); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); $messages = $stmt->fetchAll(PDO::FETCH_ASSOC); 

Только данные могут быть связаны с заполнителями, имена столбцов или таблиц не могут быть связаны.