Невозможно использовать BindValue в именах полей SELECT?

У меня есть база данных MySQL, содержащая страны

id | де | en | фр   
--------------------------------------------- 
 1 | Афганистан | Афганистан | Афганистан
 2 | Албаниен | Албания | Albanie...

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

Вот метод в моем классе:

public function getList($language){
    $countries = array();
    $req = ('SELECT id, :language FROM country ORDER BY :language ASC');        
    $q = $this->_db->prepare($req);
    $q->bindValue(':language', $language, \PDO::PARAM_STR);
    $q->execute();
    while ($data = $q->fetch(\PDO::FETCH_ASSOC)) {
        $countries[] = new Country($data);
    }
    return $countries;
    $q->closeCursor();
}

Возвращает массив, но названия стран заменяются языком.

Кажется, bindValue добавляет к моей переменной кавычки, что нормально в ORDER BY, но создает проблемы в полях, которые я хочу ВЫБРАТЬ.

$countryManager->getList('fr');

возвращает что-то вроде этого

Array
(
[0] => Entities\Country Object
    (
        [id:Entities\Country:private] => 1
        [de:Entities\Country:private] =>  
        [en:Entities\Country:private] => 
        [fr:Entities\Country:private] => fr
    )

[1] => Entities\Country Object
    (
        [id:Entities\Country:private] => 2
        [de:Entities\Country:private] => 
        [en:Entities\Country:private] => 
        [fr:Entities\Country:private] => fr
    )

Если у вас есть идеи, где может быть проблема, я был бы очень рад узнать:)

Спасибо заранее за вашу помощь.

1 ответ

Решение

Вы не можете использовать подготовленные операторы для установки имен столбцов или таблиц в запросе, вы можете использовать их только для ввода значений. Вам придется использовать интерполяцию строк

Не забудьте применить тщательную проверку для предотвращения уязвимостей SQL-инъекций.

Другие вопросы по тегам