1

ログイン システムをセットアップしようとしていますが、データベースへの PDO 呼び出しから返された行数を確認するのに問題があります。次のコードは、不正なユーザー名やパスワードが指定された場合に 0 行を返すはずですが、パスワードやユーザー名に関係なく 1 行を返すようです。

require_once("includes/database.php");
session_start();
$dbh = db_connect();
$response = array();

$user = $_POST['username'];
$password = $_POST['password'];

$check_login = "SELECT * FROM user WHERE user=:user AND password=:password LIMIT 1";
$check_login_stmt = $dbh->prepare($check_login);
$check_login_stmt->bindParam(":user", $user);
$check_login_stmt->bindParam(":password", $password);

if(!$check_login_stmt->execute()) {
    $response['code'] = "failure";
    $response['err'] = $check_login_stmt->errorInfo();
    $response['reason'] = "bad_query";
} else {
    if(count($user = $check_login_stmt->fetch()) > 0) {
        $_SESSION['login'] = true;
        $_SESSION['pb_committee'] = $user['pb_committee'];
        $response['code'] = "success";
        $response['count'] = count($user);
    } else {
        $response['code'] = "failure";
        $response['reason'] = "bad_reqs";
    }
}

echo json_encode($response);

count($user = $check_login_stmt->fetchAll()) > 0 を実行すると動作します。しかし、その理由がわかりません。SELECT ステートメントで fetch() を 1 行に制限しているため、むしろ fetch() を使用したいと思います。

どんな提案でも大歓迎です。

4

2 に答える 2

0

渡されcount()たものは、まだ配列になっていないものはすべて、配列にキャストされます。ほとんどの場合、これによりcount()返されます1NULL現在考えられる唯一の例外です)。

とはいえ、配列以外を取得している可能性があるため、PDOfetch modeを確認する必要があります。これにより、説明されている動作が発生します。

于 2012-09-18T23:36:07.287 に答える
0

count($nonArrayVariable)ができるかは保証できませんが、おそらくこれでより良い時間を過ごせるでしょう:

} else {
   if ($check_login_statement->rowCount() > 0) {
      $user = $check_login_stmt->fetch()
      // etc.
   }

は不要であることに注意してください> 0

また、DB にパスワードを平文で保存しないでください。

于 2012-09-18T23:26:12.177 に答える