0

現在ログインしているユーザーのデータを取得するこの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に等しいのです。なぜFALSEが返されるのかわからない$q->fetch()ので、ポインタをいただければ幸いです。

4

2 に答える 2

1

を使用して、すでにすべての結果を取得していますfetchAll()。これにより、結果セットが使い果たされ、それ以上結果をフェッチできなくなります。$q->rowCount()行を数えるfetchAll()、どこかで返された配列を保存して後で使用するだけです。

于 2012-10-15T12:52:52.613 に答える
0

前述のように、fetchAllを使用して、1つのクエリの後にフェッチすることはできません。ただし、rowCountを選択に使用することはできません。解決策は次のとおりです。

fetchAllを使用して配列に結果を取得します。

$results=$q->fetchAll()

次に、番号を取得して使用または確認できます。次に例を示します。

echo count( $results);

そして、結果を取得して操作します。たとえば、次のようになります。

foreach ($results as $result)
{
   var_dump($result);
}
于 2014-09-26T20:44:36.440 に答える