Tema 17

Bases de Datos con PDO (PHP Data Objects)

Aprende a conectar y gestionar bases de datos en PHP moderno mediante PDO: cadena DSN, atributos de conexión, sentencias preparadas contra inyección SQL y transacciones atómicas.

¿Qué es PDO (PHP Data Objects)?

PDO es la extensión oficial y recomendada de PHP para interactuar con bases de datos relacionales. Proporciona una capa de abstracción de acceso a datos consistente, lo que significa que utilizas exactamente los mismos métodos y funciones sin importar si tu base de datos subyacente es MySQL, PostgreSQL, SQLite, SQL Server u Oracle.

Estándar de la Industria ¿Por qué NO usar las funciones antiguas mysql_*?

Las funciones tipo mysql_connect() y mysql_query() fueron obsoletas desde PHP 5.5 y completamente eliminadas en PHP 7. Eran vulnerables a inyección SQL y carecían de orientación a objetos. PDO y MySQLi son los únicos mecanismos vigentes, siendo PDO el estándar universal en frameworks modernos (Laravel, Symfony, etc.).

Ventajas Principales de PDO:

  • Portabilidad entre Motores: Cambiar de SQLite a MySQL o PostgreSQL solo requiere modificar la cadena de conexión (DSN); el 95% de tus consultas y código PHP permanece idéntico.
  • Sentencias Preparadas Nativas: Separan la estructura de la consulta SQL de los datos enviados por el usuario, eliminando por completo el riesgo de Inyección SQL (SQLi).
  • Manejo de Errores con Excepciones: Emite objetos PDOException que puedes capturar limpiamente con bloques try...catch.
  • Mapeo Orientado a Objetos: Permite transformar filas de base de datos directamente en instancias de tus clases PHP mediante PDO::FETCH_CLASS.

1. Conexión y Atributos Recomendados

Para conectarse se instancia un nuevo objeto PDO pasando el DSN (Data Source Name), usuario, contraseña y un arreglo asociativo de opciones de configuración:

// Ejemplo de conexión con PDO (Configuración de Producción)
$dsn = 'mysql:host=localhost;dbname=kilopolis_academia;charset=utf8mb4';
$usuario = 'root';
$password = 'secreto_seguro';

$opciones = [
    // 1. Lanzar excepciones cuando ocurra un error SQL
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    // 2. Retornar arrays asociativos limpios por defecto
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    // 3. Desactivar emulación de sentencias preparadas (seguridad real en el motor)
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $usuario, $password, $opciones);
    echo "¡Conexión establecida exitosamente!";
} catch (PDOException $e) {
    echo "Error en la base de datos: " . $e->getMessage();
}

2. Sentencias Preparadas contra Inyección SQL

La regla de oro en desarrollo web: NUNCA concatenes variables del usuario directamente dentro de una consulta SQL.

Inseguro (Vulnerable a Inyección SQL):

// ¡PELIGRO! Si $email contiene: ' OR '1'='1
$sql = "SELECT * FROM usuarios WHERE email = '" . $email . "'";
$stmt = $pdo->query($sql);

Seguro (Sentencia Preparada con PDO):

// El motor compila la consulta primero; luego inyecta el valor
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE email = :email");
$stmt->execute(['email' => $email]);
$usuario = $stmt->fetch();

Marcadores de Posición (Placeholders):

  • Parámetros Nombrados (Recomendado): Usan dos puntos como prefijo (ej: :titulo, :precio). Son altamente legibles y autodocumentados.
  • Parámetros Posicionales: Usan signos de interrogación (?). Se asocian en el mismo orden en que aparecen en el array pasado a execute().

3. Métodos de Extracción de Datos (Fetch)

Método Retorno Caso de Uso Habitual
$stmt->fetch() Un único registro (array asociativo) o false si no hay más. Búsqueda por ID, login de usuario, verificación de existencia.
$stmt->fetchAll() Array con todos los registros devueltos por la consulta. Listados, tablas, catálogos de productos, reportes.
$stmt->fetchColumn() Un único valor escalar de la primera columna. Consultas de agregación tipo SELECT COUNT(*) FROM cursos.
🦉
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.

🚀 ¿Quieres dominar Manual Completo de PHP y crear proyectos reales?

Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.

🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.