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.
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
PDOExceptionque puedes capturar limpiamente con bloquestry...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 aexecute().
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.