25: Leer Datos con PDO Parte 4

  


En el tutorial anterior, logramos obtener un array con todos los registros de la tabla usuarios desde la base de datos y verificamos su estructura usando var_dump. Ahora, el objetivo es mostrar todos esos registros de forma dinámica en la tabla HTML de nuestra vista usuario.php. Para ello, utilizaremos un bucle foreach, que es la herramienta perfecta para recorrer arrays en PHP.

Paso 1: Corregir la ubicación del código PHP en la Vista

Lo primero que notamos es que si colocamos el código PHP fuera de las etiquetas <tbody>, el HTML generado se renderizará incorrectamente. Asegurémonos de que la llamada al controlador y la generación de las filas estén dentro del cuerpo de la tabla.

Antes (incorrecto):

php
<!-- usuario.php -->
<tbody>
</tbody>
</table>

<?php
// Este código está fuera de la tabla
$ingreso = new MvcController();
$ingreso->vistaUsuariosController();
?>

Después (correcto):

php
<!-- usuario.php -->
<tbody>
    <?php
    // El código PHP ahora está DENTRO del <tbody>
    $ingreso = new MvcController();
    $ingreso->vistaUsuariosController();
    ?>
</tbody>
</table>

Con este cambio, todo lo que el controlador imprima (las filas <tr>) aparecerá dentro de la estructura correcta de la tabla.

Paso 2: Mostrar un solo registro (enfoque inicial)

Por ahora, en nuestro controlador, estamos imprimiendo una sola fila usando índices fijos. Esto nos sirve para confirmar que podemos acceder a los datos individuales.

En controlador.php (método temporal):

php
public function vistaUsuariosController(){
    $respuesta = Datos::vistaUsuariosModel("usuarios");

    // Imprimimos una sola fila, accediendo al primer registro.
    // Usamos índices numéricos porque fetchAll() devuelve un array numérico.
    echo '<tr>
            <td>' . $respuesta[0][1] . '</td>  <!-- Nombre del usuario -->
            <td>' . $respuesta[0][2] . '</td>  <!-- Contraseña -->
            <td>' . $respuesta[0][3] . '</td>  <!-- Email -->
            <td><button>Editar</button></td>
            <td><button>Borrar</button></td>
          </tr>';
}

Si cargamos usuario.php, veremos una sola fila con los datos de juan. Esto funciona, pero es limitado. Si hubiera 100 usuarios, no escribiríamos 100 echo manualmente. Necesitamos una solución automática.

Paso 3: Implementar el bucle foreach para mostrar todos los registros

El bucle foreach está diseñado para iterar sobre arrays. En nuestro caso, $respuesta es un array donde cada elemento ($item) es, a su vez, un array asociativo con los datos de un usuario.

Ventajas de usar foreach:

  • Itera automáticamente sobre todos los elementos del array.

  • Por cada iteración, asigna el elemento actual a una variable (en nuestro caso, $item).

  • El código dentro del bucle se repite una vez por cada registro.

En controlador.php, reemplazamos el código anterior con:

php
public function vistaUsuariosController(){
    // 1. Obtenemos el array de resultados desde el modelo.
    $respuesta = Datos::vistaUsuariosModel("usuarios");

    // 2. Iniciamos el bucle foreach.
    //    Por cada fila del array $respuesta, creamos una variable $item
    //    que contiene los datos de esa fila (id, usuario, password, email).
    foreach ($respuesta as $fila => $item) {
        // 3. Dentro del bucle, imprimimos una nueva fila de la tabla.
        //    Accedemos a los valores usando los nombres de las columnas (claves asociativas).
        echo '<tr>
                <td>' . $item["usuario"] . '</td>
                <td>' . $item["password"] . '</td>
                <td>' . $item["email"] . '</td>
                <td><button>Editar</button></td>
                <td><button>Borrar</button></td>
              </tr>';
    }
}

Explicación del foreach:

  • foreach ($respuesta as $item): Es la forma más común. Leemos cada elemento del array $respuesta y lo llamamos $item.

  • También podemos usar foreach ($respuesta as $indice => $item) si necesitamos saber el número de la fila (0, 1, 2...).

  • Dentro del bucle, $item es un array asociativo. Por eso usamos $item["usuario"]$item["email"], etc.

Paso 4: Verificar el resultado en el navegador

Al actualizar usuario.php (después de iniciar sesión), veremos la tabla completamente poblada con todos los usuarios que existen en la base de datos. Cada usuario aparecerá en su propia fila, con los botones de "Editar" y "Borrar".

Resultado esperado en la tabla:

UsuarioContraseñaEmailEditarBorrar
juan1234juan@hotmail.combuttonbutton
pepe5678pepe@email.combuttonbutton
ana91011ana@email.combuttonbutton

Paso 5: Probar con un nuevo registro

Para asegurarnos de que todo funciona dinámicamente, podemos agregar un nuevo usuario desde el formulario de registro.

  1. Ve al formulario de registro y crea un nuevo usuario, por ejemplo:

    • Usuario: María

    • Password: 5678

    • Email: maria@hotmail.com

  2. Después del registro exitoso, inicia sesión con cualquier usuario (ej. juan).

  3. Dirígete a la sección de usuarios. Ahora deberías ver a María incluida automáticamente en el listado, sin haber cambiado ni una línea de código en la vista o el controlador.

Esto demuestra el poder de la programación dinámica: nuestra lógica se adapta automáticamente a los cambios en la base de datos.


Reflexión y adelanto del siguiente tema

En este punto, tenemos una funcionalidad completa de listado. Sin embargo, hay una gran falla de seguridad: cualquier persona puede acceder a usuario.php escribiendo la URL directamente en el navegador, sin necesidad de iniciar sesión.

text
http://tusitio.com/usuario.php

Esto es un problema grave, ya que la lista de usuarios debería ser visible solo para usuarios autenticados. Para solucionarlo, necesitamos implementar un sistema de sesiones en PHP que permita "recordar" que un usuario ha iniciado sesión correctamente y bloquear el acceso a quienes no lo hayan hecho.

En el próximo tutorial (26), aprenderemos a manejar variables de sesión para proteger nuestras páginas privadas.


Código completo del Controlador para el Tutorial 25:

php
<?php
// controlador.php

require_once "modelos.php";

class MvcController {

    // ... (otros métodos) ...

    # VISTA DE USUARIOS
    #-------------------------------------
    public function vistaUsuariosController(){
        // Obtener todos los registros de la tabla 'usuarios'
        $respuesta = Datos::vistaUsuariosModel("usuarios");

        // Recorrer el array de resultados y generar las filas de la tabla
        foreach ($respuesta as $fila => $item) {
            echo '<tr>
                    <td>' . $item["usuario"] . '</td>
                    <td>' . $item["password"] . '</td>
                    <td>' . $item["email"] . '</td>
                    <td><button>Editar</button></td>
                    <td><button>Borrar</button></td>
                  </tr>';
        }
    }

}
?>

Comentarios

Entradas más populares de este blog

token

¿Qué es un token y cómo se utiliza en una API?

Generación de Credenciales API