【问题标题】:Should I, and how do I, save my User object to session?我应该以及如何将我的用户对象保存到会话中?
【发布时间】:2011-08-03 18:10:17
【问题描述】:

这是我的 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 并授予他们访问权限。

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

问题

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

【问题讨论】:

  • 为什么要序列化全班?我不是 php 大师,我从未在任何地方看到过这种方法,但我可能会弄错。不过很有趣
  • 我想我真的不需要,我只需要类中的一些变量。之后你将如何重建用户对象?我正在研究多个构造函数,但 PHP 似乎不支持它。

标签: php serialization pdo


【解决方案1】:

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

【讨论】:

  • 所以你建议我的 PDO 对象应该在单例中?我在构造函数中传递它以避免这种情况,因为我听说很多时候单例被滥用并且可能导致问题。
  • @Gazillion:是的,绝对是。 PDO 连接是应被视为单例对象的完美示例,因为您的应用程序只需要一个数据库连接。
猜你喜欢
  • 2010-09-21
  • 2021-08-20
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 2011-05-15
  • 1970-01-01
相关资源
最近更新 更多