update查询在dbi中不起作用

hjqgdpho  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(293)
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 数据库中的条目发生更改。
你知道怎么解决这个问题吗?

2w2cym1i

2w2cym1i1#

perl不会在单引号字符串中展开变量。
http://perldoc.perl.org/perldata.html#scalar-价值建设者部分地说:
字符串文字通常用单引号或双引号分隔。它们的工作方式与标准unixshell中的引号非常相似:双引号字符串文本要接受反斜杠和变量替换;单引号字符串不是(除了'和\)。
您还应该在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);

相关问题