На мой взгляд, у меня есть запрос, который выглядит примерно так:
$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... }
Только данные могут быть привязаны к заполнителям.
Имена столбцов / таблиц являются частью схемы и не могут быть связаны . (Тот факт, что он генерирует «нечетные результаты» вместо простого получения ошибки, является особенностью реализации.)
Я бы предложил использовать белый список имен столбцов и управляемую интерполяцию строк.