Невозможно использовать 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-инъекций.