php - 我是否应该以及如何将我的用户对象保存到 session 中?

标签 php serialization pdo

这是我的用户类的基本结构:

class User {

private $_userId = NULL;
private $_isAuthenticated = FALSE;
private $_code = NULL;
private $_pageLoads = 1;
private $_dbh = NULL;
const SECRET = 'shhhh its a secret';
const PAGE_LOADS = 5;
const HALF_SECOND_MS = 500000;

function __construct( PDO $dbh ) {
    $this->_dbh = $dbh;
}

public function login( $username, $password ) {}

public function isAuthenticated() {}

private function _authenticate( $username, $password ) {}

private function _challenge() {}

private function _generateCode() {}

private function _protectedVars() {}

function __sleep() {}

function __wakeup() {}

public function save() {
    return serialize( $this );
}
}

我正在尝试做的事情的描述

我使用 PHP 内置 mysql 函数已经有一段时间了。对于这个项目,我决定采用更面向对象的方法并转向 PDO。当我过去构建一个“安全”环境时,我会有一个登录表单,检查用户是否存在(使用正确的密码),然后将用户 ID 保存在 session 变量中(比如:$_SESSION['user_id'])和瞧。在我的安全环境中。我会简单地检查是否设置了 user_id 并授予他们访问权限。

现在我知道这不是一个很好的方法,而且我知道上面的代码可能有其自身的问题(出于教育目的,我希望你们能给我下 hell )。基本上我的想法是创建一个用户对象,我将在构造函数中传递我的 PDO 对象。我可以从这个用户登录,一旦所有执行完成,我将通过序列化类将用户保存在 session 变量中。一旦加载新页面,唤醒功能就会被调用,我会调用未序列化的数据以确保它没有被篡改,在这种情况下,我会通过关闭 isAuthenticated 标志来注销用户(这就是上面的代码)。

问题

当我尝试序列化对象时,我收到一条错误消息,告诉我无法序列化 PDO 对象。我做了一些研究,发现我必须实现 __sleep 方法并返回我想要保存的变量数组。但是,当我醒来时如何重新初始化用户对象中的 PDO 对象?有没有一种方法可以向反序列化函数添加参数,并将其传递给我的 __wakeup 函数?我是否完全走错了路,需要重新考虑一下?

最佳答案

您应该能够从类似 MyApp::getConnection() 的东西中获取您的 PDO 对象,并从您的 __wakeup 方法中调用它

关于php - 我是否应该以及如何将我的用户对象保存到 session 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6931114/

相关文章:

php - 拉维尔 4 : load class dynamically from string in database

php - 如何将 PDO 转换为 mysqli?

javascript - $.post 不发送数据到 php 脚本

序列化异常 : can't locate argument-less serializer

php - php + mysql 的问题(字段名称 "group")

javascript - PHP在函数中获取唯一值并将其传递给查看文件

c# - 反序列化 XML 属性 'xsi:type'

Python继承模式——如何处理反序列化

php - 从 Mysql 转移到 PDO

php - PDO 连接被 laravel 拒绝,但不被 $con = new PDO() 拒绝