用于登录表单的PHP MVC

用于登录表单的PHP MVC,php,model-view-controller,Php,Model View Controller,我在一个允许管理候选人的网站上工作。 多个功能已经投入使用,如高级搜索、使用ajax动态候选列表、排序、将候选内容以zip格式导出到GDPR中。然而,目前还没有开发任何架构。 因此,在我的登录表单中,我想添加MVC架构 假设模型将包含SQL select语句,控制器将处理数据,例如if(isset($_POST[“identity”]){,并且视图将包含用户将在其中输入数据的基本HTML表单,这是否正确 问题是,从我现有的文件来看,我真的不知道如何添加MVC 最后,我的config.php将变成

我在一个允许管理候选人的网站上工作。 多个功能已经投入使用,如高级搜索、使用ajax动态候选列表、排序、将候选内容以zip格式导出到GDPR中。然而,目前还没有开发任何架构。 因此,在我的登录表单中,我想添加MVC架构

假设模型将包含SQL select语句,控制器将处理数据,例如if(isset($_POST[“identity”]){,并且视图将包含用户将在其中输入数据的基本HTML表单,这是否正确

问题是,从我现有的文件来看,我真的不知道如何添加MVC

最后,我的config.php将变成model.php,index.php、login.php是视图,但对于控制器,我被卡住了!:/

config.php:

<?php
$host = '127.0.0.1';
$db = 'candidates';
$user = 'root';
$pass = '';
$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,
    ];

try
{
    $cnx = new PDO($dsn, $user, $pass, $opt);
}
catch(PDOException $e)
{
    die('Connection failed :'. $e->getMessage());
}
?>
<?php
    session_start();

    include('template.php');

    if(isset($_SESSION['flash']))
    {
        foreach($_SESSION['flash'] as $type => $message)
        {
            echo $message;
        }
        unset($_SESSION['flash']);
    }

    if(isset($_SESSION['user']))
    {
        header('Location: ../index.php');
    }
?>
    <head>
        <meta charset="utf-8">
        <title>Login</title>
    </head>
    <body>
        <div class="container">
            <div id="container">
                <nav class="navbar navbar-expand-lg navbar-light bg-light">
                      <a class="navbar-brand" href=""><img id="imgNavbar" src="../img/candidacy.jpg" alt="Home"></a>
                    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                    </button>
                    <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
                        <ul class="navbar-nav">
                              <li class="nav-item active">
                                <a class="nav-link" href="../index.php">Home <span class="sr-only">(current)</span></a>
                              </li>
                              <li class="nav-item" style="margin-left: 0px">
                                <a class="nav-link" href="login.php">Connect</a>
                            </li>
                        </ul>
                    </div>
                </nav>
            </div>
            <form method="post" action="checkLogin.php">
                <div class="container">
                    <div class="card card-container">
                        <img id="profile-img" class="profile-img-card" src="../img/avatar.png" />
                        <p id="profile-name" class="profile-name-card"></p>
                        <form class="form-signin">
                            <span id="formIdentity" class="formIdentity"></span>
                            <input type="text" id="identity" name="identity" class="form-control" placeholder="Your identity" autofocus>
                            <input type="password" id="password" name="password" class="form-control" placeholder="Your password">
                            <button class="btn btn-lg btn-primary btn-block btn-signin" type="submit" id="submitBtn" name="submit" onclick="checkForm(this)">Connect</button>
                        </form><!-- /form -->
                        <a href="forgotPassword.php" class="forgot-password">
                            Forgot password ?
                        </a>
                    </div><!-- /card-container -->
                </div><!-- /container -->
            </form>
        </div>
    </body>
</html>

login.php:

<?php
$host = '127.0.0.1';
$db = 'candidates';
$user = 'root';
$pass = '';
$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,
    ];

try
{
    $cnx = new PDO($dsn, $user, $pass, $opt);
}
catch(PDOException $e)
{
    die('Connection failed :'. $e->getMessage());
}
?>
<?php
    session_start();

    include('template.php');

    if(isset($_SESSION['flash']))
    {
        foreach($_SESSION['flash'] as $type => $message)
        {
            echo $message;
        }
        unset($_SESSION['flash']);
    }

    if(isset($_SESSION['user']))
    {
        header('Location: ../index.php');
    }
?>
    <head>
        <meta charset="utf-8">
        <title>Login</title>
    </head>
    <body>
        <div class="container">
            <div id="container">
                <nav class="navbar navbar-expand-lg navbar-light bg-light">
                      <a class="navbar-brand" href=""><img id="imgNavbar" src="../img/candidacy.jpg" alt="Home"></a>
                    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                    </button>
                    <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
                        <ul class="navbar-nav">
                              <li class="nav-item active">
                                <a class="nav-link" href="../index.php">Home <span class="sr-only">(current)</span></a>
                              </li>
                              <li class="nav-item" style="margin-left: 0px">
                                <a class="nav-link" href="login.php">Connect</a>
                            </li>
                        </ul>
                    </div>
                </nav>
            </div>
            <form method="post" action="checkLogin.php">
                <div class="container">
                    <div class="card card-container">
                        <img id="profile-img" class="profile-img-card" src="../img/avatar.png" />
                        <p id="profile-name" class="profile-name-card"></p>
                        <form class="form-signin">
                            <span id="formIdentity" class="formIdentity"></span>
                            <input type="text" id="identity" name="identity" class="form-control" placeholder="Your identity" autofocus>
                            <input type="password" id="password" name="password" class="form-control" placeholder="Your password">
                            <button class="btn btn-lg btn-primary btn-block btn-signin" type="submit" id="submitBtn" name="submit" onclick="checkForm(this)">Connect</button>
                        </form><!-- /form -->
                        <a href="forgotPassword.php" class="forgot-password">
                            Forgot password ?
                        </a>
                    </div><!-- /card-container -->
                </div><!-- /container -->
            </form>
        </div>
    </body>
</html>

登录

连接
checkLogin.php

<?php
require('config/config.php');

session_start();
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    if(isset($_POST['identity']) && isset($_POST['password']))
    {
        $stmt = $cnx->prepare("SELECT * from users WHERE nameUser = :username");
        $stmt->bindValue(':username', $_POST['identity'], PDO::PARAM_STR);

        $stmt->execute();
        $users = $stmt->fetch(PDO::FETCH_ASSOC);

        $result = $stmt->rowCount();

        if($result > 0)
        {
            if(password_verify($_POST['password'], $users['passwordUser']))
            {
                $token = bin2hex(random_bytes(64));
                $_SESSION['user'] = $users;
                $_SESSION['token'] = $token;
                $_SESSION['start'] = time();
                $_SESSION['expire'] = $_SESSION['start'] + (120 * 60);

                header('Location: ../index.php');
            }
            else
            {
                $_SESSION['flash']['info'] = "<div class='alert alert-danger'>Check your information !</div>";
                header('Location: ../login.php');
                exit(0);
            }
        }
        else
        {   
            $_SESSION['flash']['connect'] = "<div class='alert alert-danger'>Non-existent user !</div>";
            header('Location: ../login.php');
            exit(0);
        }

        $stmt->closeCursor();
    }
    if(empty($_POST['identity']) || empty($_POST['password']))
    {
        $_SESSION['flash']['empty'] = "<div class='alert alert-danger'>Fill in the fields please !</div>";
        header('Location: ../login.php');
        exit(0);
    }
}
?>

事实上,我相信您不仅学习了如何将MVC应用于特定问题,还学习了其背后的概念和理论。您可以在中了解基本知识

此外,通常建议使用框架,以免无意中破坏一些设计模式概念

关于你的情况,我会这样做:

型号:

  • 使用者
  • 数据库连接器
  • 控制器:

  • 登录页面控制器
  • 索引控制器
  • 观点:

  • 登录
  • 索引

  • 我也会推荐使用框架。也许对于初学者来说,
    codeigniter
    是可以的。是的,但问题是不推荐在那个项目中使用框架://D.Dimitrov是的,这是一个很好的框架。但是我不想把这个问题变成一个软件推荐调查,你知道。@Maestro,我刚才在说。尽管如此,我还是有建议在你的情况下你能做什么。