2016-02-12 2 views
2

Методы класса базы данных работают правильно, поскольку пользователь аутентифицирован правильно. Сеанс настроен на правильный идентификатор пользователя, но зарегистрированная переменная не задана? Var dump возвращает false, но после запуска метода входа в систему должен быть установлен true.PHP & MySQLi OOP - Почему моя переменная, которой не зарегистрирована, не установлена ​​в true?

login.php

<?php 

//session is started in the initialize file and all required files are included 
require_once('includes/init.php'); 

// set initial values so that input values using username and password variables do not return undefined as well as the error variable 
$username = ""; 
$password = ""; 
$error = ""; 

if($session->isLoggedIn()) { 
    redirect('index.php'); 
} 

if (isset($_POST['submit'])) { 
    $username = trim($_POST['username']); 
    $password = trim($_POST['password']); 

    $foundUser = User::verify($username, $password); 
    if ($foundUser) { 
     $session->login($foundUser); 
     redirect('index.php'); 
    } else { 
     $error = "Combination incorrect"; 
    } 
} 

?> 

session.php

<?php 

// Session class allows to store session cookies so that data can be looked up without having to go back to the database 
// Database objects not stored because they could get updated in the database so the cookies could become outdated 

class Session { 
    public $loggedIn = false; 
    public $userId; 

    function __contruct() { 
     $this->checkLogin(); 
    } 

    public function isLoggedIn() { 
     return $this->loggedIn; 
    } 

    private function checkLogin() { 
     if(isset($_SESSION['userId'])) { 
      $this->userId = $_SESSION['userId']; 
      $this->loggedIn = true; 
     } else { 
      unset($this->userId); 
      $this->loggedIn = false; 
     } 
    } 

    public function login($user) { 
     if($user) { 
      $this->userId = $_SESSION['userId'] = $user->userId; 
      $this->loggedIn = true; 
     } 
    } 

    public function logout() { 
     unset($_SESSION['userId']); 
     unset($this->userId); 
     $this->loggedIn = false; 
    } 
} 

$session = new Session(); 

?> 

user.php

<?php 

class User { 

    public $userId; 
    public $username; 
    public $password; 
    public $email; 
    public $firstname; 
    public $lastname; 
    public $access; 
    public $active; 

    public static function getUsers() { 
     return self::getBySQL("SELECT * FROM users"); 
    } 

    public static function getUserId($id=0) { 
     global $db; 
     $resultArray = self::getBySQL("SELECT * FROM users WHERE userId={$id}"); 
     return !empty($resultArray) ? array_shift($resultArray) : false; 
    } 

    public static function getBySQL($sql) { 
     global $db; 
     $result = $db->query($sql); 
     $objArray = array(); 
     while ($row = $db->fetchArray($result)) { 
      $objArray[] = self::instantiate($row); 
     } 
     return $objArray; 
    } 

    public function getName() { 
     if (isset($this->firstname) && isset($this->lastname)) { 
      return $this->firstname . " " . $this->lastname; 
     } else { 
      return ""; 
     } 
    } 

    private static function instantiate($record) { 
     $object = new self; 

     foreach($record as $attr=>$value){ 
      if($object->hasAttr($attr)) { 
       $object->$attr = $value; 
      } 
     } 
     return $object; 
    } 

    private function hasAttr($attr) { 
     $objectVars = get_object_vars($this); 
     return array_key_exists($attr, $objectVars); 
    } 

    public static function verify($username, $password) { 
     global $db; 
     $username = $db->prepare($username); 
     $password = $db->prepare($password); 

     $sql = "SELECT * FROM users WHERE username = '{$username}' AND userpass = '{$password}'"; 
     $resultArray = self::getBySQL($sql); 
     return !empty($resultArray) ? array_shift($resultArray) : false; 
    } 
} 

?> 

database.php

<?php 
include 'config.php'; 

class Database { 
    private $connection; 

    function __construct() { 
     $this->connect(); 
    } 

    public function connect() { 
     $this->connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME); 
     if(mysqli_connect_errno()) { 
      die("Database connection failed: " . 
       mysqli_connect_error() . 
       " (" . mysqli_connect_errno() . ")" 
      ); 
     } 
    } 

    public function disconnect() { 
     if(isset($this->connection)) { 
      mysqli_close($this->connection); 
      unset($this->connection); 
     } 
    } 

    public function query($sql) { 
     $result = mysqli_query($this->connection, $sql); 
     if (!$result) { 
      die("Database query failed."); 
     } 
     return $result; 
    } 

    public function prepare($data) { 
     $escString = mysqli_real_escape_string($this->connection, $data); 
     return $escString; 
    } 

    public function fetchArray($results) { 
     return mysqli_fetch_assoc($results); 
    } 
} 

$db = new Database(); 

?> 
+0

Для обеспечения безопасности паролей воспользуйтесь встроенными функциями PHP (http://jayblanchard.net/proper_password_hashing_with_PHP.html). Если вы используете версию PHP менее 5.5, вы можете использовать 'password_hash()' [пакет совместимости] (https://github.com/ircmaxell/password_compat). –

+0

@JayBlanchard Да, не волнуйтесь, я в безопасности, поэтому я, в конце концов, добавлю защиту, но атакую, просто пытаюсь все правильно работать –

+2

Ненавижу, когда люди говорят * «Я не так далеко ...» * или * «Этот сайт не будет публичным ...» * или * «Это только для школы, поэтому безопасность не имеет значения ...» *. Если учителя и профессора не говорят о безопасности с первого дня, они делают это неправильно. Бросьте вызов им. Они учат неаккуратным и опасным методам кодирования, которые ученикам придется отучить позже. Я также ненавижу, когда люди говорят: «Я добавлю безопасность позже ...» *. Если у вас нет времени сделать это правильно в первый раз, когда вы найдете время, чтобы добавить его позже? ¯ \\ _ (ツ) _/¯ –

ответ

1

PHP не может сохранять значения переменных между запросами. Это означает, что каждый раз, когда вы вызываете скрипт, переменная $ bool будет установлена ​​в false. Если вы хотите сохранить значение между запросами, вам нужно использовать сеансы или, если вы хотите, чтобы переменная была разделена между сеансами, некоторый механизм кеширования, такой как APC или Memcache.

Смежные вопросы