php-como-hacer-consultas-con-pdo-en-php

Cómo hacer consultas con PDO en PHP

  • 3 min

Una consulta con PDO permite enviar una sentencia SQL a la base de datos y recuperar su resultado.

Una vez tienes tu objeto $pdo conectado, la forma más sencilla de ejecutar una consulta SQL que no tenga variables de usuario es utilizando el método ->query().

Este método devuelve un objeto especial llamado PDOStatement (Declaración), que contiene los resultados “en crudo”, listos para ser procesados.

MétodoAnalogíaUso Recomendado
$pdo->query($sql)Enviar la orden a la cocina.Consultas estáticas (sin variables).
$stmt->fetch()El camarero trae un plato cada vez.Listados grandes, bucles while.
$stmt->fetchAll()El camarero trae todos los platos en un carrito.Listados pequeños, APIs, Configs.
SELECT COUNT(*)Pedir a la base de datos que cuente.Estadísticas y recuentos portables.

Ejecutar la consulta

Supongamos que tenemos una tabla usuarios.

// Ejecutamos la consulta SQL directa
// ¡OJO! Usamos query() SOLO si la sentencia SQL no tiene variables externas.
$sql = "SELECT nombre, email, edad FROM usuarios";
$stmt = $pdo->query($sql);
Copied!

En este punto, $stmt no contiene los datos (los arrays), sino un “puntero” o cursor que apunta a la base de datos, esperando a que le digas cómo quieres leer la información.

Formas de leer: fetch vs fetchAll

Aquí es donde muchos se lían. ¿Cómo saco los datos de ese objeto $stmt? Principalmente hay dos formas:

A. fetch(): Uno a uno (El modo eficiente)

El método fetch() obtiene la siguiente fila del conjunto de resultados. Cada vez que lo llamas, el puntero baja una línea. Cuando no quedan más filas, devuelve false.

Es ideal para usar dentro de un bucle while.

  • Ventaja: Muy eficiente en memoria. Solo carga una fila a la vez en la RAM. Ideal si tienes 10.000 usuarios.
echo "<ul>";
// "Mientras pueda traer una fila ($fila), sigue ejecutando el bucle"
while ($fila = $stmt->fetch()) {
    // Como configuramos PDO::FETCH_ASSOC, accedemos por el nombre de la columna
    echo "<li>" . $fila['nombre'] . " (" . $fila['email'] . ")</li>";
}
echo "</ul>";
Copied!

B. fetchAll(): Todo de golpe (El modo cómodo)

Este método descarga todas las filas de la base de datos y las mete en un único array gigante de PHP.

  • Ventaja: Tienes todos los datos en una variable para usarlos cuando quieras.
  • Desventaja: Consume mucha memoria. Si la tabla tiene 100.000 filas, tu servidor podría colapsar (Error de Memory Limit). Úsalo solo cuando sepas que hay pocos resultados (ej: categorías, configuraciones).
// Traemos TODO a la memoria
$todosLosUsuarios = $stmt->fetchAll();

// Ahora podemos usar un foreach normal
foreach ($todosLosUsuarios as $usuario) {
    echo $usuario['nombre'] . "<br>";
}
Copied!

Contar resultados con COUNT(*)

A veces no quieres los datos, solo quieres saber cuántos hay.

$stmt = $pdo->query("SELECT COUNT(*) FROM productos WHERE stock > 0");
$cantidad = (int) $stmt->fetchColumn();

if ($cantidad > 0) {
    echo "Tenemos $cantidad productos en venta.";
} else {
    echo "No hay stock.";
}
Copied!

El peligro oculto

Hasta ahora hemos usado $pdo->query("SELECT ..."). Esto está bien para consultas fijas. Pero, ¿qué pasa si queremos buscar un usuario por su nombre?

Lo natural sería hacer: $sql = "SELECT * FROM usuarios WHERE nombre = '" . $_POST['nombre'] . "'";

🛑 ¡ALTO! Jamás hagas esto. Si concatenas variables directamente en el SQL, abres la puerta a la Inyección SQL, donde un hacker puede borrar tu base de datos escribiendo código malicioso en el input.

Para incorporar valores externos usaremos sentencias preparadas, que mantienen separados el SQL y los datos.