Acceso a un registro completo o a varios registros de una tabla con Spoon

  • Por
  • PHP
Veremos en este artículo cómo acceder a varios registros de una base de datos con las librerías Spoon, utilizando el método getRecord() y getRecords().
Estamos dedicando una serie de artículos para explicar la clase para el acceso a la base de datos que nos ofrece las librerías Spoon para PHP 5. En capítulos anteriores del Manual de Spoon, explicamos cómo realizar una conexión con una base de datos y cómo efectuar una consulta para obtener un dato simple. Vimos además cómo parametrizar consultas SQL, que nos facilitará realizar sentencias personalizadas con variables sin tener que ir concatenando valores en la sentencia SQL.

Ahora vamos a dedicarnos a ver otros métodos un poco más avanzados para el acceso a bases de datos, en concreto los métodos getRecord() y getRecords() que nos sirven para acceder a varios campos de un registro o a varios campos de varios registros. En definitiva, todo lo que realizamos habitualmente con setencias SQL de tipo SELECT.

Recibiendo un registro único

La función getRecord() de Spoon permite acceder a un único registro de una tabla. Nos devuelve un array asociativo de una dimensión cuyos índices son los nombres de los campos, que tienen los valores almacenados en ellos.

Nota: En realidad esta función no existiría en PHP de manera nativa, pues cuando accedemos a un registro al ejecutar un SELECT, siempre nos devuelve un conjunto de registros (aunque el conjunto tenga un único elemento). En el caso de Spoon esta función nos puede facilitar un poco la vida, porque nos acorta el acceso a los datos, ya que nos devuelve los datos del registro en un array.

El método getRecord() recibe la consulta que se desea realizar, en la que se pueden parametrizar diversos valores tal como vimos en el método getVar().

$ssql = "select * from usuario where id_usuario=?";
$registro = $db->getRecord($ssql, 1);

En este ejemplo estamos recibiendo los datos del usuario que tiene identificador de usuario id_usuario=1 (El "?" se reemplaza por el valor pasado a getRecord() en su segundo parámetro).

Lo que obtenemos en la variable $registro es un array con todos los campos del usuario consultado. Si hiciéramos un dump con el método estático dump() de la clase Spoon:

Spoon::dump($registro, false);

Obtendríamos una salida parecida a la siguiente:

array(4) {
["id_usuario"] => string(1) "1"
["nombre_completo"] => string(20) "Miguel Angel Alvarez"
["email"] => string(26) "correo.miguel@desarrolloweb.com"
["password"] => string(6) "mm123456"
}

Nota: Lógicamente, la salida dependerá de los campos que tenga nuestra tabla de usuarios. Pero lo que sí debes fijarte es que todos los valores del array son de tipo string, incluso el identificador del usuario, que en la tabla está definido como INT.

Cabe decir que, si no se encuentra ningún registro en la consulta, la función getRecord() devolvería null. Nosotros deberíamos tratar ese valor de retorno para asegurarnos que no es null antes de acceder a los campos del array asociativo.

if($registro){
   echo "<p>El nombre de ese usuario era: " . $registro["nombre_completo"];
   echo " y el email de ese usuario: " . $registro["email"];
}else{
   echo "No recibí ningún registro!";
}

Recuperar varios registros a la vez

La función comentada en el epígrafe anterior getRecord() devuelve siempre un array de una única dimensión. Es decir que, si la consulta a ejecutar devolviera varios registros, solamente se te entregaría un array de una dimensión conteniendo el primero de ellos.

Sin embargo, en tu día a día como desarrollador, probablemente te resulte más habitual hacer consultas tradicionales, en las que obtengas una serie de registros. Para ello debes utilizar el método getRecords(), que devuelve un array bidimensional, conteniendo varios registros.

Nota: Quizás te hayas dado cuenta, pero las funciones vistas en este artículo, aunque parecidas, se distinguen porque la que devuelve un array bidimensional con varios registros acaba con una "s". Léase getRecord() y getRecords().

$ssql = "select * from usuario";
$registro = $db->getRecords($ssql);

En este ejemplo obtendríamos un array con 2 dimensiones. El índice principal empieza en cero y contiene tantos elementos como registros encontrados. El cada uno de ellos tendríamos cada uno de los usuarios de nuestra tabla usuario.

El contenido de retorno tendrá una forma parecida a esta:

array(2) {
[0] => array(4) {
["id_usuario"] => string(1) "1"
["nombre_completo"] => string(20) "Miguel Angel Alvarez"
["email"] => string(26) "correo.miguel@desarrolloweb.com"
["password"] => string(6) "miguelito"
}
[1] => array(4) {
["id_usuario"] => string(1) "2"
["nombre_completo"] => string(20) "Pepe Pedrales García"
["email"] => string(22) "pepe@desarrolloweb.com"
["password"] => string(9) "clavepepe"
}
}

Ese ejemplo donde recuperamos varios registros se puede complicar todo lo que deseemos, parametrizando datos en la consulta y realizando operaciones típicas de base de datos como unión de tablas. Por ejemplo, puedes ver a continuación algo un poco más elaborado.

