После долгих лет чтения пришло время задать первый вопрос 🙂
Моя проблема заключается в том, что после миграции кода из 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 принимать имя таблицы или столбца в качестве параметра? для дальнейших объяснений.