运行代码时遇到一个问题,类似于以下示例:
my $rows = $dbh->do('UPDATE table SET deleted=NOW() WHERE id=?',undef,$id) or die $dbh->errstr; if (!$rows) { # do something else }
自从docs状态确定返回的行数受影响,我以为会工作.
Prepare and execute a single statement. Returns the number of rows
affected orundef
on error. A return value of-1
means the number of
rows is not known,not applicable,or not available.
事实证明,我是错误的.当我调试它,我看到$rows实际上保存字符串0E0,这当然是一个true-ish值.我进一步挖掘文档,看到这段代码:
The default do method is logically similar to:
06001
在那里它返回0E0.我只是不明白为什么会这样做.有人知道吗?
解决方法
这是一个真正的价值,因此您可以将其与误差返回的虚假值进行区分,但数值等于零(无警告),因此它仍等于受影响的记录数.
$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,那么您将被迫使用定义来检查错误,这比检测真实(foo()或die)方便得多.
Other true zeroes.(忽略“0x0”;它警告.)