【问题标题】:PHP PDO - FETCH_INTO , $this . Populating a pre-instantiated objectPHP PDO-FETCH_INTO,$this。填充预实例化的对象
【发布时间】:2013-11-14 04:16:57
【问题描述】:

我正在尝试使用 PDO 来填充用户对象。

我已经稍微简化了我的代码,(SQL 等),但基本上我有这个:

    Class User
    {       
        protected $id;  
        protected $email;
        protected $password;

        public function tokenCheck()
        {
            $sql = 'SELECT * FROM blah LIMIT 1';

            $STH = $this->DBH->prepare($sql);
            $STH->setFetchMode(PDO::FETCH_INTO, $this);
            $STH->execute();

            $result = $STH->fetch();
        }

    }

我打电话给:

$User->tokenCheck();

当我 var dump 我的用户对象时,我得到:

object(User)#1 (7) { ["id":protected]=> NULL [ ["email"]=> NULL ["password":protected]=> NULL ["token":protected]=> NULL }

我已尝试将我的所有属性设置为公开,但结果相同。所有值都保持为 NULL。

This 所以答案对我也不起作用。

【问题讨论】:

  • 尝试使用适当的名称专门选择您需要的列(如果名称不完全匹配,请使用别名)
  • 也只是一个注释,User 不应该负责获取有关自身的信息。应该有一个不同的对象来收集这些数据并用它创建一个User 对象。
  • 您是否尝试过对 $result 变量使用 var_dump 来检查它是否为空?
  • 该死的。是的。就是这样,由于某种原因,没有在 SQL 中选择散列值。将我的所有属性设置为公开,然后它就起作用了。

标签: php pdo


【解决方案1】:

你试过了吗

$STH->fetchAll(PDO::FETCH_CLASS, "User");

它将实例化一个用您的数据填充的用户类。

【讨论】:

  • 这只是给了我 array(0) { }
  • 你在哪里调用实例化?正如宇智波斑所说,获取有关自身的数据不应该是用户的类责任。
  • 谢谢,那么应该从哪里获取数据呢?不是控制器,工厂类?
  • 是的,我会使用工厂类。
【解决方案2】:

问题是你试图在你的 User 类中选择 id、email 和密码,但它们是受保护的,你甚至可以将属性排除在外,因为列名将定义属性名。

Class User
{       
    PUBLIC $id;  
    PUBLIC $email;
    PUBLIC $password;

    public function tokenCheck()
    {
        $sql = 'SELECT * FROM blah LIMIT 1';

        $STH = $this->DBH->prepare($sql);
        $STH->setFetchMode(PDO::FETCH_INTO, $this);
        $STH->execute();

        $STH->fetch();
    }

}

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多