Resultsets
Een SELECT-query retourneert altijd een resultset-object dat nul of meer records bevat. Er zijn verschillende manieren om gegevens uit deze resultset te halen, afhankelijk van het gebruiksscenario. Records worden standaard opgehaald als objecten, tenzij je de fetch-modus wijzigt (zie: setFetchMode).
Het meest voorkomende geval is het doorlopen van de resultset met een foreach()-lus.
// Statische query:
$result = $connection->query("SELECT field1, field2 FROM {mytable}");
foreach ($result as $record) {
// Doe iets met elke $record
}
// Dynamische query:
$result = $query->execute();
foreach ($result as $record) {
// Doe iets met elke $record.
}
Afhankelijk van waarvoor je de resultaten nodig hebt, zijn er echter verschillende andere manieren om records op te halen.
Om expliciet het volgende record op te halen, gebruik je:
$record = $result->fetch(); // Gebruik de standaard fetch-modus. $record = $result->fetchObject(); // Haal op als een stdClass-object. $record = $result->fetchAssoc(); // Haal op als een associatieve array.
Als er geen volgend record is, retourneert dit FALSE. Meestal moet je fetch() vermijden en de voorkeur geven aan fetchObject() of fetchAssoc(), omdat deze zelfdocumenterender zijn. Als je een andere door PDO ondersteunde fetch-modus nodig hebt, gebruik je fetch().
Om slechts één veld uit de resultset op te halen, gebruik je:
$record = $result->fetchField($column_index);
De standaardwaarde van $column_index is 0 voor de eerste kolom.
Om het aantal rijen te tellen dat wordt geretourneerd door een DELETE-, INSERT- of UPDATE-statement, gebruik je:
$number_of_rows = $result->rowCount();
Om het aantal rijen te tellen dat wordt geretourneerd door een SELECT-statement, gebruik je:
$number_of_rows = $connection->select('mytable')->countQuery()->execute()->fetchField();
Om alle records in één array op te halen, gebruik je een van de volgende methoden:
// Haal alle records op in een genummerde array van stdClass-objecten. $result->fetchAll(); // Haal alle records op in een associatieve array, gesleuteld op het opgegeven veld. $result->fetchAllAssoc($field); // Haal een resultaatset van 2 kolommen op als een associatieve array van veld 0 => veld 1. $result->fetchAllKeyed(); // Je kunt ook aangeven welke twee velden je wilt gebruiken door de kolomnummers te specificeren. $result->fetchAllKeyed(0,2); // geeft veld 0 => veld 2 $result->fetchAllKeyed(1,0); // geeft veld 1 => veld 0 // Als je een array nodig hebt waarin sleutels en waarden hetzelfde veld bevatten (bijv. voor een 'checkboxes'-form element), is dit een geldige manier: $result->fetchAllKeyed(0,0); // geeft veld 0 => veld 0, bv. [article] => [article] // Haal een resultaatset met 1 kolom op als een enkele array. $result->fetchCol(); // Kolomnummer kan worden opgegeven, anders standaard naar de eerste kolom. $result->fetchCol($column_index);
Merk op dat fetchAll() en fetchAllAssoc() standaard ophalen met de fetch-modus die op de query is ingesteld (genummerde array, associatieve array of object). Dit kan worden gewijzigd door een nieuwe fetch-modusconstante door te geven. Voor fetchAll() is dit de eerste parameter, voor fetchAllAssoc() de tweede parameter. Voorbeelden:
// Verkrijg een array van arrays gesleuteld op het veld 'id'.
$result->fetchAllAssoc('id', PDO::FETCH_ASSOC);
// Verkrijg een array van arrays met zowel numerieke als associatieve sleutels.
$result->fetchAll(PDO::FETCH_BOTH);
Aangezien PHP method chaining op geretourneerde objecten ondersteunt, wordt de variabele $result vaak helemaal weggelaten, bijvoorbeeld:
// Verkrijg een associatieve array van ids naar titels.
$examples = $connection->query("SELECT id, title FROM {mytable}")->fetchAllKeyed();
// Haal een enkel record uit de database.
$myobj = $connection->query("SELECT * FROM {mytable} WHERE example = :example", [':example' => $example])->fetchObject();
// Haal een enkele waarde uit de database.
$myval = $connection->query("SELECT example FROM {mytable} WHERE id = :id", [':id' => $id])->fetchField();
Als je een eenvoudige array wilt zoals [1, 2, 3, 4, 5], zul je tevreden moeten zijn met iets als [1=>1, 2=>2, 3=>3, 4=>4, 5=>5]. Dit kun je verkrijgen met:
$ids = $connection->query("SELECT id FROM {example}")->fetchAllKeyed(0,0);