Jeux de résultats
Une requête Select renverra toujours un objet jeu de résultats contenant zéro ou plusieurs enregistrements. Il existe plusieurs façons d'extraire des données de ce jeu de résultats selon le cas d'utilisation. Par défaut, les enregistrements sont extraits en tant qu'objets, sauf si vous modifiez le mode d'extraction (voir : setFetchMode).
Le cas le plus courant est de parcourir le jeu de résultats avec une boucle foreach().
// Requête statique : $result = $connection->query("SELECT field1, field2 FROM {mytable}"); foreach ($result as $record) { // Faire quelque chose avec chaque $record } // Requête dynamique $result = $query->execute(); foreach ($result as $record) { // Faire quelque chose avec chaque $record. }
Cependant, selon l'utilisation prévue des résultats, il existe plusieurs autres façons d'obtenir les enregistrements.
Pour récupérer explicitement l'enregistrement suivant, utilisez :
$record = $result->fetch(); // Utiliser le mode d'extraction par défaut. $record = $result->fetchObject(); // Extraire en tant qu'objet stdClass. $record = $result->fetchAssoc(); // Extraire en tant que tableau associatif.
Si aucun enregistrement suivant n'existe, FALSE est retourné. En général, il est conseillé d'éviter fetch() au profit de fetchObject() ou fetchAssoc(), car ces derniers sont plus explicites. Si vous devez utiliser un autre mode d'extraction supporté par PDO, utilisez fetch().
Pour récupérer un seul champ du jeu de résultats, utilisez :
$record = $result->fetchField($column_index);
La valeur par défaut de $column_index est 0, pour le premier champ.
Pour compter le nombre de lignes affectées par une commande DELETE, INSERT ou UPDATE, utilisez :
$number_of_rows = $result->rowCount();
Pour compter le nombre de lignes retournées par une commande SELECT, utilisez :
$number_of_rows = $connection->select('mytable')->countQuery()->execute()->fetchField();
Pour extraire tous les enregistrements d'un coup dans un tableau, utilisez l'une des méthodes suivantes :
// Récupérer tous les enregistrements sous forme d'un tableau indexé d'objets stdClass. $result->fetchAll(); // Récupérer tous les enregistrements sous forme d'un tableau associatif indexé par le champ spécifié. $result->fetchAllAssoc($field); // Récupérer un jeu de résultats à 2 colonnes sous forme de tableau associatif champ 0 => champ 1. $result->fetchAllKeyed(); // Vous pouvez aussi spécifier quelles colonnes utiliser en indiquant leur numéro. $result->fetchAllKeyed(0, 2); // champ 0 => champ 2 $result->fetchAllKeyed(1, 0); // champ 1 => champ 0 // Si vous avez besoin d'un tableau où les clés et valeurs sont identiques (par exemple pour créer un élément de formulaire 'checkboxes'), la méthode suivante est valide : $result->fetchAllKeyed(0, 0); // champ 0 => champ 0, par ex. [article] => [article] // Récupérer un jeu de résultats à 1 colonne sous forme d'un simple tableau. $result->fetchCol(); // Le numéro de colonne peut être spécifié, sinon c'est la première colonne par défaut. $result->fetchCol($column_index);
Notez que fetchAll() et fetchAllAssoc() utiliseront par défaut le mode d'extraction défini dans la requête (tableau numérique, tableau associatif ou objet). Cela peut être modifié en passant une constante de mode d'extraction. Pour fetchAll(), c'est le premier paramètre. Pour fetchAllAssoc(), c'est le second paramètre. Exemples :
// Obtenir un tableau d'associatifs indexé par le champ 'id'. $result->fetchAllAssoc('id', PDO::FETCH_ASSOC); // Obtenir un tableau avec des clés numériques et associatives. $result->fetchAll(PDO::FETCH_BOTH);
Comme PHP supporte l'appel en chaîne des méthodes retournant des objets, la variable $result est souvent sautée complètement, par exemple :
// Obtenir un tableau associatif des ids vers les titres. $examples = $connection->query("SELECT id, title FROM {mytable}")->fetchAllKeyed(); // Obtenir un seul enregistrement de la base. $myobj = $connection->query("SELECT * FROM {mytable} WHERE example = :example", [':example' => $example])->fetchObject(); // Obtenir une seule valeur de la base. $myval = $connection->query("SELECT example FROM {mytable} WHERE id = :id", [':id' => $id])->fetchField();
Si vous souhaitez un simple tableau comme [1, 2, 3, 4, 5], vous devrez accepter quelque chose de plus proche de [1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5]. Vous pouvez obtenir cela avec :
$ids = $connection->query("SELECT id FROM {example}")->fetchAllKeyed(0, 0);