在自己的类中设置从 PDO 返回的对象

Ale*_*lan 1 php mysql pdo

我有一个名为 的类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 返回的对象分配给我所在的实例呢?

Fra*_*ila 5

如果要获取给定类的新对象,请使用PDO::FETCH_CLASS. 但是,如果要将属性值写入已有的现有对象,请使用PDO::FETCH_INTO,如下所示:

 $sth->setFetchMode(PDO::FETCH_INTO, $this);
 $sth->execute();
 $sth->fetch();
Run Code Online (Sandbox Code Playgroud)

请注意,您要写入的属性必须是可公开访问的,可以直接访问,也可以通过__set()魔术方法访问。

但是,您应该仔细考虑@Truth 的回答。让同一个类(更不用说同一个对象!)同时负责数据库访问和表示记录并不是一个好的设计。让一类负责管理授权记录,另一类负责记录本身。