Usando PDO::setAttribute, ¿cómo proporciono el nombre de clase al establecer PDO::ATTR_DEFAULT_FETCH_MODE
en PDO::FETCH_CLASS
?En PHP, ¿cómo configuro la clase de recuperación de PDO predeterminada?
Este es el código que estoy utilizando .. Me gustaría configurarlo para todos mis filas se devuelven como una instancia de 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!
El código anterior da como resultado una PDOException
ya que la clase DB_Row nombre no fue asignado
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: No fetch class specified
¿Qué debo hacer al respecto?
Gracias de antemano ..
SOLUCIÓN : que utilizan respuesta fireeyedboy 's. Se trabajó el mejor para mi situación como ya estaba extendiendo PDOStatement con fines de explotación forestal ...
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];
}
}
¡Gracias por eso! Este es el método que utilicé. La razón principal fue porque no quería definir el nombre de clase en todas mis consultas. En lugar de anular la búsqueda, acabo de agregar esto al constructo: $ this-> setFetchMode (PDO :: FETCH_CLASS, $ this-> class); – McHerbie