在MVC体系结构中处理PHP会话


Handling PHP sessions in MVC architecture

我试图在MVC架构中编写登录系统代码,当然是处理会话,但我意识到我不确定我的想法是否正确。

我要给你看代码,写这个的伪装。

我的观点:

<?php 
    session_start();
    session_destroy();
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="../css/backend.css">
    <script src="../js/admlog.js"></script>
    <title>Access to administration panel</title>
</head>
<body>
    <form method="post" action="../controller/admlog.php">
      <h2><span class="entypo-login"></span> Login</h2>
      <button class="submit"><span class="entypo-lock"></span></button>
      <span class="entypo-user inputUserIcon"></span>
      <input type="text" name="user" class="user" placeholder="username"/>
      <span class="entypo-key inputPassIcon"></span>
      <input type="password" name="password" class="pass"placeholder="password"/>
    </form>
</body>
</html>

这里没什么好说的,基本的html表单.

登录页面的控制器:

<?php
//controller! 
    require "../model/backend.php";
    $username = $_POST['user'];
    $password = $_POST['password'];
    $dbcom = new dbInteraction;
    $dbcom->admlog($username, $password);
    $dbcom->conclose();
?>

也很简单,我在这里所做的就是获取输入的值,并将它们发送到backend.php,在那里处理请愿。

处理登录的后端功能:

public function admlog($username, $password){
        $this->username = $username;
        $this->password = $password;
        //$this->pdo = $pdo;
        //$adm = 1;
        $myquery = 'SELECT username FROM users WHERE username = :username AND password = :password'; //check admin flag
        $stmt = $this->pdo->prepare($myquery);
        $stmt->bindParam(':username', $username, PDO::PARAM_STR);
        $stmt->bindParam(':password', $password, PDO::PARAM_STR);
        //$stmt->bindParam(':isadmin', $adm, PDO::PARAM_STR);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        if (count($result) > 0){
            session_start();
            $_SESSION['login'] = $result['username'];
            header('Location: ../view/backMain.php');
        }else{
            session_start();
            $_SESSION['login'] = ""; 
            //header('Location: ../manage.php');
            echo 'Incorrect user or password';
        }
    }

所有的代码都能正常工作,我的意思是,选择是正确的,用户可以登录系统。

问题是我处理会话的方式。当在数据库中找到用户时,我编码:

session_start();
$_SESSION['login'] = $result['username'];
header('Location: ../view/backMain.php');

所以它应该创建一个新的会话,不是吗?好吧,目标页面(backMain.php)有一个限制,即检查是否有一个已解决的会话的限制。

<?php
if(!isset($_SESSION['login']))
{
    header("Location: http://google.es");
}
?>

我不得不假设是的,但当我试图访问时,我看到了没有。

在这种体系结构中如何处理会话?对我来说,代码是有意义的,但结果显然不是。

我被重定向到google.es,因为即使我在后台设置了会话,该条件也找不到任何已解决的会话。

我一定是错过了什么。

感谢

你是对的,问题是如何处理会话。

似乎,在用户获得会话Cookie之前,您将其重定向到另一个页面。如果您正确收到会话cookie,请与Chrome/FF开发人员控制台联系。如果没有,我建议在meta/js级别进行重定向,而不是HTTP头,这将使用户在处理到另一个页面之前接收并写入cookie。