Trabajar con una base de datos en Drupal 7 - Lección 7 - Procesamiento de resultados de consultas (obtención)
Una consulta SELECT siempre devolverá un resultado con 0 o más registros. Existen varias formas de procesar los resultados, que puedes utilizar según tus necesidades.
La forma más común de trabajar con los resultados es usando un ciclo foreach()
:
<?php $result = db_query("SELECT nid, title FROM {node}"); foreach ($result as $record) { // hacer algo con cada $record $node = node_load($record->nid); } ?>
Dependiendo de lo que necesites hacer con los resultados, puedes usar otras formas de recorrer los registros. Para un procesamiento explícito de los registros siguientes, utiliza:
<?php $record = $result->fetch(); // Usa el modo predeterminado (objeto). $record = $result->fetchObject(); // Procesa como objeto. $record = $result->fetchAssoc(); // Procesa como array asociativo. ?>
Si no hay más registros, se devolverá FALSE
. Se recomienda usar fetchObject()
y fetchAssoc()
en lugar de fetch()
, ya que explican mejor cómo se procesarán los resultados. También puedes cambiar el modo predeterminado de fetch()
. Para obtener un solo campo del resultado:
<?php $record = $result->fetchField($column_index); ?>
El valor predeterminado de $column_index
es 0. Para contar la cantidad de filas devueltas por la consulta:
<?php $number_of_rows = $result->rowCount(); ?>
Para procesar todos los registros como un solo array, utiliza:
<?php // Devuelve el resultado como un array de objetos. $result->fetchAll(); // Devuelve el resultado como un array asociativo donde la clave es un campo del resultado. $result->fetchAllAssoc($field); // Devuelve un array asociativo con los valores de la columna 1 => columna 2. $result->fetchAllKeyed(); $result->fetchAllKeyed(0,2); // array será columna 0 => columna 2 $result->fetchAllKeyed(1,0); // array será columna 1 => columna 0 // Devuelve un array plano con los valores de una sola columna. $result->fetchCol(); // También puedes especificar qué columna usar. $result->fetchCol($column_index); ?>
Ten en cuenta que fetchAll()
y fetchAllAssoc()
utilizarán por defecto el modo de fetch()
si este ha sido configurado previamente. Puedes configurar esto pasando una constante de modo de fetch
. Para fetchAll()
se pasa como primer parámetro, y para fetchAllAssoc()
como segundo.
Dado que PHP permite encadenar métodos para los objetos devueltos, puedes omitir la variable $result
por completo:
<?php // Obtener un array asociativo nid => title $nodes = db_query("SELECT nid, title FROM {node}")->fetchAllKeyed(); // Obtener un único registro como objeto $node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchObject(); // Obtener un único valor (campo) de la base de datos $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchField(); ?>