22

我在运行类似于以下示例的代码时遇到了问题:

my $rows = $dbh->do('UPDATE table SET deleted=NOW() WHERE id=?', undef, $id) 
  or die $dbh->errstr;
if (!$rows) {
  # do something else
}

由于文档状态do返回受影响的行数,我认为这会起作用。

准备并执行单个语句。返回受影响或undef出错的行数。返回值-1表示行数未知、不适用或不可用。

事实证明,我错了。当我调试它时,我看到它$rows实际上包含 string 0E0,这当然是一个真实的值。我进一步挖掘了文档并看到了这段代码:

默认的 do 方法在逻辑上类似于:

  sub do {
      my($dbh, $statement, $attr, @bind_values) = @_;
      my $sth = $dbh->prepare($statement, $attr) or return undef;
      $sth->execute(@bind_values) or return undef;
      my $rows = $sth->rows;
      ($rows == 0) ? "0E0" : $rows; # always return true if no error
  }

它在那里。它返回0E0。我只是不明白为什么它会那样做。有人知道吗?

4

1 回答 1

28

这是一个真值,因此您可以将其与错误时返回的假值区分开来,但它在数值上等于零(没有警告),因此它仍然等于受影响的记录数。

$ perl -e'
   for (undef, "0E0", 4) {
      if ($_) {
         printf "Success: %d rows affected\n", $_;
      } else {
         print "Error!\n";
      }
   }
'
Error!
Success: 0 rows affected
Success: 4 rows affected

如果0在没有记录受到影响的情况下成功返回,您将被迫使用 来检查错误defined,这远不如测试真相方便(例如foo() or die;)。

其他真零。(忽略"0x0";它会发出警告。)

于 2012-11-13T10:10:12.057 回答