0

我有一个包含国家的 MySQL 数据库

编号 | 德 | zh | FR   
---------------------------------------------
 1 | 阿富汗 | 阿富汗 | 阿富汗
 2 | 阿尔巴尼亚 | 阿尔巴尼亚 | 奥尔巴尼
...

我想根据访问者的语言获取国家/地区列表。

这是我课堂上的方法:

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
    )

如果您对问题可能出在哪里有任何想法,我很高兴知道:)

预先感谢您的帮助。

4

1 回答 1

1

您不能使用准备好的语句来设置查询中的列或表的名称,您只能使用它们来注入值。您必须使用字符串插值

不要忘记应用彻底的验证来防止 SQL 注入漏洞。

于 2018-11-21T13:52:19.083 回答