更新查询在 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);
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);