Les fetch modes de PDO 4 : les modes modificateurs

Dernière partie de ma série consacrée aux modes de récupération de PDO, voici les modes que j’appelle “modificateurs”, car ils ne peuvent pas être utilisés tout seuls et se contentent de modifier le comportement d’un autre mode.

Pour utiliser un modificateur, il suffit d’effectuer un “ou” binaire, par exemple :

$results->fetchAll(PDO::FETCH_TRUC | PDO::FETCH_BIDULE | PDO::FETCH_CHOUETTE);

La plupart de ces modes ne fonctionnent pas lorsqu’ils sont définis par la méthode setFetchMode. Ça ressemble a un bug, mais vu que rien n’est documenté, c’est peut-être normal…

FETCH_CLASSTYPE

Ce mode est destiné à être utilisé conjointement avec FETCH_CLASS. Lorsqu’il est présent, la première colonne de la requête SQL indique le nom de la classe à utiliser.

Exemple :

class MyClass1 { }
class MyClass2 { }
$sql = 'SELECT CONCAT("MyClass",id), id, login FROM user LIMIT 0,2';
$results->fetchAll(PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE);
Array
(
  [0] => MyClass1 Object
    (
      [id] => 1
      [login] => sload
    )

  [1] => MyClass2 Object
    (
      [id] => 2
      [login] => js
    )

)

Si une classe n’existe pas, stdClass est utilisé (comme FETCH_OBJ).

Je suis vraiment curieux de savoir à quoi ce mode peut bien servir !

FETCH_GROUP

Ce mode est plutôt intéressant : il permet de regrouper les résultats selon la valeur de la première colonne de la requête. Il ne fonctionne qu’avec fetchAll.

Exemple, avec FETCH_ASSOC :

$sql = 'SELECT hash_algo, id, login FROM user LIMIT 0,4';
$results->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_GROUP);
Array
(
  [sha1] => Array
    (
      [0] => Array
        (
          [id] => 1
          [login] => toto
        )

    )

  [md5] => Array
    (
      [0] => Array
        (
          [id] => 2
          [login] => titi
        )

      [1] => Array
        (
          [id] => 3
          [login] => tata
        )

      [2] => Array
        (
          [id] => 4
          [login] => tutu
        )
    )
)

FETCH_UNIQUE

Ce mode retourne les résultats indexés selon la valeur de la première colonne de la requête. Outre l’aspect “suppression des doublons” (qui est une conséquence naturellement de l’indexation), ce mode est intéressant car il retourne un tableau associatif.

Par exemple, avec FETCH_ASSOC, ce mode permet d’obtenir directement les utilisateurs indexés par leur id :

$sql = 'SELECT id, login, email FROM user LIMIT 0,2';
print_r($results->fetchAll(PDO::FETCH_ASSOC | PDO::FETCH_UNIQUE));
Array
(
  [1] => Array
    (
      [login] => toto
      [email] => toto@foo
    )

  [2] => Array
    (
      [login] => titi
      [email] => titi@foo
    )
)

Et comme ce mode utilise moins de mémoire, il est un peu plus rapide que FETCH_ASSOC seul quand il n’y a pas de doublons.

FETCH_SERIALIZE

Pour l’instant je n’ai pas réussi à obtenir de ce mode autre chose que des messages du genre : SQLSTATE[HY000]: General error: PDO::FETCH_SERIALIZE can only be used together with PDO::FETCH_CLASS ou SQLSTATE[HY000]: General error: cannot unserialize class. J’ai donc ouvert un bug (#42916).

FETCH_PROPS_LATE

Ce mode est destiné à être utilisé conjointement avec FETCH_CLASS pour que les propriétés de la classe soient écrites *après* l’appel du constructeur.

Et voila, c’est la fin de la série d’articles sur les fetch modes de PDO… Tout feedback est le bienvenue ! Et maintenant il est temps d’optimiser ses scripts PHP :-)

2 thoughts on “Les fetch modes de PDO 4 : les modes modificateurs

  1. Pingback: 10 bonnes raisons d’utiliser PDO (PHP Data Object) » Tilàcica

Comments are closed.