[PDO] Affichage par catégorie avec PDO
Posté : 07 juil. 2010, 22:23
PDO offre une option intéressante dans son fetchMode : PDO::FETCH_GROUP qui permet de grouper des entrées par catégorie.
exemple :
plusieurs solutions :
Grâce au fetchAll et son option PDO::FETCH_GROUP, on a en sortie directement un array formateé, avec en clé la catégorie et en valeur les entrées correspondantes
(par contre attention contraiement a PDO::FETCH_COLUMN, on ne choisie pas qui est la catégorie, ca sera uniquement la première colonne)
exemple de code :
tout simplement 
Si on veux que la catégorie sois un autre champs il suffis de le mettre en premier (le prénom par exemple)
et on peux bien sur doubler les valeurs pour avoir des entrées complètes, ce qui sera d'ailleurs plus simple, au niveau portabilité et pour différentes sorties
exemple :
+----+-----------+----------+-------+
| id | firstname | lastname | city |
+----+-----------+----------+-------+
| 1 | Jean | Machin | Paris |
| 2 | Jean | Truc | Nice |
| 3 | Paul | Bla | Nice |
+----+-----------+----------+-------+
on a envie de trier les utilisateurs par ville pour avoir une sortie type :Code : Tout sélectionner
Paris
Jean Machin
Nice
Jean Truc
Paul Bla- Faire une requête DISTINCT sur les villes, et a chaque tour de boucle allé chercher les personnes qui correspondes
- Créer un array temporaire et a chaque tour de boucle ajouter la personne ($tmp[$user['city']][] = $user) , et reboucler ensuite pour créer son tableau
- A chaque tour de boucle vérifier via un buffer si la ville a été mise et afficher les personnes, sinon afficher ville
Grâce au fetchAll et son option PDO::FETCH_GROUP, on a en sortie directement un array formateé, avec en clé la catégorie et en valeur les entrées correspondantes
(par contre attention contraiement a PDO::FETCH_COLUMN, on ne choisie pas qui est la catégorie, ca sera uniquement la première colonne)
exemple de code :
try
{
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch (Exception $e)
{
exit($e->getMessage());
}
$query = $pdo->query("SELECT u.city, u.id, u.firstname, u.lastname FROM test_user u");
if($query)
{
$result = $query->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
print_r($result);
}
en sortieCode : Tout sélectionner
Array
(
[Paris] => Array
(
[0] => Array
(
[id] => 1
[firstname] => Jean
[lastname] => Machin
)
)
[Nice] => Array
(
[0] => Array
(
[id] => 2
[firstname] => Jean
[lastname] => Truc
)
[1] => Array
(
[id] => 3
[firstname] => Paul
[lastname] => Bla
)
)
)
Si on veux que la catégorie sois un autre champs il suffis de le mettre en premier (le prénom par exemple)
SELECT u.firstname, u.id, u.lastname, u.city FROM test_user uCode : Tout sélectionner
Array
(
[Jean] => Array
(
[0] => Array
(
[id] => 1
[lastname] => Machin
[city] => Paris
)
[1] => Array
(
[id] => 2
[lastname] => Truc
[city] => Nice
)
)
[Paul] => Array
(
[0] => Array
(
[id] => 3
[lastname] => Bla
[city] => Nice
)
)
)
SELECT u.city, u.id, u.firstname, u.lastname, u.city FROM test_user u
-- ou version raccourcis
SELECT u.city, u.* FROM test_user uCode : Tout sélectionner
Array
(
[Paris] => Array
(
[0] => Array
(
[id] => 1
[firstname] => Jean
[lastname] => Machin
[city] => Paris
)
)
[Nice] => Array
(
[0] => Array
(
[id] => 2
[firstname] => Jean
[lastname] => Truc
[city] => Nice
)
[1] => Array
(
[id] => 3
[firstname] => Paul
[lastname] => Bla
[city] => Nice
)
)
)