更新查询在 DBI 中不起作用

UPDATE query is not working in 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";

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

知道如何解决这个问题吗?

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

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

String literals are usually delimited by either single or double quotes. They work much like quotes in the standard Unix shells: double-quoted string literals are subject to backslash and variable substitution; single-quoted strings are not (except for \' and \ ).

此外,您应该在 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);