Intereting Posts
Как передать массив со всеми элементами с jquery на php CodeIgniter + API Карт Google V3 + закрыть InfoWindow () Как проверить, существует ли пользователь в MySQL с PHP Как фиксировать детали очереди заданий после завершения в Laravel 5.1? Преобразование строк Mongodb на сегодняшний день Позвольте пользователям создавать свои собственные настраиваемые параметры меню, сохраняя при этом значения по умолчанию для приложений Почему apache не показывает ошибку 404, когда я отправляю заголовок 404 с php? PHP включает в себя вопрос о лучших практиках Как вы увеличиваете назначенную переменную в smarty, не отображая ее Выпадающее меню подтверждения CodeIgniter Как создать купон на конкретный продукт в Magento? как получить идентификатор из базы данных? $ _SERVER .. Определенный индекс: PATH_INFO Как получить только ТЕГИ ПРОДУКТА в view.phtml в Magento 1.7.0.2? PHP – ключи многоадресного массива Concatenate / cascade

PHP / MYSQL – Подготовленные утверждения MySQLi – Можно использовать bind_param для ORDER BY? (упорядочение набора результатов)

На мой взгляд, у меня есть запрос, который выглядит примерно так:

$sort = isset($sort) ? sanitize($_sort) : 'id'; if ($result = $link->prepare(" SELECT id, price FROM items ORDER BY ? ")) { $result->bind_param("s", $sort); $result->execute(); etc... } 

Когда я запускаю этот блок кода без установки переменной сортировки, он работает без ошибки, связанной с использованием? в предложении ORDER BY, и набор результатов отображается в том, что кажется результирующим набором с «ORDER BY id».

ЗДЕСЬ ПРОБЛЕМА В ОДНОМ СЛУЧАЕ:

Теперь, если я устанавливаю переменную сортировки на что-то вроде «цены ASC», я все равно получаю набор результатов, который кажется «ORDER BY id» вместо «ORDER BY price ASC».

Когда я запускаю запрос в качестве запроса в phpmyadmin, он возвращает правильный набор результатов, основанный на «цене ASC», если я определяю запрос таким образом.

Теперь, если я изменяю код и запускаю его следующим образом:

 $sort = isset($sort) ? sanitize($_sort) : 'id'; if ($result = $link->prepare(" SELECT id, price FROM items ORDER BY $sort ")) { $result->execute(); etc... } 

Он работает правильно, с набором результатов, который совпадает с моим запросом в phpmyadmin …

Может ли кто-нибудь рассказать мне о том, что именно происходит здесь, и почему запрос не выполняется, поскольку я изначально предполагал использование bind_param.

На мой взгляд, это должно работать, потому что не возникает ошибок, связанных с таким использованием … Но на практике кажется, что это не работает для предложения ORDER BY. Его почти как не переводит переменную сортировки при запуске bind_param.

Спасибо, что прочитали мой вопрос, и любые материалы, относящиеся к нему, были бы очень признательны!

РЕДАКТИРОВАТЬ :

Для всех, кого это интересует –

 if (isset($sort)) { $acceptableSortValues = array('name', 'price ASC', 'price DESC'); $sort = sanitize($sort); if (!in_array($sort, $acceptableSortValues)) { $sort = 'name'; } } else { $sort = 'name'; } if ($result = $link->prepare(" SELECT name, price FROM items ORDER BY $sort ")) { $result->execute(); etc... } 

Solutions Collecting From Web of "PHP / MYSQL – Подготовленные утверждения MySQLi – Можно использовать bind_param для ORDER BY? (упорядочение набора результатов)"

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

Имена столбцов / таблиц являются частью схемы и не могут быть связаны . (Тот факт, что он генерирует «нечетные результаты» вместо простого получения ошибки, является особенностью реализации.)

Я бы предложил использовать белый список имен столбцов и управляемую интерполяцию строк.