我有一个名为 的类Admin,它的字段与我admins在数据库中的表中的字段完全相同:id, email, pwhash, pwnonce, name, permissions。
我的班级看起来像这样(简化了):
class Admin {
var $id, $email, $pwhash, $pwnonce, $name, $permissions;
function auth() {
// checks the session and attempts to authenticate the user
}
function login($email,$pw) {
// authenticate the user and start a session for them.
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,我想使用 PDO 来获取使用当前类的对象,并将其分配给当前对象。
之前,我正在获取一个 assoc 数组并一一分配所有变量,但是现在,由于我将系统更改为使用 PDO,我想让它返回Admin我分配给的类的一个实例当前的。
例如,在auth()方法中,它应该是这样的:
function auth() {
if (!isset($_SESSION['id'])) return false;
$id = $_SESSION['id'];
// create PDO connection and assign to $dbh
$sth = $dbh->prepare('SELECT * FROM admins WHERE id = ?');
$sth->execute(array($id));
$sth->setFetchMode(PDO::FETCH_CLASS,get_class($this));
$obj = $sth->fetch();
if (!is_object($obj)) return false;
$this = $obj; // I know this won't work, but anyway...
}
Run Code Online (Sandbox Code Playgroud)
所以我试过了,正如我所怀疑的那样,它不会让我分配$this. 但是,我还是想使用 PDO 的对象映射功能,那么如何将 PDO 返回的对象分配给我所在的实例呢?
如果要获取给定类的新对象,请使用PDO::FETCH_CLASS. 但是,如果要将属性值写入已有的现有对象,请使用PDO::FETCH_INTO,如下所示:
$sth->setFetchMode(PDO::FETCH_INTO, $this);
$sth->execute();
$sth->fetch();
Run Code Online (Sandbox Code Playgroud)
请注意,您要写入的属性必须是可公开访问的,可以直接访问,也可以通过__set()魔术方法访问。
但是,您应该仔细考虑@Truth 的回答。让同一个类(更不用说同一个对象!)同时负责数据库访问和表示记录并不是一个好的设计。让一类负责管理授权记录,另一类负责记录本身。