php - 在 PHP 中,如何设置默认的 PDO 获取类?

标签 php pdo

使用 PDO::setAttribute ,在将 PDO::ATTR_DEFAULT_FETCH_MODE 设置为 PDO::FETCH_CLASS 时如何提供类名。

这是我正在使用的代码。我想对其进行设置,以便我的所有行都作为 DB_Row 的实例返回:

class DB_Row extends ArrayObject {}

$db = new PDO('mysql:dbname=example;host=localhost', 'user', 'pass');
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_CLASS);

$stmt = $db->query("SELECT * FROM `table` WHERE `id` = 1;");

$row = $stmt->fetch(); // I want a DB_Row by default!

上面的代码导致 PDOException,因为没有分配 DB_Row 类名。

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General    error: No fetch class specified

我该怎么做?

提前致谢..

解决方案:我使用了 fireeyedboy 的答案。它最适合我的情况,因为我已经扩展了 PDOStatement 用于日志记录......

class DB extends PDO {
    public function __construct($host = null, $user = null, $pass = null, $db = null) {
        try {
            parent::__construct('mysql:dbname=' . $name .';host=' . $host, $user, $pass);
            $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_CLASS);
            $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('DB_Query', array('DB_Row')));
        } catch (PDOException $e) {
            die('Database Error');
        }
    }
}

class DB_Query extends PDOStatement {
    private $class;
    protected function __construct ($class = 'DB_Row') {
        $this->class = $class;
        $this->setFetchMode(PDO::FETCH_CLASS, $this->class);
    }
}

class DB_Row extends ArrayObject {
    public function __set($name, $val) {
        $this[$name] = $val;
    }
    public function __get($name) {
        return $this[$name];
    }
}

最佳答案

我认为它应该返回一个 stdclass 实例,所以这将是一个错误 - 但必须在代码中查找它以进行验证。如果到那时还没有被接受的答案,就会这样做。

有用的是使用 PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE 然后提供一个类名作为第一列。虽然这是一个 hack:

$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);

$stmt = $db->query("SELECT 'classname', * FROM `table` WHERE `id` = 1;");

编辑:正如此处 promise 的代码。相关代码在这里http://lxr.php.net/xref/PHP_5_4/ext/pdo/pdo_stmt.c#940所以设置 for using fetch() 只能通过 FETCH_CLASSTYPE 实现。替代方法是使用 PDOStatement::fetchObject()

关于php - 在 PHP 中,如何设置默认的 PDO 获取类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617275/

相关文章:

php - sqlite中的PDO::beginTransaction()和外键冲突

PHPStorm 无法识别超过 2 个链式公共(public)方法

php - 如何在Laravel 6中从父目录加载多个.env文件或加载.env

php - Mysql父记录在子表中有多个记录显示在一列中

php - Mysql 存储函数截断长度为 65535 个字符

php - CakePHP PDO 准备语句

PHP PDO dblib 不工作

php - SPL_AUTOLOAD_REGISTER 覆盖 PHP 扩展

php - getcwd() 和 exec ('pwd' ) 总是匹配吗?

php - 如何使用简单的 CSS 和 Javascript 隐藏其余内容