fetchrow()后使用未初始化的值

时间:2014-11-24 17:35:28

标签: sql perl sqlite

我正在跑步:

my $config = "";
my $dsn = "dbi:SQLite:dbname=test.db";
my $dbh = DBI->connect(          
    $dsn, 
    "",
    "",
    { RaiseError => 1}
) or die $DBI::errstr;

my $sth = $dbh->prepare("SELECT config FROM tests WHERE status=1");
$sth->execute();    
my $config = $sth->fetchrow();
if($config ne "")
{
    print "found!"
}
$sth->finish();
$dbh->disconnect();

为什么我

Use of uninitialized value $config in string ne at .....

1 个答案:

答案 0 :(得分:3)

没有记录fetchrow。您应该使用fetchrow_array代替。

问题是DBI为数据库中设置为undef的值返回值NULL。因此my $config = $sth->fetchrow_array$config设置为undef 如果表中找不到匹配的行,如果找到的行有NULL的值为config。这意味着它不能用于测试表中是否存在任何匹配的行。此外,您无法比较undef值,就好像它是一个字符串一样 - 它会引发您看到的错误

Use of uninitialized value $config in string ne

因此您需要测试fetchrow_array是否返回空列表,或者fetchrow_arrayref是否返回未定义的值。

您的代码应该是

my @config = $sth->fetchrow_array;
if (@config) {
    print "found!"
}

my $config = $sth->fetchrow_arrayref;
if (defined $config) {
    print "found!"
}