Je suis en train d'apprendre le pdo en php, afin de rendre l'accès aux bases de données plus facile et plus efficace. Une explication que j'ai lue pour fetch _class est que les propriétés de votre objet sont définies AVANT que le constructeur soit appelé. Qu'est-ce que cela signifie ? Je vous remercie de votre aide.
Réponses
Trop de publicités?Cela signifie que lorsque vous utilisez PDO pour renvoyer un résultat dans un objet personnalisé, vous devez définir les variables membres qui correspondent aux clés du résultat de la requête.
comme :
class User
{
//Predefine Here
public $id;
public $username;
public $password;
public $email;
public $hash;
public function profileLink()
{
return sprintf('<a href="http://stackoverflow.com/profile/%s">%s</a>',$this->id,$this->username);
}
}
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
foreach($result as $user)
{
echo $user->profileLink();
}
De cette façon, PDO peut définir les variables de l'objet en dehors de sa portée interne.
si votre classe d'utilisateur était comme ça :
class User
{
}
alors PDO ne serait pas en mesure de définir les valeurs depuis l'extérieur de la portée, car il n'y a pas de propriétés définies.
Disons que vous avez ce bout de code
<?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 propriété de la barre pour $obj sera mise à "1" et non pas ce qui est récupéré de la base de données.
Si vous souhaitez qu'il soit défini comme le résultat de la base de données au lieu de "1", vous pouvez changer le mode de récupération en
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Foo');
Ainsi, le constructeur est appelé avant d'assigner les résultats aux propriétés.
Au lieu d'utiliser : FetchAll(PDO::FETCH_CLASS, 'classname')
Vous pouvez utiliser : fetchObject('classname')
Exemple :
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;
}
Le Constructeur parent définit simplement ses 3 propriétés comme suit : $this->id = $id;
En regardant PDO::FETCH_CLASS, vous n'avez pas vraiment besoin de définir les variables comme publiques ou privées (à partir de PHP 7.0), vous pouvez définir une classe vide et PHP PDO remplira les attributs comme $Class->attribute même s'ils ne sont pas définis.
Ceci est très utile car vous pouvez réutiliser les classes avec des requêtes multiples qui traitent la même table mais qui peuvent retourner des colonnes différentes.