2012-04-17 14 views
1

パスワードをリセットするためのユーザー名または電子メールアドレスをユーザーが入力できるテキストフィールドが1つだけあります。PHP PDO - 結果を返さないときの結果を返しますか?

まずはコードを示します(私は問題がどこにあるのか分かります)。おそらく

try { 

    // connect to database 
    $dbh = sql_con(); 

    // prepare query 
    $stmt = $dbh->prepare(" 
        SELECT COUNT(*) 
        FROM 
         users 
        WHERE 
         user_login = :username 
        OR 
         user_email = :email 
        "); 

    // execute query 
    $stmt->execute(array(':username' => $username_email, ':email' => $username_email)); 

    if ($stmt->fetchAll() > 0) { 

     // something was found 
     // just echoing at the moment until i figure out what i am doing wrong 
     echo 'i found something'; 
     exit; 

    } else { 
     // nothing found 
     echo 'i found nothing'; 
     exit; 
    } 

} 
catch (PDOException $e) { 

    ExceptionErrorHandler($e); 
    require_once($footer_inc); 
    exit; 
} 

ない私が間違っているのかわから、非常に愚かな何かが、私はそれはまだ私が何かを見つけたをエコー表示データベースにないことを知っているユーザー名または電子メールアドレスを入力してください。

誰かが私が間違っていることを教えてください。

は私がrowCountを使用するつもりだったが、PHPマニュアルによって示唆されているように、それは述べている:

はPDOStatement :: rowCountの()によって実行された最後のDELETE、INSERT、またはUPDATE文によって影響を受けた行数を返します。対応するPDOStatementオブジェクト 関連するPDOStatementによって最後に実行されたSQL文がSELECT 文の場合、一部のデータベースはその文から返された行数を返すことがあります。
ただし、この動作はすべてのデータベースで保証されるものではなく、ポータブルアプリケーションには依存しないでください。

だから、基本的にPHPのマニュアルは、私は私の本当のクエリは、結果で作業を行う前に、Count(*)を行う必要がありますと言っています。

答えて

3

あなたは多分fetchAll()が配列を返すためですif (count($stmt->fetchAll()) > 0) {

+0

ありがとうございました...上記のコードと変更されたSQLクエリを変更しました。ありがとう、phplover – PHPLOVER

3

を意味しています。クエリ結果が行を持っていない場合でも、あなたはまだ、少なくとも空の配列、そして...

php > var_dump(array() > 0); 
bool(true) 

を取得する代わりに、

if ($stmt->rowCount > 0) { ... } 

を行う必要があります。また、COUNT(*)を実行しているので、一致するものに関係なく、一致するカウントを含む1つの行結果が得られます。その1行をフェッチし、そのカウントされたフィールドの値を確認する必要があります。

+0

なぜ彼はこれを使用していないのか疑問に言及されています。だから私は投票している。 –

0

$ statement - > fetchAll()は配列を返します。それを0と比較することは意味をなさない。あなたはおそらく、$ statement - > fetchAll()から返された結果セットの要素の数をcount()しようとしていたでしょう。

関連する問題