我有这个改变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;
这是完整的脚本
我只是不知道错误是什么。
答案 0 :(得分:3)
fetchrow_array
返回值的列表,如果没有更多行要提取,则为空。
在列表中添加一个是错误的Perl样式,但它具有使用列表的 last 元素的效果,这是您想要的,因为应该只有一个返回值。
目前,fetchrow_array
可以返回空列表或以undef
结尾的列表。在添加中,两者都将评估为undef
。第一个是最有可能的,我猜你正在尝试将记录添加到空表中,而之前没有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;
但在进行算术运算之前,您仍需检查$eventID
是否为undef
。
最后。抱歉,这是如此冗长,你应该EventID
列NOT NULL
,以便确保undef
的值表示没有找到任何行,你应该使用MySQL AUTO_INCREMENT
列属性,以便您不必自己计算ID。声明看起来像
EventID INT NOT NULL AUTO_INCREMENT
,当您编写INSERT INTO
时,您只需省略该列的值。
我希望这会有所帮助。