php

PHP y PDO parte 2: iterar con cursor y comprobar si elemento existe

Continuación de PDO con PHP para trabajar con bases de datos

En otro post ya hemos visto las bases para trabajar con PHP, PDO y MySQL (también SQLite). Ahora veremos dos cosas que vienen de ayuda al trabajar con PDO:

  1. Seleccionar datos y recorrerlos con un cursor en lugar de obtenerlos como arreglo
  2. Comprobar si un elemento existe en la base de datos
Consultar datos de una tabla usando un cursor – PDO, PHP y MySQL

El primer punto viene de maravilla cuando hablamos de rendimiento. El segundo sirve para muchas cosas, por ejemplo, ver si un usuario ya existe al registrarse o cosas de esas.

Lecturas recomendadas

Mira el tutorial anterior, porque de ahí está basado todo. Si no lo lees, no vas a entender la estructura ni los datos que se verán aquí: PDO y PHP para trabajar con MySQL.

También mira cómo instalar PHP si no lo tienes instalado, o juega un poco con Android instalando PHP sobre él.

Si no sabes de MySQL, mira algunos ejercicios o familiarízate con la terminal.

Comprobar si valor existe en tabla

Para comprobar si un dato existe, recomiendo seleccionar con límite de 1. Por ejemplo, tenemos la base de datos llamada personas que tienen un id y nombre. Si queremos saber si existe con determinado nombre, el código sería:

<?php
include_once "base_de_datos.php";
# Recuerda que nombre puede venir de cualquier lugar
$nombre = "Parzibyte";
# Seleccionar el id para que sea ligero, pues no necesitamos obtener los datos, solamente
# queremos saber si existe
$sentencia = $base_de_datos->prepare("SELECT id FROM personas WHERE nombre = ? LIMIT 1;");
$sentencia->execute([$nombre]);
# Ver cuántas filas devuelve
$numeroDeFilas = $sentencia->rowCount();
# Si son 0 o menos, significa que no existe
if ($numeroDeFilas <= 0) {
    echo "El usuario con nombre $nombre NO existe";
} else {
    echo "El usuario con nombre $nombre SÍ existe";
}

Hacemos un select con límite de 1; así se regresa al encontrar el primer resultado. Seleccionamos únicamente el id para que sea un dato ligero, porque no necesitamos otros campos.

PDO tiene un método llamado rowCount() que dice cuántas filas tenemos, en caso de que sean 0 o menos significa que el select no devolvió nada y por lo tanto el dato no existe.

Hacer consulta y recorrer con un cursor

Ahora veamos cómo usar los cursores e iterarlos para obtener datos de una base de datos, en lugar de obtenerlos como arreglos.

La ventaja de los cursores es que permiten iterarse en un ciclo y son más eficientes que tener todos los arreglos.

Lo que vamos a hacer es dibujar la tabla de personas pero ahora con un cursor. Para no confundir al lector, el código limpio para obtener datos con un cursor es este:

<?php
include_once "base_de_datos.php";
$consulta = "SELECT * FROM personas";
# Preparar sentencia e indicar que vamos a usar un cursor
$sentencia = $base_de_datos->prepare($consulta, [
    PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
]);
# Ejecutar sin parámetros
$sentencia->execute();
# fecthObject va a devolver null alguna vez, cuando eso pase termina
# el ciclo
while ($persona = $sentencia->fetchObject()) {
    // Aquí trabajar con persona, p.ej. $persona->nombre
}

Como vemos ahora iteramos en un ciclo while llamando a fetchObject que devuelve un objeto y avanza en uno el cursor. Cuando lleguemos al final, fetchObject devuelve null y entonces el ciclo while se termina.

Dentro del ciclo podemos acceder al objeto persona y a sus propiedades con el operador flecha. Entonces para dibujar la tabla el código es el siguiente:

<?php
include_once "base_de_datos.php";
$consulta = "SELECT * FROM personas";
# Preparar sentencia e indicar que vamos a usar un cursor
$sentencia = $base_de_datos->prepare($consulta, [
    PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL,
]);
# Ejecutar sin parámetros
$sentencia->execute();
# Iteramos más abajo...
?>
<!--Recordemos que podemos intercambiar HTML y PHP como queramos-->
<!DOCTYPE html>
<html lang="es">
<head>
 <meta charset="UTF-8">
 <title>Tabla de ejemplo</title>
 <style>
 table, th, td {
     border: 1px solid black;
 }
 </style>
</head>
<body>
 <table>
  <thead>
   <tr>
    <th>ID</th>
    <th>Nombre</th>
    <th>Apellidos</th>
    <th>Género</th>
    <th>Editar</th>
    <th>Eliminar</th>
   </tr>
  </thead>
  <tbody>
   <!--
    Y aquí usamos el ciclo while y fecthObject, el cuerpo
                del ciclo queda intacto pero ahora estamos usando
                cursores :)
   -->
   <?php while ($persona = $sentencia->fetchObject()) {?>
   <tr>
    <td><?php echo $persona->id ?></td>
    <td><?php echo $persona->nombre ?></td>
    <td><?php echo $persona->apellidos ?></td>
    <td><?php echo $persona->sexo ?></td>
    <td><a href="<?php echo "editar.php?id=" . $persona->id ?>">Editar</a></td>
    <td><a href="<?php echo "eliminar.php?id=" . $persona->id ?>">Eliminar</a></td>
   </tr>
   <?php }?>
  </tbody>
 </table>
</body>
</html>

Conclusiones

Ya lo dije anteriormente y lo digo ahora: trato de hacer los ejemplos lo más simples posibles, para que los principiantes no se confundan; por ello es que no agrego estilos, relaciones o esas cosas.

Si quieres ver un ejemplo más avanzado recomiendo:

Oh, por cierto, ya he puesto el código en GitHub para que cualquiera pueda navegar por el repositorio y ver las últimas actualizaciones.

Referencias

http://php.net/manual/es/class.pdostatement.php

http://php.net/manual/es/pdostatement.fetch.php

http://php.net/manual/es/pdostatement.fetchobject.php

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

17 horas hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

1 semana hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

1 semana hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

1 semana hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

1 semana hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

1 semana hace

Esta web usa cookies.