-1

以前にも同様の質問をしましたが、今は答えに近づいていると思います。

ユーザーがプロファイルにログインする前に、ユーザーの電子メール アドレスとパスワードを検証する機能があります。

電子メールが正しくない場合、エラー メッセージが生成されます。「一致するメールが見つかりません」と表示されます。

正しい電子メールとパスワードを入力しても、何も返されません。しかし、間違ったパスワードと間違った電子メールを入力すると、「一致する電子メールが見つかりません」と表示されます。同じことが、正しい電子メールでも間違ったパスワードでも発生します。

fetchAllandで戻ろうとしましたfetchColumが、正しい値を入力しても同じループが発生します。

何か案は ?

function valid_credientials($email,$password){
    global $db;

    $q = "SELECT * FROM user WHERE email = :email AND password =:password";
    $query = $db->prepare($q);
    $query->execute(array(":email" => $email, ":password" => $password));
    $results = $query->fetchAll();

    if($results !=FALSE && $query->rowCount() > 0) {
       if($results[0]['password'] == $password){
            $_SESSION['email'] = $email;
            return $query->fetchAll($q,0)==1 ? true:false;
        }
    }

    // return false by default
    return false;
}

投稿が設定されています

if (isset($_POST['email'], $_POST['password'])) {
    if (valid_credientials($_POST['email'], $_POST['password']) == false) {
        $errors[] = 'No matching email found.';
    }

    if (empty($errors)) {
        $_SESSION['email'] = htmlentities($_POST['email']);
        header("Location: profile.php");
        die();
    }
}
4

2 に答える 2

2

return false;デフォルトのステートメントを追加する必要があります。

function valid_credientials($email,$password){
    global $db;

    $q = "SELECT * FROM user WHERE email = :email AND password =:password";
    $query = $db->prepare($q);
    $query->execute(array(":email" => $email, ":password" => $password));
    $results = $query->fetchAll();

    if($results !=FALSE && $query->rowCount() > 0) {
       if($results[0]['password'] == $password){
            $_SESSION['email'] = $email;
            return $query->fetchAll($q,0)==1 ? true:false;
        }
    }

    // return false by default
    return false;
}

ところで、コードのインデントはあなたの友達です ;)

ただし、これはより安定するように最適化できます。

function valid_credientials($email,$password){
    global $db;

    $q = "SELECT * FROM user WHERE email = :email AND password =:password";
    $query = $db->prepare($q);
    if(!$query) {
        throw new Exception('Failed to prepare the query');
    }

    $ret = $query->execute(array(":email" => $email, ":password" => $password));
    if(!$ret) {
        throw new Exception('Failed to execute the query');
    }

    $results = $query->fetchAll();
    if($results === FALSE) {
        throw new Exception('Failed to fetch results');
    }

    if(count($results) > 0) {
        // additional password check is not necessary
        return true;
    }

    // return false by default
    return false;
}
于 2013-04-13T13:06:07.983 に答える
0

なぜそんなに多くのコードを書くのかわかりません

function valid_credientials($email,$password){
    global $db;

    $q = "SELECT 1 FROM user WHERE email = ? AND password = ?";
    $query = $db->prepare($q);
    $query->execute(func_get_args());
    return $query->fetchColumn();
}
于 2013-04-13T13:08:23.007 に答える