Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP登录系统:IF-ELSE错误_Php_Html - Fatal编程技术网

PHP OOP登录系统:IF-ELSE错误

PHP OOP登录系统:IF-ELSE错误,php,html,Php,Html,我正在用OOP PHP创建一个登录系统 问题在于执行if…else语句时,我会检查电子邮件是否正确,以及相应电子邮件的密码是否错误。如果是,则显示错误密码不正确。 但是,if…else语句未按预期工作。它不返回任何结果,即NULL login.php <?php include('conn.php'); class Login extends Connection { private $dbEmail; private $dbPassword; private

我正在用OOP PHP创建一个登录系统

问题在于执行
if…else
语句时,我会检查电子邮件是否正确,以及相应电子邮件的密码是否错误。如果是,则显示错误密码不正确。

但是,
if…else
语句未按预期工作。它不返回任何结果,即
NULL

login.php

<?php

include('conn.php');

class Login extends Connection {
    private $dbEmail;
    private $dbPassword;
    private $query;
    public $emError;
    public $paError;

    public function loginFormHandler($email, $password) {
        $this->query = $this->DB_CONN->prepare("SELECT `email`, `password` FROM `users` WHERE `email` = :email AND `password` = :password");
        $this->query->bindParam(':email', $email);
        $this->query->bindParam(':password', $password);
        $this->query->execute();

        while($row = $this->query->fetch(PDO::FETCH_ASSOC)) {
            $this->dbEmail = $row['email'];
            $this->dbPassword = $row['password'];
        }

        if ($this->dbEmail === $email && $this->dbPassword !== $password) {
            $this->paError = 'Password Error';
        }
    }

    public function errors() {
        return array($this->emError, $this->paError);
    }
}
<?php

include('class/login.php');

$err = [];

if(isset($_POST['email']) && isset($_POST['password'])) {
    $email = $_POST['email'];
    $password = $_POST['password'];

    if(!empty($email) && !empty($password)) {
        $user = new Login;
        $user->loginFormHandler($email, $password);
        var_dump($err = $user->errors());
    }
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Form</title>
</head>
<body>
    <div class="form">
        <form action="/oop/index.php" method="POST" accept-charset="UTF-8">
            <label for="email">Email: </label><br>
            <input type="email" name="email" required><br>
            <?php if($err) {echo $err[0];} ?><br>
            <label for="password">Password: </label><br>
            <input type="password" name="password" required><br>
            <?php if($err) {echo $err[1];} ?><br>
            <input type="submit" value="Login">
        </form>
    </div>
</body>
</html>

如果您的代码中包含了数据库中的电子邮件和密码,那么很明显密码永远不会出错(如果密码出错,则不会从db=NULL中获取任何内容)。您的代码如下所示:

class Login extends Connection {

    private $email;
    private $password;

    private $query;
    public $emError;
    public $paError;

    private function selectLogin(){
        $this->query = $this->DB_CONN->prepare("SELECT `email`, `password` FROM `users` WHERE `email` = :email AND `password` = :password LIMIT 1");
        $this->query->bindParam(':email', $this -> email);
        $this->query->bindParam(':password', $this -> password);
        $this->query->execute();

        return $this->query->fetch(PDO::FETCH_ASSOC);
    }

    public function loginFormHandler($email, $password){
        $this -> email = $email;
        $this -> password = $password;

        $result = $this -> selectLogin();

        if(is_null($result)){
            $this->emError = $this -> email;
            $this->paError = 'Email or Password error';
        } else {
            // do something
        }
    }

    public function errors() {
        return array($this->emError, $this->paError);
    }

}

只需检查行是否存在,如果存在,则启动会话。否则重定向回错误 您可以通过
fetchColumn()
您的登录函数应该如下所示

 public function loginFormHandler($email, $password) {
        $this->query = $this->DB_CONN->prepare("SELECT `email`, `password` FROM `users` WHERE `email` = :email AND `password` = :password");
        $this->query->bindParam(':email', $email);
        $this->query->bindParam(':password', $password);
        $res=$this->query->execute();
        $num_rows = $res->fetchColumn();
        if ($num_rows>0) {
            $row = $this->query->fetch(PDO::FETCH_ASSOC);
            echo "success";
            //Do something

        }
        else{
            echo 'email or password is not valid';
            //or do something
        }
    }

不要在数据库中存储纯文本密码,请使用哈希。请参阅password\u hash/password\u verify。您的方法loginFormHandler在哪里?您的方法loginFormHandler不返回任何内容。@Progrock和它不应返回任何内容,因为错误是在单独的方法中检查的,@Progrock非常清楚地指出:“不要在数据库中存储纯文本密码,请使用哈希。请参阅
password\u hash
/
password\u verify
PHP函数。“。没有任何借口。如果你在练习作业中设置了快捷方式,那么你将在“真实”作业中设置快捷方式。不要成为问题。