我应该如何将我的User对象保存到会话中?

时间:2011-08-03 18:10:18

标签: php serialization pdo

以下是我的User类的基本结构:

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函数已经有一段时间了。我已经为这个项目决定采用更多的OOP方法并转向PDO。当我以前建立一个“安全”环境时,我会有一个登录表单,检查用户是否存在(使用正确的密码),然后将用户ID保存在会话变量中(例如:$ _SESSION ['user_id'])和瞧。在我的安全环境中。我只是检查user_id是否已设置,我是否允许他们访问。

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

问题

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

1 个答案:

答案 0 :(得分:0)

您应该可以从MyApp::getConnection()获取PDO对象,并从__wakeup方法中调用它