【问题标题】:PHP - Accessing my user class from the whole appPHP - 从整个应用程序访问我的用户类
【发布时间】:2013-05-18 03:35:17
【问题描述】:

我目前正在编写登录脚本,因为我正在尝试使用 OOP 学习 PDO。我有一个 index.php 页面,它只包含一个登录表单。然后我有一个 User 类,它看起来像这样:

<?php
include_once('database.php');
session_start();
class User{
public $id;
public $username;
public $password;
public $firstname;
public $lastname;

public function Login($username, $password) {
    $db = new Database;
    $db = $db->dbConnect();

    $query = "SELECT * FROM users WHERE username = ? AND password = ?";

    $statement = $db->prepare($query);
    $statement->bindParam(1, $username);
    $statement->bindParam(2, $password);
    $statement->execute();

    $rows = $statement->rowCount();
    $data = $statement->fetchAll();

    if( $rows == 1 ) {
        $this->id = $data[0]['id'];
        $this->username = $data[0]['username'];
        $this->password = $data[0]['password'];
        $this->firstname = $data[0]['firstname'];
        $this->lastname = $data[0]['lastname'];

        $_SESSION['SESSID'] = uniqid('', true);
        header("location: dashboard.php");
    }
}
}
?>

当用户登录时,他/她会转到dashboard.php。我想从那里访问当前的 User 类,所以我可以从那里使用 echo $user->username 。但是在dashboard.php中,我必须将User类声明为new,所以它不会保留所有变量。

您对我如何访问在登录函数中声明的 Dashboard.php 中的用户类变量有任何想法吗?

很抱歉解释不好,但我希望你能理解。提前谢谢!

【问题讨论】:

  • 如果dashboard.php 是另一个PHP 页面,那么您需要将User 对象存储在一个Session 中。
  • 您也可以使用framework.zend.com/manual/2.2/en/modules/…,这样您就不必创建类和管理会话。更少的代码。

标签: php oop web login pdo


【解决方案1】:

首先将您的用户类定义放在另一个文件中,然后像您的database.php 一样加载它。在那里你只想要你的类定义,没有任何会话开始业务......&lt;?php class User {....} ?&gt;(结束?>是可选的)。

所以您现在在页面上需要访问用户对象的是

<?php
include_once('database.php');
include_once('user.php');
session_start();

然后在用户成功登录后,您将用户放入会话中。

$_SESSION["user"] = $user;

那么当你想了解它时,就说

$user = $_SESSION["user"];
echo $user->username;

【讨论】:

    【解决方案2】:

    您可以做的是,将您的用户对象放入会话中:

    $obj = new Object();    
    $_SESSION['obj'] = serialize($obj);    
    $obj = unserialize($_SESSION['obj']);
    

    或者你可以创建一个单例,查看这个链接: Creating the Singleton design pattern in PHP5

    【讨论】:

    • $_SESSION 比使用单例 IMO 好得多
    • 我同意,只是想给另一个选择
    • 您不要将序列化的对象存储在$_SESSION 中,因为 PHP 已经负责序列化存储在那里的内容。您必须确保的唯一一件事是在调用session_start() 之前加载存储在那里的任何类的代码 - 否则对象将无法正确恢复。在这里也可以进行有效的自动加载。
    【解决方案3】:

    你有两个选择:

    a) 您将所有登录信息存储在会话中。 b)您只存储用户 ID 和用户拥有/已登录的某种标识符,并创建另一种方法,每次加载页面时都会从数据库中加载信息(确实是个坏主意)

    例如,您可以将以下方法添加到您的类中,以实现上述功能和更多功能:

    function createUserSession(array $userData) {
       // Create / save session data 
    }
    
    function readActiveUserSession() {
       // Read current user information
    }
    
    function destroyActiveUserSession() {
       // Call to destroy user session and sign out
    }
    

    当然,您必须在方法中添加适当的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 2020-06-20
      相关资源
      最近更新 更多