2014-11-24 92 views
0

我運行:使用未初始化值的fetchrow後()

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 ..... 
+0

打開;'和'使用警告;'。可能'fetchrow'正在返回undef。爲什麼你測試它是一個空字符串呢? – Sobrique 2014-11-24 17:41:04

+0

我加入'use strict;使用警告;使用DBI;'到我的代碼 – 2014-11-24 17:42:04

+1

數據庫中的'config'爲空嗎? – AKHolland 2014-11-24 17:42:13

回答

3

沒有記載fetchrow。您應該使用fetchrow_array

問題是,DBI返回值undef設置爲NULL在數據庫中的值。所以my $config = $sth->fetchrow_array$configundef要麼是否有表,如果發現該行有一個configNULL值找不到匹配的行。這意味着它不能用於測試表中是否有任何匹配的行。此外,你不能比較的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!" 
} 
+0

這不起作用。雙方再次給了我同樣的錯誤 – 2014-11-24 17:49:11

+1

這不可能是真的:第一個例子沒有'$ config' – Borodin 2014-11-24 17:50:42

+1

'作爲'fetchrow_array'別名fetchrow'工作正常。在啓用警告的情況下針對字符串檢查未定義的值是他的問題。 – AKHolland 2014-11-24 17:50:42