【问题标题】:PDO FETCH_CLASS unexpected behaviourPDO FETCH_CLASS 意外行为
【发布时间】:2015-07-24 15:29:16
【问题描述】:

我正在尝试通过 DAO 返回我的 User 类的新实例,并且正在努力查看它是否正常工作,它肯定没有像我预期的那样工作,因为我没有定义 User 属性,但我是仍然可以看到数据库中的所有用户字段和值。

类数据库

class Database
{   
    private $dbh;

    public function __construct()
    {
        $this->openConnection();
    }

    private function openConnection()
    {   
        try {
            $this->dbh = new PDO('mysql:host=localhost; dbname=stats', 'user', 'pass');
            $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            'There was an error connecting to the database, error: ' . $e->getMessage();
        }
    }

    public function query($sql, $params)
    {   
        $stmt = $this->dbh->prepare($sql, $params);
        $stmt->execute($params);
        return $stmt;
    }
}

类 UserDao

class UserDao
{   
    private $db;
    public function __construct($db) 
    {
        $this->db = $db;  

    }

    public function findById($ward_code)
    {   
        $record = $this->db->query("SELECT * from ward_statistics where WardCode = :WardCode", array(':WardCode' => $ward_code));
        $record->setFetchMode(PDO::FETCH_CLASS, 'User')
        $user = $record->fetch();
        return $user;       
    }
}

类用户

class User 
{
    // with no properties defined, I still get a 
    // full result set from UserDAO::findById()

}

用法

$db = new Database();
$dao = new UserDao($db);
$user = $dao->findById('AMED');
var_dump($user);

生成一个对象,该对象具有来自数据库的完整结果集(由 WardCode 匹配的单行),所有字段都填充了正确的值(来自数据库)。

虽然这看起来没问题 - 我认为 PDO::FETCH_CLASS 要求属性在类中可用。

我担心的是,几天前的question I posted on Code Review 还告诉我,诸如 findById 之类的类方法应该创建新的类实例,或者更新现有的类实例,但我似乎正在做的只是检索数据库中的一行。

谢谢

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    如果您只需要 1 个对象,请将 fetchAll 替换为 fetch。根据documentation

    PDOStatement::fetchAll — 返回一个包含所有结果的数组 设置行

    【讨论】:

    • 这给出了错误警告:PDOStatement::fetch() 期望参数 2 很长,字符串在第 14 行的 /Applications/XAMPP/xamppfiles/htdocs/classes/class_UserDao.php 中给出
    • 谢谢,修复了数组问题,请查看编辑后的问题
    • @CIvemy 你得到一个新的类实例,它是使用从数据库中获取的数据构建的。你不喜欢什么?
    • 但它与类属性无关,这让我觉得有些地方不正确。我正在获取数据,但不是与实例相关的数据,因为属性未在类中定义
    • @CIvemy 那么,您创建了一个“用户”类,但它没有被 PDO 使用?它创建了某种简单的结构?
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多