Как динамически отображать имя пользователя из базы данных после входа в систему? - PullRequest
0 голосов
/ 29 ноября 2018

Мне нужно динамически отображать имя пользователя, вошедшего в систему, в моем проекте OOP PHP.Я могу отобразить его, когда набираю правильный идентификатор из базы данных, но он показывает ошибку, когда я пытаюсь определить свойство $ user_id в моей функции find_by_id.Мне нужна помощь о том, как определить переменную $ user_id.Вот мой код:

index.php

<?php $user = User::find_by_id($user_id); ?>
<h1>Hello, <?php echo $user->username; ?></h1>

user.php

<?php

class User
{
   protected static $db_table = "users";
   public $id;
   public $username;
   public $password;
   public $first_name;
   public $last_name;

private function has_the_attribute($the_attribute)
{
   $object_properties = get_object_vars($this);
   return array_key_exists($the_attribute, $object_properties);
}

public static function instantation($the_record)
{
   $the_object = new self;
   foreach ($the_record as $the_attribute => $value) {
   if ($the_object->has_the_attribute($the_attribute)) {
       $the_object->$the_attribute = $value;
       }
      }
   return $the_object;
}

public static function find_this_query($sql)
{
   global $database;
   $result_set = $database->query($sql);
   $the_object_array = [];
   while ($row = mysqli_fetch_array($result_set)) {
   $the_object_array[] = self::instantation($row);
    }
    return $the_object_array;
}

public static function find_all()
{
   return self::find_this_query("SELECT * FROM " . static::$db_table . " ");
}

public static function find_by_id($user_id)
{
   global $database;
   $the_result_array = self::find_this_query("SELECT * FROM " . self::$db_table . " WHERE id = $user_id");
   return !empty($the_result_array) ? array_shift($the_result_array) : false;
}

public static function verify_user($username, $password)
{
   global $database;
   $username = $database->escape_string($username);
   $password = $database->escape_string($password);

   $sql = "SELECT * FROM " . self::$db_table . " WHERE ";
   $sql .= "username = '{$username}' ";
   $sql .= "AND password = '{$password}'";

   $the_result_array = self::find_this_query($sql);
   return !empty($the_result_array) ? array_shift($the_result_array) : false;
}
}

$user = new User();

session.php

<?php

class Session
{
   private $signed_in = false;
   public $user_id;
   public $message;

public function __construct()
{
   session_start();
   $this->check_the_login();
   $this->check_message();
}

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

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

private function check_the_login()
{
   if (isset($_SESSION['user_id'])) {
       $this->user_id = $_SESSION['user_id'];
       $this->signed_in = true;
     } else {
        unset($this->user_id);
        $this->signed_in = false;
     }
}

public function is_signed_in()
{
   return $this->signed_in;
}

public function message($msg="")
{
   if (!empty($msg)) {
       $_SESSION['message'] = $msg;
   } else {
        return $this->message;
   }
}

public function check_message()
{
   if (isset($_SESSION['message'])) {
       $this->message = $_SESSION['message'];
       unset($_SESSION['message']);
   } else {
        $this->message = "";
   }
}
}

$session = new Session();

1 Ответ

0 голосов
/ 29 ноября 2018

Для того, чтобы пометить это как принятое, вам нужно на самом деле передать идентификатор пользователя, а не просто неинициализированную переменную, если в вашем экземпляре вы храните его в сеансе, поэтому я предполагаю, что это будет:

<?php $user = User::find_by_id($_SESSION['user_id']); ?>

Примечание: Чтобы сделать шаблон более чистым, вы можете использовать сокращенный синтаксис для echo:

<h1>Hello, <?= $user->username; ?></h1>

Еще одна вещь, на которую стоит обратить внимание:создал класс Session, однако вы по какой-то причине все еще обращаетесь к данным через $_SESSION, что не имеет смысла, сделайте для него несколько сеттеров / геттеров.Наконец, сессии - это то, что вы будете часто использовать, поэтому стоило бы сделать этот класс статичным.

Материал для чтения

echo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...