Recuperar resultados de la consulta

Existen un conjunto de funciones que nos van a permitir recuperar resultados de la consulta a partir del identificador de resultado ( **resource**).

Contar filas de una consulta resultado

Una de las funcionalidades básicas sobre el resultado de una consulta es contar el número de filas que se han obtenido en la misma. Para ello usaremos la siguiente función:

int mysql_num_rows( resource $result )

Esta función recibe como parámetro una variable de tipo recurso que apunta a una tupla de resultados. Si la consulta es correcta, esa tupla de resultados contendrá 0 o más filas.

En el ejemplo anterior:

...
if (mysql_num_rows($result) > 0)
{
   echo '<h2>Listado de libros</h2>';
...

Aunque la consulta sea correcta, si se trata de un SELECT no tiene por que devolver ningún resultado y en ese caso en lugar de mostrar una tabla vacía, lo indicamos con una aviso.

Obtener datos de una fila

</p>

Dispondremos de diversas funciones para "_traer_" (fetch) cada una de las filas que contiene la tupla de resultados. Todas ellas devolverán la fila actual apuntada por el cursor y moverán el cursor a la siguiente fila. Además, si ya no hay más filas por devolver, la función devolverá un valor FALSE.

De entre todas las que disponemos destacaremos las siguientes:

array mysql_fetch_row(resource $result)

La función mysql_fetch_row() obtiene una fila de datos del resultado, representado por el parámetro resultado, y lo devuelve como un array indexado numéricamente, donde cada columna es almacenada en el array empezando desde 0 (cero). Sabiendo que dicha función devuelve FALSE cuando el puntero llega al final de la tupla de resultados, usaremos la instrucción "while" para recorrerla.

Veamos como se usaría en el ejemplo anterior:

...
while ($fila = mysql_fetch_row($result))
{
   echo'<tr>';
   echo'<td >' . $fila[0] . '</td>'; //isbn
   echo '<td > '. $fila[1] . '</td>'; //titulo
   echo'<td >'. $fila[2] . '</td>'; //autor
   echo'<td >'. number_format($fila[3], 2) . ' &euro;</td>';//precio
   echo'';
}
...

Otra función interesante sería:

array mysql_fetch_assoc( resource $result    )

Es la que hemos utilizado en nuestro ejemplo y la usaremos para obtener una representación asociativa de la fila actual en el resultado, representado por el parámetro resultado, donde cada clave en el array representa el nombre de la columna en el resultado.

Si dos o más columnas del resultado tienen el mismo nombre, la última columna tomara precedencia y sobreescribirá lo primero. Por tanto, para acceder a varias columnas con el mismo nombre, se debería usar la forma de índice numérica.

Los nombres de los campos serán sensibles a mayúsculas y minúsculas.

Teniendo la consulta del ejemplo anterior:

$consulta = " SELECT L.isbn, L.titulo, L.precio, A.nombre as autor" .
   " FROM libros as L, autores as A, libros_autores as LA " .
   " WHERE L.id = LA.fk_libros AND " .
   " A.id = LA.fk_autores " .
   " ORDER BY L.titulo";

En la imagen siguiente vemos un posible resultado de ejecutar dicha consulta en la aplicación **phpMyAdmin:**

Ejemplo de consulta que ha obtenido varios libros junto con sus autores

Tendremos las columnas:**isbn**,**autor** (hemos usado la palabra reservada "AS" para cambiar la columna _nombre_ por _autor_),**titulo** y **precio**. Vamos a ver cómo se hacía en el ejemplo completo visto anteriormente:

...
while ($fila = mysql_fetch_assoc($result))
{
   echo'<tr>';
   echo'<td >' . $fila['isbn'] . '</td>';
   echo '<td > ' . $fila['titulo'] . '</td>';
   echo'<td >' . $fila['autor'] . '</td>';
   echo'<td >'. number_format($fila['precio'], 2) . ' &euro;</td>';
   echo'';
}
...

Como podemos ver esta forma de obtener las filas nos ayudará a auto-documentar el código.

Por último mencionamos la siguiente función:

objeto mysql_fetch_object( resource $result )

Devolverá la fila actual en el resultado como un objeto donde los atributos del objeto representan los nombre de los campos encontrados dentro del resultado.

Veamos cómo se utilizaría en el ejemplo anterior:

...
while ($fila = mysql_fetch_object($result))
{
   echo'<tr>';
   echo'<td >' . $fila->isbn . '</td>';
   echo '<td > ' . $fila->titulo . '</td>';
   echo'<td >' . $fila->autor . '</td>';
   echo'<td >'. number_format($fila->precio ,2) . ' &euro;</td>';
   echo'';
}
...

De las tres funciones, **mysql_fecth_row**() es la más rápida aunque la menos explicativa. La más lenta sería la función **mysql_fetch_object** () ya que requiere crear un objeto con el nombre de cada columna. Nosotros usaremos la función **mysql_fetch_assoc**() que está en un termino medio entre rapidez y sencillez de uso.

Dentro del manual oficial de PHP podemos ver más funciones de obtención de datos de una fila. La URL de acceso directo es esta: http://docs.php.net/manual/es/function.mysql-fetch-array.php

Una buena práctica a la hora de recuperar los valores de tipo cadena en los campos, es procesarlos mediante la función **stripslashes**() y limpiar así los caracteres de escape si los hubiere antes de mostrarlo.

En nuestro ejemplo hemos utilizado una función (**LimpiaResultados**) que recorre todos los elementos de una matriz asociativa genérica, eliminando caracteres de escape para aquellos valores que sean cadenas.

Este es código:

...
function LimpiaResultados(&$fila)
{
   foreach ($fila as $campo => $valor)
      if(is_string($valor) === true)
         $fila[$campo] = stripslashes($fila[$campo]);
}
...

Destacar que el parámetro se pasa por referencia para que los cambios se vean reflejados.

Veamos un ejemplo gráfico:

Ejemplo gráfico de cómo se recorre una tupla de resultados con mysql_fetch_assoc

results matching ""

    No results matching ""