使用 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/