首页 > 解决方案 > 为什么这个 PHP 登录脚本不起作用?

问题描述

我希望用户从此登录页面登录到他的帐户。它应该根据用户是否将字段留空、登录条件不正确或详细信息是否正确来执行不同的操作。但它一直给出“登录失败,请重试”的响应。有人可以帮我解决这个问题吗?

<?php
include_once("db_con.php");
if(isset($_POST['e'])) {
$e = mysqli_real_escape_string($db_con, $_POST['e']);
$p = mysqli_real_escape_string($db_con, $_POST['p']);
$p_hash = password_hash($p, PASSWORD_DEFAULT);
if($e == "" || $p == ""){
    echo "login_failed";
    exit();
} else {
    $sql = "SELECT id, username, password FROM users WHERE email='$e' LIMIT 
1";
    $login_query = mysqli_query($db_con, $sql);
    $row = mysqli_fetch_array($login_query, MYSQLI_ASSOC);
    $db_id = $row["id"];
    $db_username = $row["username"];
    $db_pass_str = $row["password"];
    if($p_hash != $db_pass_str){
        echo "login_failed";
        exit();
    }
        else {
        // CREATE THEIR SESSIONS AND COOKIES

        $user_closed_query = mysqli_query($db_con, "SELECT * FROM users 
WHERE email='$e' AND user_closed='yes'");
        if(mysqli_num_rows($user_closed_query)) {
            $account_reopen = mysql_query($db_con, "UPDATE users SET 
user_closed='no' WHERE email='$e'");
        }

        $_SESSION['userid'] = $db_id;
        $_SESSION['username'] = $db_username;
        $_SESSION['password'] = $db_pass_str;
        setcookie("id", $db_id, strtotime( '+30 days' ), "/", "", "", TRUE);
        setcookie("user", $db_username, strtotime( '+30 days' ), "/", "", 
"", TRUE);
        setcookie("pass", $db_pass_str, strtotime( '+30 days' ), "/", "", 
"", TRUE); 
        // UPDATE THEIR "IP" AND "LASTLOGIN" FIELDS
        $sql = "UPDATE users SET lastlogin=now() WHERE 
username='$db_username' LIMIT 1";
        $query = mysqli_query($db_con, $sql);
        echo $db_username;
        exit();
    }
    }
}

?>
<!DOCTYPE html>
<html>
<head>
<title></title>
<script>
    function login(){
        var e = document.getElementById("log_email");
        var p = document.getElementById("log_password");
        if(e == "" || p == ""){
    document.getElementById("status").innerHTML = "Fill out all of the form 
data";
} else {
    document.getElementById("login_button").disabled = true;
    document.getElementById("status").innerHTML = "Please wait...";
    var ajax = new XMLHttpRequest();
    ajax.open("POST", "login.php", true);
    ajax.setRequestHeader("Content-type", "application/x-www-form- 
urlencoded");
    ajax.onreadystatechange = function(){
        if(ajax.readyState == 4 && ajax.status == 200){
            document.getElementById("status").innerHTML = ajax.responseText;
            if(ajax.responseText == "login_failed"){
                document.getElementById("status").innerHTML = "Login 
unsuccessful, please try again.";
                document.getElementById("login_button").disabled = false;
            } else {
                window.location = "index.php?u="+ajax.responseText;
            }
        }
    }
    ajax.send("e="+e+"&p="+p);
    }
}
</script>
</head>
<body>
<div>
<h3>Log In Here</h3>
<!-- LOGIN FORM -->
<form id="loginform" onsubmit="return false;">
<div>Email Address:</div>
<input type="text" id="log_email" name="log_email" maxlength="88">
<div>Password:</div>
<input type="password" id="log_password" name="log_password" 
maxlength="100">
<br /><br />
<button id="login_button" onclick="login()">Log In</button> 
<span id="status"></span>
<a href="#">Forgot Your Password?</a>
</form>
<!-- LOGIN FORM -->
</div>

</body>
</html>

提前致谢!即使我输入了正确的电子邮件和密码,登录失败的页面也会响应。我希望它在用户成功登录时转到 index.php。这是图像:- 这是每次发生的屏幕截图。

标签: javascriptphpajaxhtmllogin

解决方案


您正在使用passwod_hash()哈希密码,但您没有使用password_verify()验证它。

看文档!http://php.net/manual/en/function.password-verify.php


推荐阅读