如何使用mysql将存储的变量作为数据库传递?

时间:2016-11-15 06:05:38

标签: perl

我有以下代码,我需要将变量作为数据库传递。是否可以将变量作为数据库传递?

我的变量:

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();

1 个答案:

答案 0 :(得分:0)

您的问题的答案是"是"。您可以在字符串中使用变量,它们将成功扩展。但我怀疑你知道在使用它之前打印$stmt的内容。

传递给do方法的字符串和分配给$stmt变量的字符串都只是标准的Perl字符串。 DBI对他们没有什么不寻常之处。它们的工作方式与其他Perl字符串完全相同。

但是,鉴于您提出的问题,我认为它没有按照您的怀疑工作,而您忘记告诉我们您所看到的意外行为。我可以看到一个可能的问题,即在到达程序的这一部分之前,您的两个数据库名称变量可能未设置为您期望的值。我也尝试打印这些,只是为了确保它们设置正确。

两个建议(不一定能解决您的,未指明的问题但会提高代码质量):

  • 我很少看到人们在DBI代码中运行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注入攻击),而且更容易阅读。请注意,我还添加了错误消息。