PHP MVC -这是正确的方式来做模型,视图,控制器?我做错什么了吗?


PHP MVC - Is this the right way to do Model, View, Controller? Am I doing anything wrong?

我对PHP和MVC相当陌生。我不想使用任何框架,如CodeIgniter或Laravel。我想从头开始学习。我正试图使登录页面。下面是我的代码:

HTML代码:

<html>
<body>
<h2></h2>
<form action="" method="post">
  <input type="text" name="username">
  <input type="text" name="password">
  <input type="submit" value="Login">
</form>
</body>
</html>

Text.class.php代码:

<?php
    class Text {
        function __construct()
        {
        }
        private function sanitize($text) {
            $sanitizedText = htmlspecialchars($text, ENT_QUOTES);
            return $sanitizedText;
        }
    }
?>

数据库连接代码(connection.php):

<?php
class Connection {
    public function dbc() {
        $host = 'localhost';
        $db = 'database1';
        $user = 'root';
        $pass = 'password123';
        $charset = 'utf8';
        $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
        $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        return new PDO($dsn, $user, $pass, $opt);
    }
}
?>

控制器代码(LoginController.php):

<?php
include_once('Text.class.php');
class LoginController {
    private $model;
    public function __construct() {
        $this->model = new LoginModel();
    }
    public function login($usernameOrEmail, $password) {
        $usernameOrEmail = sanitize($usernameOrEmail);
        $password = sanitize($password);
        if(!empty($usernameOrEmail) && !empty($password)) {
            if(isset($_POST['usernameOrEmail']) && isset($_POST['password'])) {
                $usernameOrEmail = $_POST['usernameOrEmail'];
                $password = $_POST['password'];
                $this->model->loginUser($usernameOrEmail, $password);
            } else {
                return "Please enter a username or password.";
                die();
            }
        } else {
            return "Please enter a username or password.";
            die();
        }
    }
}
?>
模型代码(LoginModel.php):
<?php
include_once('connection.php');
class LoginModel() {
    private $dbc;
    private function loginUser($usernameOrEmail, $password) {
        $stmt = $this->dbc->prepare("SELECT username, password FROM users WHERE username = :usernameOrEmail OR email = :usernameOrEmail AND password = :password");
        $stmt->bindParam(':usernameOrEmail', $usernameOrEmail, PDO::PARAM_STR);
        $stmt->bindParam(':password', $password, PDO::PARAM_STR);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if($row) {
            return "Login successful!"
        } else {
            return "Wrong username or password.";
            die();
    }
}
?>

我也有点卡住了,我有三个问题:

  1. 在HTML代码中,我把for action="在表单标签中放什么?
  2. 在我的类Text.class.php中,我把什么放在__construct中?
  3. 在我的模型代码中,我如何将"登录成功!"或"用户名或密码错误"传递给视图并将其插入"?

如果可以的话,请告诉我回答我的问题,告诉我我做错了什么(如果我做错了什么)。

谢谢大家!

    没什么,这个类根本不应该存在。验证应该在模型层中完成,最好在相关的域对象中完成。您的控制器应该将用户名和密码传递给身份验证服务(这是模型层的一部分)。然后,视图应该要求来自身份验证服务的关于用户帐户的信息(如果身份验证失败,它将返回null或异常)。

此外,您应该散列用户密码或获得一个新的爱好。