2012-10-15 157 views
0

我有這個PHP函數獲取當前登錄的用戶的數據,或者如果訪問者沒有登錄,或者具有無效的user_id和password_hash cookie,則返回false。由於某種原因,$q->fetch()總是返回FALSE。PHP PDO獲取類返回FALSE

if($_COOKIE['cuid']!='' && $_COOKIE['cuph']!='') 
{ 
    try 
    { 
     $q = $db->prepare('SELECT * FROM users WHERE user_id = ? AND password = ?'); 
     $data = array($_COOKIE['cuid'], $_COOKIE['cuph']); // id and password hash 
     $q->execute($data); 
     $num = count($q->fetchAll()); // in my case, $num is set to 1 
     if($num == 1) 
     { 
      $q->setFetchMode(PDO::FETCH_CLASS, 'User'); 
      $user = $q->fetch(); // $user is set to FALSE for some reason 
      return $user; 
     } else { 
      return FALSE; 
     } 
    } 
    catch(Exception $e) 
    { 
     $db->rollBack(); 
     echo 'Error: ' . $e->getMessage(); 
    } 
} else { 
    return FALSE; 
} 

運行與準確的數據,而不是在查詢中的佔位符不會改變任何東西,直接在我的數據庫運行查詢返回1行,像它應該。我檢查,$ num確實等於1.我不知道爲什麼$q->fetch()返回FALSE,所以任何指針將非常感激。

回答

1

您已使用fetchAll()獲取所有結果。結果集因此耗盡,您無法從中獲取更多結果。您只需要$q->rowCount()來計算行將某個地方的fetchAll()返回的數組保存並稍後使用。

+1

完美,謝謝! 另外,在大多數情況下,$ q-> rowCount()僅適用於DELETE,INSERT和UPDATE語句,因此它不是最可靠的選項。 – Fang

0

如上所述,您不能在一次查詢後使用fetchAll然後提取;但rowCount不能用於選擇。一個解決方案可以是:

$results=$q->fetchAll() 

然後你就可以得到並使用或檢查的次數,例如:

echo count($results); 

並獲得和工作

您在使用fetchall陣列得到的結果結果,例如:

foreach ($results as $result) 
{ 
    var_dump($result); 
}