47 votes

Classe PDO PHP Fetch

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.

52voto

RobertPitt Points 28140

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.

36voto

Kris Points 3802

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.

3voto

Halfacht Points 122

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;

2voto

Juan Vilar Points 138

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X