Set di risultati
Una query Select restituirà sempre un oggetto set di risultati contenente zero o più record. Esistono diversi modi per ottenere i dati da questo set di risultati a seconda del caso d’uso. I record vengono recuperati come oggetti per impostazione predefinita, a meno che tu non modifichi la modalità di recupero (vedi: setFetchMode).
Il caso più comune è iterare sul set di risultati con un ciclo foreach().
// Query statica:
$result = $connection->query("SELECT field1, field2 FROM {mytable}");
foreach ($result as $record) {
// Fare qualcosa con ciascun $record
}
// Query dinamica:
$result = $query->execute();
foreach ($result as $record) {
// Fare qualcosa con ciascun $record.
}
Tuttavia, a seconda dell’utilizzo dei risultati, esistono diversi altri modi per ottenere i record.
Per recuperare esplicitamente il record successivo, usa:
$record = $result->fetch(); // Usa la modalità di recupero predefinita. $record = $result->fetchObject(); // Recupera come oggetto stdClass. $record = $result->fetchAssoc(); // Recupera come array associativo.
Se non c’è un record successivo, viene restituito FALSE. In genere è meglio evitare fetch() a favore di fetchObject() e fetchAssoc(), poiché questi ultimi sono più autoesplicativi. Se hai bisogno di usare un’altra modalità di recupero supportata da PDO, usa fetch().
Per ottenere un solo campo dal set di risultati, usa:
$record = $result->fetchField($column_index);
Il valore predefinito di $column_index è 0 per il primo campo.
Per contare il numero di righe restituite da un’operazione DELETE, INSERT o UPDATE, usa:
$number_of_rows = $result->rowCount();
Per contare il numero di righe restituite da un’operazione SELECT, usa:
$number_of_rows = $connection->select('mytable')->countQuery()->execute()->fetchField();
Per recuperare tutti i record in un singolo array, usa uno dei seguenti metodi:
// Recupera tutti i record in un array indicizzato di oggetti stdClass. $result->fetchAll(); // Recupera tutti i record in un array associativo indicizzato dal campo specificato. $result->fetchAllAssoc($field); // Recupera un set di risultati a 2 colonne come array associativo campo0 => campo1. $result->fetchAllKeyed(); // Puoi anche specificare quali due campi usare indicando i numeri delle colonne. $result->fetchAllKeyed(0,2); // corrisponde a campo0 => campo2 $result->fetchAllKeyed(1,0); // corrisponde a campo1 => campo0 // Se ti serve un array dove chiavi e valori contengono lo stesso campo (ad esempio per creare un elemento di form 'checkboxes'), il seguente è un metodo valido: $result->fetchAllKeyed(0,0); // corrisponde a campo0 => campo0, es. [article] => [article] // Recupera un set di risultati a 1 colonna come un unico array. $result->fetchCol(); // È possibile specificare il numero di colonna, altrimenti predefinito è la prima colonna. $result->fetchCol($column_index);
Nota che fetchAll() e fetchAllAssoc() per impostazione predefinita useranno la modalità di recupero impostata nella query (array numerico, array associativo o oggetto). Questo può essere modificato passando una nuova costante di modalità di recupero. Per fetchAll() è il primo parametro. Per fetchAllAssoc() è il secondo parametro. Esempi:
// Ottieni un array di array indicizzati sul campo 'id'.
$result->fetchAllAssoc('id', PDO::FETCH_ASSOC);
// Ottieni un array di array con sia chiavi numeriche che associative.
$result->fetchAll(PDO::FETCH_BOTH);
Poiché PHP supporta le chiamate concatenate ai metodi sugli oggetti restituiti, è molto comune saltare del tutto la variabile $result, ad esempio:
// Ottieni un array associativo di id e titoli.
$examples = $connection->query("SELECT id, title FROM {mytable}")->fetchAllKeyed();
// Ottieni un singolo record dal database.
$myobj = $connection->query("SELECT * FROM {mytable} WHERE example = :example", [':example' => $example])->fetchObject();
// Ottieni un singolo valore dal database.
$myval = $connection->query("SELECT example FROM {mytable} WHERE id = :id", [':id' => $id])->fetchField();
Se ti serve un array semplice del tipo [1, 2, 3, 4, 5], dovrai accontentarti di qualcosa di più simile a [1=>1, 2=>2, 3=>3, 4=>4, 5=>5]. Puoi ottenerlo con:
$ids = $connection->query("SELECT id FROM {example}")->fetchAllKeyed(0,0);