2015-11-15 3 views
0

Я пытался закодировать систему входа в архитектуру MVC, конечно, обработку сеансов, но я понял, что не уверен, правильно ли сформулирована моя идея.Обработка PHP-сессий в архитектуре 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, где будет обрабатываться ходатайство.

функция Backend, где обрабатывается Логин:

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'; 
     } 
    } 

Весь код работает без проблем, я имею в виду, выберите выполняется правильно и пользователь может войти в систему.

Проблема заключается в том, как обрабатывать сеансы. Когда пользователь находится в db, я закодировал:

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, потому что условие не находит установленный сеанс, даже если я установил этот сеанс в бэкэнд.

Я должен что-то упустить.

Благодаря

+0

Пожалуйста, поймите, что у вас есть логика в вашем представлении, которая должна находиться внутри контроллера (запуск и уничтожение сеанса), если вы хотите преследовать реальную функциональность MVC. Кроме того, класс взаимодействия с БД не является лучшим местом для ввода логина входа в систему, в противном случае - все, что должно получить доступ к базе данных, попадает в класс базы данных. – moorscode

ответ

0

Вы правы, проблема так, как вы справляетесь сессию.

Кажется, что вы перенаправляете пользователя на другую страницу, прежде чем он получит сессию Cookie. Проконсультируйтесь с консолью разработчиков Chrome/FF, если вы правильно получите cookie сеанса. Если нет, я бы рекомендовал перенаправить на уровень meta/js вместо заголовков HTTP, он заставит пользователей получать и записывать файлы cookie перед обработкой на другой странице.

+0

Интересный момент, но мне бы хотелось использовать только php вместо js, только для этого случая. –

+0

Ну, если вы боитесь рефереров или smth, вы можете сделать js перенаправлением на другую страницу с js на вашем сервере, чтобы отправить cookie клиенту и после этого перенаправить клиент с php дальше. – iXCray

+0

Я снова работал над этим, и я снова наткнулся на ваш ответ. Дело в том, что меня беспокоит возможность изменения значений js, поэтому я предпочитаю использовать php для обработки этого, но ... Я все еще получаю эту проблему. Кажется, что пользователь не получает файл cookie сеанса, а затем перенаправляется на страницу с ошибкой. Как я могу справиться с этим через js? @iXCray –