【问题标题】:UPDATE query is not working in DBIUPDATE 查询在 DBI 中不起作用
【发布时间】:2017-02-15 23:30:30
【问题描述】:
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 条目会更改。

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

【问题讨论】:

    标签: mysql perl perl-module dbi


    【解决方案1】:

    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);
    

    【讨论】:

    • 那行得通,我会牢记这个概念!非常感谢!
    猜你喜欢
    • 2012-09-20
    • 2017-08-10
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多