PHP PDO获取类返回FALSE

PHP PDO获取类返回FALSE,php,pdo,Php,Pdo,我有一个PHP函数,它获取当前登录用户的数据,如果访问者未登录,或者用户id和密码无效,则返回false。由于某些原因,$q->fetch()总是返回FALSE if( $_COOKIE['cuid']!='' && $_COOKIE['cuph']!='' ) { try { $q = $db->prepare( 'SELECT * FROM users WHERE user_id = ? AND password = ?' );

我有一个PHP函数,它获取当前登录用户的数据,如果访问者未登录,或者用户id和密码无效,则返回false。由于某些原因,
$q->fetch()
总是返回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,因此任何指针都将非常感谢。

您已经使用
fetchAll()
获取了所有结果。结果集因此已耗尽,您无法从中获取更多结果。您只需要
$q->rowCount()
对行进行计数,或者将
fetchAll()
返回的数组保存在某个位置,稍后再使用它。

如前所述,您不能在一次查询后使用fetchAll-then-fetch;但行计数不能用于select。解决方案可以是:

使用fetchAll在数组中获得结果:

$results=$q->fetchAll()
然后您可以获取并使用或检查号码,例如:

echo count( $results);
foreach ($results as $result)
{
   var_dump($result);
}
获取并处理结果,例如:

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

太好了,谢谢!另外,$q->rowCount()在大多数情况下仅适用于DELETE、INSERT和UPDATE语句,因此它不是最可靠的选项。