在使用perl将值插入数据库表之前,我已经多次使用以下代码
my $SRV='xxx';
my $DB='dbname';
my $db = DBI->connect("dbi:Oracle:$SRV/$DB", "user", "pword" ) or die "impossible de se connecter à $SRV / $DB";
my $insert_T1 = "INSERT INTO tablename (ColA, ColB) VALUES ( ?, ?) " ;
my $insert_T1_sth = $db->prepare($insert_T1) ;
稍后在代码中,我可以调用以下代码进行插入
$insert_T1_sth->execute('val1','val2');
$insert_T1_sth->execute('val3','val4');
因此,基本上,当我使用上面的prepare函数时,可以用问号替换要插入的条目,然后将这些问号的值放在稍后的execute语句中。
对于我的问题:我可以在问准备语句中使用问号代替列名吗?我没有考虑,因为当我尝试以下操作时,在执行语句所在的行上出现运行时错误。
my $SRV='xxx';
my $DB='dbname';
my $db = DBI->connect("dbi:Oracle:$SRV/$DB", "user", "pword" ) or die "impossible de se connecter à $SRV / $DB";
$db->{AutoCommit} = 0 ;
my $insert_T1 = "INSERT INTO tablename (ColA, ?) VALUES ( ?, ?) " ;
my $insert_T1_sth = $db->prepare($insert_T1) ;
然后像以前一样使用
$insert_T1_sth->execute('colname1','val1','val2');
$insert_T1_sth->execute('colname2','val3','val4');
答案 0 :(得分:2)
您不能像尝试那样在prepare
中使用动态列名。
您的用户不应该知道您的列名,因此,由于它们不敏感(因此不需要防止SQL注入),因此实际上不必将其作为参数的一部分。不过,准备对表演仍然有用。
我建议为每个列名称做一个准备,并将它们存储在哈希中:
my @col_names = qw(colname1 colname2);
my %inserts;
for my $col (@col_names) {
$inserts{$col} = $db->prepare("INSERT INTO tablename (ColA, $col) VALUES (?, ?)");
}
...
$inserts{colname1}->execute('val1', 'val2');