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
条目会更改。
知道怎么解决这个问题吗?
答案 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);