Lavorare con il database in Drupal 7 – Lezione 7 – Elaborazione dei risultati di una query (fetch)
Una query di selezione restituirà sempre un risultato che può contenere da 0 a più record. Esistono diversi modi per elaborare i dati restituiti, e puoi scegliere quello più adatto alle tue esigenze.
Il metodo più comune per elaborare i risultati è utilizzare un ciclo foreach():
<?php
$result = db_query("SELECT nid, title FROM {node}");
foreach ($result as $record) {
// Esegui un’azione su ogni record
$node = node_load($record->nid);
}
?>
A seconda di ciò che devi fare con i risultati, puoi anche utilizzare altri metodi di elaborazione dei record. Per ottenere esplicitamente i record uno per volta, usa:
<?php
$record = $result->fetch(); // Usa l’elaborazione predefinita (oggetto).
$record = $result->fetchObject(); // Restituisce i record come oggetti.
$record = $result->fetchAssoc(); // Restituisce i record come array associativi.
?>
Quando non ci sono più record disponibili, questi metodi restituiscono FALSE. È preferibile usare fetchObject() o fetchAssoc() anziché fetch(), poiché rendono più chiaro il formato in cui i dati verranno restituiti. È anche possibile cambiare il modo in cui fetch() elabora i risultati, definendo una modalità predefinita.
Per recuperare un singolo campo da un record, utilizza:
<?php
$record = $result->fetchField($column_index);
?>
Il valore predefinito di $column_index è 0. Per contare il numero di righe restituite dalla query, usa:
<?php
$number_of_rows = $result->rowCount();
?>
Per ottenere tutti i record in un singolo array, puoi usare uno dei seguenti metodi:
<?php
// Restituisce il risultato come array di oggetti.
$result->fetchAll();
// Restituisce un array associativo con il nome del campo come chiave e il valore come dato.
$result->fetchAllAssoc($field);
// Restituisce un array associativo in cui la prima colonna è la chiave e la seconda il valore.
$result->fetchAllKeyed();
$result->fetchAllKeyed(0,2); // L’array sarà: Colonna 0 => Colonna 2
$result->fetchAllKeyed(1,0); // L’array sarà: Colonna 1 => Colonna 0
// Restituisce una singola colonna come array semplice.
$result->fetchCol();
// Conta il numero di record per la colonna specificata (per impostazione predefinita la prima colonna).
$result->fetchCol($column_index);
?>
Nota che fetchAll() e fetchAllAssoc() usano la modalità di recupero (fetch mode) predefinita, ma è possibile specificarla manualmente passando una costante di modalità di fetch. Per fetchAll() sarà il primo parametro, mentre per fetchAllAssoc() sarà il secondo.
Poiché PHP supporta i metodi concatenati per gli oggetti restituiti, è possibile omettere completamente la variabile $result:
<?php
// Ottenere un array associativo nid => title
$nodes = db_query("SELECT nid, title FROM {node}")->fetchAllKeyed();
// Ottenere un singolo record come oggetto
$node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchObject();
// Ottenere un singolo valore dal database
$title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchField();
?>