Как передать имя выбираемого поля в 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 в белом списке. Если есть, то подставить в запрос как было описано выше, если нет - отклонить запрос.

→ Ссылка