PDO добавляет апостроф к запросу mySQL

После долгих лет чтения пришло время задать первый вопрос 🙂

Моя проблема заключается в том, что после миграции кода из mySQLi в PDO у нас возникла проблема, так как кажется, что PDO добавляет апострофы к запросу.

PHP-код выглядит следующим образом:

$sort = $_GET['sort']; << table column name (mySQL VARCHAR only columns) .... $query = 'SELECT * FROM table WHERE xxx > 0'; $query .= ' ORDER BY :sort ASC ;'; $qry_result= $db->prepare($query); $qry_result->execute(array(':sort'=>$sort)); 

Версия mysqli прошла гладко, но теперь запросы (файл журнала mysql) выглядят следующим образом:

 SELECT * FROM table where xxx > 0 ORDER BY 'SORT_VAR_VALUE' ASC; ^ 2 problems ^ 

Поэтому таблица НЕ отсортирована, так как порядок сортировки (с точки зрения mySQL) неверен.

phpinfo () не получает никаких результатов для поиска по «магии» и «цитатам».

Есть идеи ??

    Заполнители в отчетах PDO предназначены только для значений. Если вы хотите добавить фактический SQL в запрос, вам нужно сделать это по-другому.

    Во-первых, вы должны дезинфицировать $sort и окружать его обратными выводами в запросе.

     $sort = preg_replace('/^[a-zA-Z0-9_]/', '', $sort); 

    Затем вы можете дважды указать строку запроса, и PHP заменит $sort на его значение для вас:

     $query = "SELECT * FROM table WHERE xxx > 0 ORDER BY `$sort` ASC"; 

    Или вы можете заменить его preg_replace так:

     $query = 'SELECT * FROM table WHERE xxx > 0 ORDER BY `:sort` ASC'; $query = preg_replace('/:sort/', $sort, $query, 1); 

    Я бы использовал метод preg_replace потому что он позволяет повторно использовать запрос, если вы присваиваете результаты из preg_replace другой переменной вместо перезаписи исходной переменной.

    по умолчанию pdo связывает значения как строки.

    Чтобы исправить это, вы захотите проверить, что столбец фактически является допустимым именем, а затем добавить его в запрос, вы можете сделать это следующим образом:

     function validName($string){ return !preg_match("/[^a-zA-Z0-9\$_\.]/i", $string); } if(validName($sort)){ $db->prepare("SELECT * FROM table where xxx > 0 ORDER BY $sort ASC"); } 

    С PDO невозможно связать другие вещи с переменными в инструкции WHERE. Поэтому вам нужно жестко закодировать имена столбцов, которые вы заказываете. См. Как установить параметры ORDER BY с помощью подготовленной инструкции PDO? или Может ли PHP PDO State принимать имя таблицы или столбца в качестве параметра? для дальнейших объяснений.