如何在perl中绑定表名的值?
Posted
技术标签:
【中文标题】如何在perl中绑定表名的值?【英文标题】:How to Bind value of table name in perl? 【发布时间】:2013-01-22 15:18:16 【问题描述】:这里我正在尝试为特定查询绑定表名:
$sth = $dbh->prepare("SELECT id FROM ? WHERE service_id = ?");
和执行语句:
$sth->execute($table_name,$service_id);
它给出了一个 SQL 错误,为什么会这样?
有什么方法可以将表名绑定到特定查询?
【问题讨论】:
不可能。尝试动态查询。 【参考方案1】:您可以在 SQL 表达式中使用查询参数代替 文字值。
即,在您通常会使用带引号的字符串文字或带引号的日期文字或数字的地方。
参数不能用于表名、列名、值列表(如 IN 子句)、SQL 关键字或 SQL 表达式。
要使表的名称动态化,您必须在准备它之前将其插入到 SQL 查询字符串中:
my $table_name_lit = $dbh->quote_identifier($table_name);
my $sth = $dbh->prepare("SELECT id FROM $table_name_lit WHERE service_id = ?");
$sth->execute($service_id);
注意$table_name
不包含任何不受信任的内容。最好的方法是将$table_name
与已知表名列表进行比较。换句话说,使用一个固定的表列表作为白名单。如果$table_name
与您的任何表名都不匹配,则使用默认表名。
【讨论】:
谢谢,我只是想用爆炸的方式来做,无论如何我会让表格的名称动态化。 修复表名需要转义字符的问题。 @ikegami,值得一提的是,php 的 mysql 扩展都没有 quote_identifier() 函数。【参考方案2】:@Karwin 响应正常,还有关于 sql 注入问题的说明。在插入 SELECT 字符串之前,您应该检查 $table_name 是否包含有效的表名。例如,如果您使用 MySQL,您可以通过以下方式获取在 DB 中设置的当前表名:
my @tables = @ $dbh->selectcol_arrayref('SHOW TABLES') ;
并且很容易使用“grep”检查 $table_name 是否包含正确的值。也可以(并且独立于数据库)使用tables method of DBI 获取表目录。
【讨论】:
以上是关于如何在perl中绑定表名的值?的主要内容,如果未能解决你的问题,请参考以下文章
在 SSMS 中,如何使用在 KEY 字 FROM 后返回表名的函数