次の例のようなコードを実行すると、問題が発生しました。
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
、実際には文字列を保持していることが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
。なぜそんなことをするのか、私にはわかりません。誰か知っていますか?