1

我有这个改变 MySQL 数据库数据的 perl 脚本,每次运行它都会出现以下错误

 Use of uninitialized value in addition (+) at ./cdr_db.pl-m line 88.

查看第 80 到 88 行的代码

### archive cdr records
    $sth = $dbh2->prepare(
        "SELECT max($tablename2_archive.EventID) from $tablename2_archive")
      or die "Couldn't prepare statement: " . $dbh->errstr;
    $sth->execute()
      or die
"Database error trying to poll $tablename2_archive.EventID for archive use: "
      . $sth->errstr . "\n";
    my $nextEventID = $sth->fetchrow_array + 1;

这是完整的脚本

http://pastebin.com/4hmaS3b9

我只是不明白错误是什么。

4

1 回答 1

3

fetchrow_array返回一个值列表,如果没有更多行要获取,则该列表为空。

将一个添加到列表中是不好的 Perl 风格,但它具有使用列表的最后一个元素的效果,这是您在这里想要的,因为应该只有一个返回值。

就目前而言,fetchrow_array可能会返回一个空列表或以 . 结尾的列表undefundef两者都会像加法一样进行评估。第一个是最有可能的,我猜你想在没有前一EventID列的情况下将记录添加到空表中?

你应该写

$sth->execute;
my @row = $sth->fetchrow_array;
die "No results returned" unless @row;
my $nextEventID = $row[0] + 1;

或者绑定您正在获取的列会更好(并且更快,因为它的价值)

my $eventID;

$sth->execute;
$sth->bind_columns(\$eventID);
$sth->fetch;
die "No results returned" unless defined $eventID;
my $nextEventID = $eventID + 1;

但是在进行算术运算之前,您仍然需要检查是否$eventIDundef

最后。对不起,这太啰嗦了,你应该创建EventIDNOT NULL,这样你就可以确定一个值undef表示没有找到任何行,你应该使用 MySQL 的AUTO_INCREMENT列属性,这样你就不必计算自己身份证。声明看起来像

EventID INT NOT NULL AUTO_INCREMENT

当您编写INSERT INTO.

我希望这有帮助。

于 2013-07-08T14:51:56.697 回答