$ssql = "select us.nombre_completo, log.id_log_acceso_usuario, log.fecha, log.log from usuario as us inner join log_acceso_usuario as log on log.id_usuario=us.id_usuario where us.id_usuario=:id_usuario and log.fecha=:fecha";
$registro = $db->getRecords($ssql, array("id_usuario"=>1, "fecha"=>"2011-07-12"), "id_log_acceso_usuario");

En este caso vemos cómo se utilizan un par de parámetros en la consulta, enviados en un array pasado como segundo parámetro en getRecords(). Pero además hay un tercer parámetro que nos permite esta función específicamente que sirve para alterar los identificadores principales del array principal.

En este caso como tercer parámetro hemos colocado el valor "id_log_acceso_usuario", lo que quiere decir que en el identificado del primer array se utilizará los valores de los registros que haya en el campo "id_log_acceso_usuario". Esto te puede servir para que, si quieres acceder rápidamente a registros determinados del array cuyos identificadores conoces, no tengas que hacer una nueva búsqueda dentro del array, sino utilizar esos identificadores que ya tienes.

Para intentar aclarar este último punto, puedes ver el array que me devolvería la anterior llamada a getRecords():

array(2) {
[2] => array(4) {
["nombre_completo"] => string(20) "Miguel Angel Alvarez"
["id_log_acceso_usuario"] => string(1) "2"
["fecha"] => string(10) "2011-07-12"
["log"] => string(37) "Acceso no permitido a las 15:01 horas"
}
[4] => array(4) {
["nombre_completo"] => string(20) "Miguel Angel Alvarez"
["id_log_acceso_usuario"] => string(1) "4"
["fecha"] => string(10) "2011-07-12"
["log"] => string(34) "Acceso concedido a las 19:18 horas"
}
}

Si te fijas, en el array principal tienes unos identificadores que no parten desde cero, sino que se utilizan los valores que había en el campo "id_log_acceso_usuario" de nuestra base de datos.

Hasta ahora solo hemos visto sentencias de selección de datos, por lo que pronto pasaremos a otras operaciones sobre tablas, como inserciones o actualizaciones. No obstante, esperamos que lo explicado hasta el momento te haya dado una visión interesante sobre las posibilidades de la capa de abstracción de base de datos de las librerías Spoon.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Erasmo Rodriguez

23/8/2011
Recorridos
que tan rapido procesa los datos para ediciones ese procedimiento necesito un algoritmo para editar registros los mas ligero y rapido para campos de una base de datos con mas de 10000000 datos registrados en un campo .. espero que puedan ayudarme

ruben_bitrian

01/12/2011
¿Como podemos mostrar en pantalla el resultado?
Hola Miguel Ángel,

Estoy empezando a utilizar la clase Spoon Database y me encuentro con un problema, es el siguiente:

Con la forma habitual de programar, para recuperar el resultado de una consulta de varios (todos) registros, más concretamente para mostrarlos en una tabla, yo utilizaba este código (más o menos):

<?php

$result = mysql_query("SELECT * FROM tabla");

// Parte dinámica de la tabla

while ($row=mysql_fetch_array($result))
{
echo "<tr bgcolor="#FFFFFF"> ";
echo "<td>$row[0]</td> ";
echo "<td>$row[1]</td> ";
echo "<td>$row[2]</td> ";
echo "<td>$row[3]</td> ";

?>
<td><img src=editar.png' alt='Editar' border='0'></td>
<td><img src='eliminar.png' alt='Eliminar' border='0'></td>
<?php
echo "</tr> ";
}
?>

Y normalmente funcionaba, ahora con esta clase, me encuentro que al hacerlo así:

<?php

//Obviamente antes de todo esto, he incluido la clase y demás

$consulta = "SELECT * FROM tabla";
$resultado = $db->getRecords($consulta);


// Parte dinámica de la tabla

while ($row=mysql_fetch_array($resultado))
{
echo "<tr bgcolor="#F4F2ED"> ";
echo "<td>$row[0]</td> ";
echo "<td>$row[1]</td> ";
echo "<td>$row[2]</td> ";
echo "<td>$row[3]</td> ";

?>
<td><img src=editar.png' alt='Editar' border='0'></td>
<td><img src='eliminar.png' alt='Eliminar' border='0'></td>
<?php
echo "</tr> ";
}
?>

Y me muestra un error que dice:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /public_html/script.php on line 94

La línea 94 es: while ($row=mysql_fetch_array($resultado))


Luego me muestra el encabezado o parte fija de la tabla, pero no muestra ningún registro más.

¿Me podrías poner un ejemplo de cómo utilizar esta clase para obtener este resultado?

Muchas gracias por anticipado. Un saludo.

Rubén.

Humberto

26/12/2012
TU RESPUESTA
for($j=0; $j < count($records) ; $j++)
{


echo $records[$j]["nombre"]."</br>";
echo $records[$j]["intro"]."</br>";

}