Как передать имя выбираемого поля в SELECT запрос
Весь код публиковать не буду, т.к. он довольно объемный. В общем есть класс, который берет данные из базы для последующего вывода в html. В частности в классе есть такой метод:
public function getData($row, $page_id) {
$q = $this->db_connect->prepare('SELECT ? FROM pages WHERE id = ?');
$q->execute(array($row, $page_id));
$res =$q->fetch(PDO::FETCH_ASSOC);
return $res[$row];
}
$page_id - корректно берется из другого метода, а $row передается из другого скрипта как параметр в виде текста в кавычках (напр 'meta_title'). Вместо ожидаемого вывода значения содержимого поля meta_title из таблицы pages с заданным id мне выводится наименование поля meta_title. Т.е. в данном конкретном случае res['meta_title'] выдает meta_title, а не то что записано в поле meta_title. Я решил проблему с помощью PDO::query, но хотелось бы понять что не так в данном коде? Аргумент SELECT может быть в виде переменной?
Ответы (1 шт):
Имена объектов (полей, таблиц и пр.) не могут передаваться в запрос как параметры. Только значения-литералы.
Поэтому придётся подставлять имя как есть. Например 'SELECT '.$row.' FROM....
Однако следует понимать, что так делать можно только в случае, если $row
прилетает из "доверительной стороны", которой можно верить на 10000%. Например, в каком-то другом запросе на своём же сервере вы сами выбираете из БД (или сами формируете в коде) значение для этой переменной. Если же это значение прилетает от пользователя, то доверять такому значению нельзя категорически и стОит составить whitelist (белый список) значений, которые можно подставлять в запрос. Соответственно, надо будет предварительно проверить наличие $row
в белом списке. Если есть, то подставить в запрос как было описано выше, если нет - отклонить запрос.