2012-04-07 70 views
0

我創造了這個PHP腳本查詢SQLite數據庫像這樣:PHP的SQLite使用fetchall返回空數組

$r = $db->prepare("SELECT * FROM logs WHERE ip=?;"); 
$r->bindValue(1, $ip, PDO::PARAM_STR); 
$r->execute(); 

if($r->fetchColumn() >= 1) { 
    echo "contains columns.. <br />"; 
$result = $r->fetchAll(); 
    foreach ($result as $log) { 
     echo "in loop"; 
     $log_ip = $log['ip']; 
     $log_userAgent = $log['userAgent']; 
     $log_hits = $log['hits']; 

     $log_hits = $log_hits++; 

     echo "hits " . $log_hits; 

     $hitUp = $db->prepare("UPDATE logs SET hits = ? WHERE ip = ?;"); 
     $hitUp->bindValue(1, $log_hits, PDO::PARAM_INT); 
     $hitUp->bindValue(2, $ip, PDO::PARAM_STR); 
     $hitUp->execute(); 
} 

然而,$r->fetchAll();將返回一個空數組。

我100%肯定該行存在,$ IP爲127.0.0.1:

sqlite> select * from logs; 
1|127.0.0.1|1|Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.54.16 (KHTML, like Gecko) Version/5.1.4 Safari/534.54.16 

任何幫助是極大的讚賞

+0

如果你刪除'WHERE IP =?',你還會得到一個空數組嗎? – 2012-04-07 08:10:19

+0

@sixfeetsix是的。 :\ – Daniel 2012-04-07 08:11:01

+0

如果我運行SELECT * FROM日誌;在sqlite3中它返回正確的行,但在pdo/php中沒有? – Daniel 2012-04-07 08:17:41

回答

2

你可能需要刪除if($r->fetchColumn() >= 1),因爲它可能consumes your single result

返回結果集的下一行中的單個列或FALSE如果 沒有更多行。

此外,您不應該懷疑您至少有一列,而應該驗證$result是否爲空。

也許嘗試通過運行像這樣:

$r = $db->prepare("SELECT * FROM logs;"); 
$r->execute(); 
$result = $r->fetchAll(); 
echo "result contains " . count($result); 

如果你仍然得到您的陣列中0的記錄,也許有不對的更上游。讓我知道你是否還有0記錄。