La méthode
PDOStatement::execute
exécute une requête préparée.
Dans le cas d'une requête "simple", il n'y a pas de paramètre.
Cette méthode renvoie :
true
quand la requête a bien été exécutée.
false
quand il y a eu un problème.
NB : cette méthode est appelée sur l'instance de PDOStatement
récupérée lors de la préparation.
Exemple :
// Exécution de la requête
$statement->execute() or die(var_dump($statement->errorInfo())) ;
La méthode
PDOStatement::fetchAll
permet des récupérer le résultat d'une requête exécutée.
NB1 : cette méthode est appelée sur l'instance de PDOStatement
, après exécution.
Version sans paramètre
Par défaut, fetchAll
ne prend pas de paramètre.
Dans ce cas, le résultat est retourné sous la forme d'un "simple" tableau PHP.
Version PDO::FETCH_OBJ
Il est possible de fournir le paramètre int $mode
avec la valeur PDO::FETCH_OBJ
.
Dans ce cas, le résultat est un tableau d'objets (génériques) PHP.
pdo_request_obj.php
<?php
// Informations sur la BDD et le serveur qui la contient
$db_name = "gamesdb" ; $db_host = "127.0.0.1" ; $db_port = "3306" ;
$db_user = "root" ; $db_pwd = "root" ;
// Connexion à la BDD
try{
$dsn = 'mysql:dbname=' . $db_name . ';host='. $db_host. ';port=' . $db_port;
$pdo = new PDO($dsn, $db_user, $db_pwd) ;
}catch(\Exception $ex){
die("Erreur : " . $ex->getMessage()) ;
}
// Préparation d'une requête simple
$sql = "SELECT * FROM games" ;
$statement = $pdo->prepare($sql) ;
// Exécution de la requête
$statement->execute() or die(var_dump($statement->errorInfo())) ;
// Récupération de la réponse sous forme d'un tableau d'objets
$results = $statement->fetchAll(PDO::FETCH_OBJ) ; ?>
<h1>Liste des jeux</h1>
<ul>
<!--Affichage du champ 'name' des objets récupérés -->
<?php foreach ($results as $game): ?>
<li><?= $game->name ?></li>
<?php endforeach;?>
</ul>
Version PDO::FETCH_CLASS
:
Il est possible de fournir le paramètre int $mode
avec la valeur PDO::FETCH_CLASS
,
accompagné d'un autre paramètre string $class
indiquant une classe PHP dans laquelle
les objets retournés seront castés.
Dans ce cas, le résultat est un tableau d'instances de la classe $class
.
L'exemple ci-après montre comment récupérer les enregistrements de la BD games
sous la forme
d'un tableau d'objets instances d'une classe GameRenderer
que nous allons définir.
L'intérêt des instances de GameRenderer
sera qu'elles possèdent une méthode (custom) nommée
getHTML
qui retourne une version HTML de l'objet, facilitant ainsi son affichage dans une page.
La première étape consiste donc à définir la classe GameRenderer
(qu'on a décidé de mettre
dans le namespace gdb
pour "games database").
gdb/GameRenderer.php
<?php
namespace gdb ;
class GameRenderer
{
public function getHTML(){?>
<div class="game">
<b><?= $this->name ?></b>
<div><?= $this->description ?></div>
</div>
<?php }
}
La classe GameRenderer
peut alors être utilisée dans le fetchAll
avec le paramètre
PDO::FETCH_CLASS
: vous pourrez remarquer dans la boucle finale d'affichage des jeux
que l'on peut appeler la méthode (custom) getHTML
sur chaque instance du résultat de la requête.
NB : ne pas oublier l'Autoloader
pour que PHP charge bien la classe GameRenderer
.
pdo_request_class.php
<!--Définition de la classe CSS utilisée dans GameRenderer-->
<style>
.game{
margin-bottom: 10px ;
border : 3px solid black ;
background: lightgray;
padding: 5px
}
</style>
<?php
require "." . DIRECTORY_SEPARATOR .'class'.DIRECTORY_SEPARATOR.'Autoloader.php' ;
Autoloader::register();
try{ // Connexion à la BDD
$db_name = "gamesdb" ; $db_host = "127.0.0.1" ; $db_port = "3306" ;
$db_user = "root" ; $db_pwd = "root" ;
$dsn = 'mysql:dbname=' . $db_name . ';host='. $db_host. ';port=' . $db_port;
$pdo = new PDO($dsn, $db_user, $db_pwd) ;
}catch(\Exception $ex){
die("Erreur : " . $ex->getMessage()) ;
}
// Préparation d'une requête simple
$statement = $pdo->prepare("SELECT * FROM games") ;
$statement->execute() or die(var_dump($statement->errorInfo())) ;
// Récupération de la réponse sous forme d'un tableau d'instances de GameRenderer
$results = $statement->fetchAll(PDO::FETCH_CLASS, "\gdb\GameRenderer") ; ?>
<h1>Liste des jeux</h1>
<!--Affichage des instances récupérées -->
<?php foreach ($results as $game): ?>
<?= $game->getHTML() ?>
<?php endforeach;?>
(données issues de <a href="https://fr.wikipedia.org/">Wikipédia</a>)
Remarque : il existe d'autres moyens pour récupérer différemment les résultats d'une requête comme
PDOStatement::fetch
,
PDOStatement::fetchColumn
,
PDOStatement::fetchObject
,
...