2012-10-15 199 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); 
}