UPDATE查询在DBI中不起作用

时间:2016-10-07 04:07:27

标签: mysql perl perl-module dbi

use DBI;

my $jobID = 1;

$dbh = DBI->connect("dbi:mysql:$database:$db_server", $user, $password) or die "Connection ERROR!";
$dbh->do('USE MultiRunScheduler');
$dbh->do('UPDATE Scheduler SET RequestStatus="CANCELED" WHERE ID="$jobID";')
print "Scheduled Jobs deleted";

我正在尝试更改基于RequestStatus的数据库的ID字段,但它没有通过UPDATE语句。它打印出Scheduled Jobs deleted并且整个程序成功运行但它不更新数据库RequestStatus字段。如果我删除ID="$jobID"并将其更改为ID=1,则数据库中的RequestStatus条目会更改。

知道怎么解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

Perl不会在单引号字符串中扩展变量。

http://perldoc.perl.org/perldata.html#Scalar-value-constructors部分说:

  

字符串文字通常由单引号或双引号分隔。它们的工作方式与标准Unix shell中的引号非常相似:双引号字符串文字受反斜杠和变量替换;单引号字符串不是('和\)除外。

此外,您应该在SQL中使用单引号作为字符串分隔符。

所以这个:

$dbh->do('UPDATE Scheduler SET RequestStatus="CANCELED" WHERE ID="$jobID";')

应该是这样的:

$dbh->do("UPDATE Scheduler SET RequestStatus='CANCELED' WHERE ID='$jobID'");

如果您想真正使用最佳实践,请在SQL中使用绑定参数,而不是将变量放在字符串中。那么你不必担心你使用什么样的报价。即使参数是字符串类型,也不要将参数占位符放在SQL中的引号中。

示例:

$dbh->do("UPDATE Scheduler SET RequestStatus='CANCELED' WHERE ID=?", undef, $jobID);