Intereting Posts
Как я могу оптимизировать эти запросы? Как сравнить два изображения для сходства (Не точные совпадения с MD5)? Отображение результатов гиперссылок, таких как поисковая система Получение запроса по всему домену и порту Angular2 на PHP CodeIgniter – загружать библиотеки, если они еще не загружены Как продлить класс Аура-гвардии Ларавеля? Как передать переменное количество параметров функции в PHP Моя доктрина действительно медленная. Простой запрос и одна секунда, чтобы получить результат Оператор MySQL SELECT: как получить один точный результат строки из похожих строк? Catch db2_prepare сгенерированное предупреждение Могу ли я использовать URL-адрес в качестве источника для imagecreatefromjpeg () без включения оберток fopen? Новая страница WordPress перенаправляет на старую страницу 404 Хранить данные в форме html после отправки формы Загрузка файлов вне веб-сайта Как сделать файл .PHP доступным только для сервера?

Как установить параметры ORDER BY с помощью подготовленной инструкции PDO?

У меня проблемы с параметрами в разделе ORDER BY моего SQL. Он не выдает никаких предупреждений, но ничего не выводит.

 $order = 'columnName'; $direction = 'ASC'; $stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY :order :direction"); $stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR); $stmt->bindParam(':order', $order, PDO::PARAM_STR); $stmt->bindParam(':direction', $direction, PDO::PARAM_STR); $stmt->execute(); 

The :my_param работает, но не :order или :direction . Является ли это внутренним бегством? Могу ли я вставить его непосредственно в SQL? Вот так:

 $order = 'columnName'; $direction = 'ASC'; $stmt = $db->prepare("SELECT * from table WHERE column = :my_param ORDER BY $order $direction"); 

Существует PDO::PARAM_COLUMN_NAME константа PDO::PARAM_COLUMN_NAME или какой-либо эквивалент?

Благодаря!

Здесь возникает вопрос, что широко любимые подготовленные заявления – это не серебряная пуля, хе-хе 🙂

Да, вы застряли, вставив его непосредственно в SQL с некоторыми предосторожностями, конечно. Каждый оператор / идентификатор должен быть жестко закодирован в вашем скрипте, например:

 $orders=array("name","price","qty"); $key=array_search($_GET['sort'],$orders); $order=$orders[$key]; $query="SELECT * from table WHERE is_live = :is_live ORDER BY $order"; - $orders=array("name","price","qty"); $key=array_search($_GET['sort'],$orders); $order=$orders[$key]; $query="SELECT * from table WHERE is_live = :is_live ORDER BY $order"; 

То же самое для направления.

Обратите внимание, что bindParam не ускользает, так как не требуется никакого экранирования. он имеет обязательную силу.

Я не думаю, что вы можете:

  • Использовать заполнители в порядке order by
  • Связывать имена столбцов: вы можете связывать только значения – или переменные и вводить их значение в подготовленный оператор.

Возможно использование подготовленных операторов в предложении ORDER BY , к сожалению, вам нужно передать порядок столбца с именем и требуется установить PDO_PARAM_INT с типом.

В MySQL вы можете получить порядок столбцов с этим запросом:

 SELECT column_name, ordinal_position FROM information_schema.columns WHERE table_name = 'table' and table_schema = 'database' 

PHP-код:

 $order = 2; $stmt = $db->prepare("SELECT field from table WHERE column = :param ORDER BY :order DESC"); $stmt->bindParam(':param', $is_live, PDO::PARAM_STR); $stmt->bindParam(':order', $order, PDO::PARAM_INT); $stmt->execute(); 

Я не думаю, что вы можете получить ASC / DESC как часть подготовленного оператора, но столбец вы можете.

  order by case :order when 'colFoo' then colFoo when 'colBar' then colBar else colDefault end $direction 

Поскольку ASC / DESC – это всего лишь два возможных значения, вы можете легко проверить и выбрать между ними как жестко установленные значения.

Вы также можете использовать функции ELT (FIELD (,,,,,) ,,,,,) для этого, но тогда упорядочение всегда будет выполняться как строка, даже если это числовой столбец.

К несчастью, я думаю, вы не могли бы сделать это с подготовленными заявлениями. Это сделало бы его недоступным для кеширования, поскольку разные столбцы могут иметь значения, которые могут быть отсортированы с помощью специальных стратегий сортировки.

Создайте запрос с помощью стандартных экранов и выполните его напрямую.

Это возможно . Вы можете использовать число вместо имени поля в предложении 'order by'. Это число, начинающееся с 1 и имеющее порядок имен полей в запросе. И вы можете конкатенировать строку для ASC или DESC. Например «Выберите col1, col2, col3 из tab1 order на?» + StrDesc + «limit 10,5». strDesc = "ASC" / "DESC".

Если я не ошибаюсь, Паскаль прав.
Единственное связывание, возможное в PDO, – это привязка значений, как вы это делали с параметром ': my_param'.
Однако в этом нет вреда:

 $stmt = $db->prepare("SELECT field from table WHERE column = :my_param ORDER BY ".$order ." ".$direction); $stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR); $stmt->execute(); 

Единственное, что следует обратить внимание, это правильное преодоление $order и $direction , но поскольку вы устанавливаете их вручную и не устанавливаете их через пользовательский ввод, я думаю, что вы все настроены.

Создайте условие if-else.
Если (ascCondion), то привяжите значения, но жесткий код ORDER BY columnName ASC
еще
Свяжите значения, но жесткий код ORDER BY COlumnName DESC