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(); ?>