fetch_column - Clase PDO PHP Fetch
pdo php ejemplos (4)
Estoy aprendiendo pdo en PHP, para hacer que el acceso a la base de datos sea más fácil y eficiente. Una explicación que he leído para buscar _class es que las propiedades de tu objeto se establecen ANTES de que se llame al constructor. ¿Qué significa esto? Cualquier dirección es muy apreciada.
Digamos que tienes este snippit de código
<?php
class Foo {
public $bar;
public function __construct()
{
$this->bar = 1;
}
}
$stmt = $dbh->prepare("SELECT bar FROM foo");
$stmt->setFetchMode(PDO::FETCH_CLASS, ''Foo'');
$stmt->execute();
$obj = $stmt->fetch()
?>
La propiedad de la barra para $ obj se establecerá en "1", no lo que se recupera de la base de datos.
Si desea que se establezca en el resultado de la base de datos en lugar de "1", puede cambiar el modo de búsqueda a
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, ''Foo'');
Esto hace que se llame al constructor antes de asignar los resultados a las propiedades
En lugar de usar: FetchAll(PDO::FETCH_CLASS, ''classname'')
Puede usar: fetchObject(''classname'')
Ejemplo:
class Car extends DatabaseTable {
const TABLE_NAME = ''cars'';
// Table Columns
private $color;
private $brand;
private $type;
public function __construct($pdo, $id = false)
{
parent::__construct($pdo, TABLE_NAME, $id);
}
public static function getAll($pdo, $order = ''id'') {
$query = ''SELECT * FROM '' . self::TABLE_NAME . ''
ORDER BY '' . $order;
$statement = $pdo->prepare($query);
$objects = [];
while ($obj = $statement->fetchObject(self::class, [$pdo])) {
$objects[$obj->getId()] = $obj;
}
return $objects;
}
El Constructor padre simplemente establece sus 3 propiedades como: $this->id = $id;
Esto significa que al usar PDO para devolver un resultado en un objeto personalizado, se requiere que establezca las variables de miembro que corresponden a las claves de resultado de la consulta.
como:
class User
{
//Predefine Here
public $id;
public $username;
public $password;
public $email;
public $hash;
public function profileLink()
{
return sprintf(''<a href="/profile/%s">%s</a>'',$this->id,$this->username);
}
}
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
foreach($result as $user)
{
echo $user->profileLink();
}
De esta forma, PDO puede establecer las variables para el objeto fuera de su alcance interno.
si tu clase de usuario era así:
class User
{
}
entonces PDO no podría establecer los valores fuera del alcance, ya que no hay propiedades definidas.
Mirando hacia atrás en PDO :: FETCH_CLASS, realmente no necesita definir las variables como públicas ni privadas (a partir de PHP 7.0), podría definir una clase vacía y PHP PDO llenará los atributos como $ Class-> atributo incluso si ellos no están definidos
esto es muy útil porque puede reutilizar clases con múltiples consultas que tratan la misma tabla pero que pueden devolver columnas diferentes