PHP MVC登录表单

时间:2018-11-06 11:32:18

标签: php model-view-controller

我正在允许管理候选人的网站上工作。 多种功能已经投入使用,例如高级搜索,带有ajax的候选动态列表,排序,以GDPR格式导出zip格式的候选内容。但是,目前还没有开发任何体系结构。 因此,从我的登录表单中,我想添加MVC体系结构。

我是否正确的假设是,模型将包含SQL select语句,控制器将处理数据,例如if(isset($ _ POST [“ identity”])){并且视图将包含基本HTML格式用户将在哪里输入数据?

问题在于,从我现有的文件中,我看不到如何添加MVC。

我的config.php最终将变成model.php,index.php,login.php是视图,但是对于控制器,我却陷入困境! :/

配置。 php:

set_5

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());
}
?>

checkLogin.php

<?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>

index.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);
    }
}
?>

1 个答案:

答案 0 :(得分:0)

实际上,我相信您不只是学习如何将MVC应用于特定问题,而且还可以学习背后的概念和理论。您可以在here中查找基础

此外,通常建议使用框架,这样您就不会无意间破坏某些设计模式概念。

关于您的情况,我会这样处理:

型号:

  1. 用户
  2. DatabaseConnector

控制器:

  1. LoginPageController
  2. IndexController

观看次数:

  1. 登录
  2. 索引