PROJET AUTOBLOG


le hollandais volant links

Site original : le hollandais volant links

⇐ retour index

PDO Fetch Modes - Treating PHP Delusions

mardi 21 septembre 2021 à 19:55

C’est vraiment génial ça :-D

(oui je découvre des choses :p)

Normalement, en PDO, un fetchAll() retourne un objet, ou, dans mon cas, un tableau. Chaque élément du tableau est lui-même un tableau contenant les colonnes de la BDD. :

$bdd->query("SELECT id, nom, prenom FROM table")->fetchAll(PDO::FETCH_ASSOC);
array(
  [0] => Array
        (
            [id] => 184e34da69fe1a6b2337be58388dd3b9
            [nom] => dupond
            [prenom] => jean
        )

  [1] => Array
        (
            [id] => 53957652a3c1f9b6790717888fea0a31
            [nom] => ofgates
            [prenom] => john
        )
)

Notez que j’ai utilisé PDO::FETCH_ASSOC qui permet d’avoir un tableau associatif "colonne => valeur". Si on ne le met pas, on aura un index de la colonne, en plus d’un assoc :

  [1] => Array
        (
            [0] => 53957652a3c1f9b6790717888fea0a31
            [id] => 53957652a3c1f9b6790717888fea0a31
            [1] => ofgates
            [nom] => ofgates
            [2] => john
            [prenom] => john
        )

Ça peut servir si l’on fait des ittérations numériques sur les index, mais dans mon cas, j’utilise toujours les noms des colonnes.

Maintenant, problème : dans le tableau de tous les résultats obtenu avec fetchAll(), on a un index : 0, 1, mis en évidence là :

  [0] => Array
        (
            …
        )

  [1] => Array
        (
           … 
        )

Moi j’ai besoin que ces 0 et 1 soient remplacés par l’ID de l’élément du tableau.
Je sais que dans ma BDD, l’ID, qui n’est autre qu’un MD5() ou un GUID, est unique.

Je peux utiliser l’option PDO::FETCH_UNIQUE :

$bdd->query("SELECT id, nom, prenom FROM table")->fetchAll(PDO::FETCH_UNIQUE);

Cela va utiliser le contenu de la première colonne ("id") comme index du tableau retourné par fetchAll() :

array(
  [184e34da69fe1a6b2337be58388dd3b9] => Array
        (
            [0] => 184e34da69fe1a6b2337be58388dd3b9
            [id] => 184e34da69fe1a6b2337be58388dd3b9
            [1] => dupond
            [nom] => dupond
            [2] => jean
            [prenom] => jean
        )

  [53957652a3c1f9b6790717888fea0a31] => Array
        (
            [0] => 53957652a3c1f9b6790717888fea0a31
            [id] => 53957652a3c1f9b6790717888fea0a31
            [1] => ofgates
            [nom] => ofgates
            [2] => john
            [prenom] => john
        )
)

Ça marche, mais ça remis les données redondantes.
Heureusement, on peut mettre les deux options :

$bdd->query("SELECT id, nom, prenom FROM table")->fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC);

Et là, j’ai ce que je veux :

array(
  [184e34da69fe1a6b2337be58388dd3b9] => Array
        (
            [id] => 184e34da69fe1a6b2337be58388dd3b9
            [nom] => dupond
            [prenom] => jean
        )

  [53957652a3c1f9b6790717888fea0a31] => Array
        (
            [id] => 53957652a3c1f9b6790717888fea0a31
            [nom] => ofgates
            [prenom] => john
        )
)

Attention :
— il existe un grand nombre d’options PDO. Ici, j’en ai deux qui sont compatibles entre-elles. Toutes ne le sont pas.
— FETCH_UNIQUE va faire en sorte que les éléments de l’index du tableau seront unique (c’est obligé, pour un tableau). Ici ça ne poste pas de problème car l’ID est un hash unique (je déclare cette colonne comme UNIQUE quand je construit la BDD, par exemple). Si votre "id" n’est pas unique, les derniers écraseront les premiers.
— FETCH_UNIQUE utilise la première colonne demandé dans la requête. Ici, c’est mon "id". Si j’avais voulu utiliser "nom", j’aurais dû utiliser cette requête :

$bdd->query("SELECT nom, id, prenom FROM table")->fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC);

Ici, la première colonne est "nom", et "id" vient en second, suivi de "prenom".

Bien-sûr, si l’utilise le « * », on peut faire ça :

$bdd->query("SELECT nom, * FROM table")->fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC);

Pour forcer d’avoir "nom" en premier, même si ce n’est pas la colonne en première dans la liste des colonnes de la BDD.

J’arrête là pour les exemples, ça me suffit.
Je vous laisse voir les différents modes. Le "FETCH_KEY_PAIR" peut-être utile parfois aussi.


— (permalink)