PDO es una interfaz orientada a objetos para acceder a bases de datos desde PHP mediante una API común.
Antiguamente (y en muchos tutoriales viejos) se usaban funciones mysql_connect (ya eliminadas) o la extensión mysqli. Sin embargo, en el desarrollo profesional actual, PDO (PHP Data Objects) es el rey.
¿Por qué PDO y no mysqli?
Imagina que mysqli es un cargador que solo sirve para teléfonos iPhone. Si mañana quieres cambiar a Android, tienes que tirar el cargador y comprar otro.
PDO es como un cargador universal: funciona con casi cualquier base de datos.
| Característica | MySQLi | PDO (Recomendado) |
|---|---|---|
| Bases de datos | MySQL / MariaDB | Varios motores mediante drivers (MySQL, PostgreSQL, SQLite…) |
| Estilo de código | API orientada a objetos y procedimental | API orientada a objetos común entre drivers |
| Seguridad | Soporta sentencias preparadas | Soporta sentencias preparadas y parámetros con nombre |
| Portabilidad | API específica de MySQL | API común; el SQL y algunas opciones aún pueden requerir cambios |
La cadena de conexión (DSN)
Para conectar, necesitamos definir el DSN (Data Source Name). Es simplemente un string que le dice a PDO: “Qué tipo de base de datos es, dónde está y cómo se llama”.
Formato típico:
mysql:host=localhost;dbname=mi_tienda;charset=utf8mb4
- host: La dirección del servidor (suele ser
localhosto una IP). - dbname: El nombre de tu base de datos.
- charset: Muy importante. Usa siempre
utf8mb4(no soloutf8). Esto asegura que puedas guardar emojis (😊) y caracteres especiales sin que se rompa nada.
Código de conexión segura y robusta
Vamos a crear una conexión que, si falla, nos avise correctamente (usando try-catch del Módulo 5) y que se configure automáticamente para ser segura.
<?php
// Configuración (Idealmente esto vendría de $_ENV, como vimos en el Módulo 6)
$host = 'localhost';
$db = 'curso_php';
$user = 'root';
$pass = ''; // En XAMPP suele estar vacío, en MAMP es 'root'
$charset = 'utf8mb4';
// Construimos el DSN
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
// Opciones de configuración de PDO (Vitales para seguridad y comodidad)
$options = [
// Si hay error, lanza una Excepción (en lugar de fallar en silencio)
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// Los datos vendrán siempre como Arrays Asociativos (más fácil de leer)
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// Pedir al driver de MySQL sentencias preparadas nativas
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
// Intentamos conectar
$pdo = new PDO($dsn, $user, $pass, $options);
echo "¡Conexión exitosa a la base de datos!";
} catch (PDOException $e) {
// Si falla, capturamos el error específico de PDO
// IMPORTANTE: En producción, nunca hagas 'echo' del error directo al usuario,
// regístralo en un log interno.
die("Error de conexión: " . $e->getMessage());
}Desglosando las opciones ($options)
Ese array de opciones es lo que diferencia a un principiante de un pro:
ERRMODE_EXCEPTION: Hace que los fallos de PDO lancen excepciones. Es el modo predeterminado desde PHP 8, pero declararlo deja explícita la intención y ayuda si el código se ejecuta en otro entorno.FETCH_ASSOC: Cuando pidamos datos, nos los dará así:['nombre' => 'Juan']. Si no ponemos esto, por defecto los duplica:[0 => 'Juan', 'nombre' => 'Juan'], gastando el doble de memoria.EMULATE_PREPARES => false: Pide al driver de MySQL que use sentencias preparadas nativas. Tanto el modo nativo como el emulado separan parámetros y SQL cuando se usan correctamente; elige según las capacidades y limitaciones del driver.