无法在 SELECT 字段名称中使用 BindValue?
Impossible to use BindValue in the SELECT field names?
我有一个包含国家
的MySQL数据库
id | de | en | fr
---------------------------------------------
1 | Afghanistan | Afghanistan | Afghanistan
2 | Albanien | Albania | Albanie
...
我想根据访问者的语言获取国家/地区列表。
这是我 class 中的方法:
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();
}
它returns一个数组,但是国家名称被语言替换了。
似乎 bindValue 正在为我的变量添加引号,这在 ORDER BY 中很好,但在我想要的字段中产生了问题 SELECT。
$countryManager->getList('fr');
returns 像这样
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
)
如果您知道问题出在哪里,我会很高兴知道:)
预先感谢您的帮助。
您不能使用准备好的语句来设置查询中的列或表的名称,您只能使用它们来注入值。你必须使用字符串插值
不要忘记应用彻底的验证来防止 SQL 注入漏洞。
我有一个包含国家
的MySQL数据库id | de | en | fr --------------------------------------------- 1 | Afghanistan | Afghanistan | Afghanistan 2 | Albanien | Albania | Albanie ...
我想根据访问者的语言获取国家/地区列表。
这是我 class 中的方法:
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();
}
它returns一个数组,但是国家名称被语言替换了。
似乎 bindValue 正在为我的变量添加引号,这在 ORDER BY 中很好,但在我想要的字段中产生了问题 SELECT。
$countryManager->getList('fr');
returns 像这样
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
)
如果您知道问题出在哪里,我会很高兴知道:)
预先感谢您的帮助。
您不能使用准备好的语句来设置查询中的列或表的名称,您只能使用它们来注入值。你必须使用字符串插值
不要忘记应用彻底的验证来防止 SQL 注入漏洞。