2014-04-23 29 views
0

我试图执行此:我可以使用列的名称作为PDO中的参数吗?

$colparam = 'abcd'; 
$stmt = $db->prepare("SELECT DISTINCT ? AS kol FROM katalog ORDER BY kol ASC"); 
$stmt->execute(array($colparam)); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

和它不工作(没有错误,只是空数组作为结果)。

相反这工作得很好:

$stmt = $db->prepare("SELECT DISTINCT abcd AS kol FROM katalog ORDER BY kol ASC"); 
$stmt->execute(); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

那么,有没有在使用的参数为PDO列的名字任何收获?

+0

有没有什么好的理由,你为什么要这么做呢?动态访问列通常会指示错误的数据库设计。你能详细谈谈你想达到的目标吗? – thpl

+0

我需要一个包含每列下拉的菜单,所以我正在考虑让每个下拉菜单都有单独的功能。由于下拉菜单的位置发生变化,我无法一次完成所有下拉菜单。 – mrserge

+0

,你存储它吗? '菜单(id,choice1,choice2,choice3,...)' – thpl

回答

4

不,您不能在MySQL中为任何数据库对象(表,列等)使用参数替换。

当你思考准备好的陈述究竟是什么时,这是完全合理的。当MySQL甚至不知道涉及的数据库对象时,如何准备查询执行计划。

我当然希望更多的文档实际上涵盖了准备好的语句实际上做了什么(超出了它明显用于参数化)。

这里是链接到MySQL准备好的语句文档以获取更多阅读:

https://dev.mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html

+0

是否有任何解决方法将值作为PDO中列的名称传递,或者仅在默认情况下禁用? – mrserge

+1

@mrserge。不,没有。 PDO将参数视为值并将引用它们。列名是否由用户输入提供? – Devon

+2

您可以手动构建您的语句字符串,如:$ db-> prepare(“SELECT”。$ col。“FROM ...”),但此值不会被参数化,您必须手动转义该值以防止SQL注射,除非你知道弦是安全的。 –

相关问题