我有以下代码,我需要将变量作为数据库传递。是否可以将变量作为数据库传递?
我的变量:
my $num_site = join('_', 'rate', $site, '1m');
my $num_site1=join('_','rate',$site,'current');
我的代码:
这里我试图传递变量而不是直接给出数据库。我可以按照这个方法直接在do连接中传递变量而不是数据库名吗?请帮我传递变量($ num_site)和($ num_site1)在数据库里面?
$DBH=DBI->connect($database) or die "cannot connect to the sql server\n";
$DBH->do("USE $num_site");(can i use the variable like this to fetch the database).
#$DBH->do("use rate_bangalore_1m");
$stmt = "INSERT INTO $num_site.m_status(time,available,closed,used,busy,reserved,down) VALUES(\"$current_time\",\"$ma{'D'}\",\"$ma{'B'}\",\"$ma{'A'}\",\"$ma{'C'}\",\"$ma{'R'}\",\"$ma{'+'}\")";
print "\n $stmt \n";
my $sth = $DBH->prepare( $stmt );
$sth->execute() or print "Could not insert data";
$sth->finish;
$DBH->disconnect();
答案 0 :(得分:0)
您的问题的答案是"是"。您可以在字符串中使用变量,它们将成功扩展。但我怀疑你知道在使用它之前打印$stmt
的内容。
传递给do
方法的字符串和分配给$stmt
变量的字符串都只是标准的Perl字符串。 DBI对他们没有什么不寻常之处。它们的工作方式与其他Perl字符串完全相同。
但是,鉴于您提出的问题,我认为它没有按照您的怀疑工作,而您忘记告诉我们您所看到的意外行为。我可以看到一个可能的问题,即在到达程序的这一部分之前,您的两个数据库名称变量可能未设置为您期望的值。我也尝试打印这些,只是为了确保它们设置正确。
两个建议(不一定能解决您的,未指明的问题但会提高代码质量):
USE
语句。这是因为您可以将数据库设置为DBI连接字符串的一部分。请参阅文档中的SYNOPSIS。请不要将列值直接放入SQL中。而是使用绑定点和额外参数到execute()
方法。像这样:
$stmt = "INSERT INTO $num_site.m_status
(time, available, closed, used, busy, reserved, down)
VALUES
(?, ?, ?, ?, ?, ?, ?)";
my $sth = $DBH->prepare($stmt);
$sth->execute($current_time, $ma{D}, $ma{B}, $ma{A},
$ma{C}, $ma{R}, $ma{'+'})
or die $sth->errstr;
这不仅更安全(它可以保护您免受SQL注入攻击),而且更容易阅读。请注意,我还添加了错误消息。