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