我有这个PHP函数获取当前登录用户的数据,如果访问者未登录,或者user_id和password_hash cookie无效,则返回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,所以任何指针都会非常感激。
答案 0 :(得分:1)
您已使用fetchAll()
获取所有结果。结果集因此耗尽,您无法从中获取任何更多结果。您只需要$q->rowCount()
计算行或将fetchAll()
返回的数组保存到某处并稍后再使用。
答案 1 :(得分:0)
如上所述,你不能使用fetchAll然后在一次查询后获取;但是rowCount不能用于select。解决方案可以是:
使用fetchAll:
在数组中得到结果$results=$q->fetchAll()
然后您可以获取并使用或检查号码,例如:
echo count( $results);
获取并使用结果,例如:
foreach ($results as $result)
{
var_dump($result);
}