Inicio > Cursos > PHP > Bases de Datos con PDO
PHPPOO y PHP ModernoLección 11 de 15

Bases de Datos con PDO

PDO (PHP Data Objects) es la capa de abstracción de base de datos de PHP que funciona con MySQL, PostgreSQL, SQLite, Oracle y más, usando la misma API. La conexión se crea con new PDO($dsn, $usuario, $password). Si hay un error de conexión, lanza una PDOException. La ventaja de PDO sobre las antiguas funciones mysql_* (que están obsoletas y eliminadas) es la unificación de la API y la seguridad.

Los prepared statements (consultas preparadas) son la protección fundamental contra SQL Injection. En lugar de insertar variables directamente en la consulta SQL (vulnerable), usas marcadores de posición (:nombre o ?) y pasas los valores por separado con execute(). PDO escapa los valores automáticamente, haciendo imposible que un valor malicioso rompa la consulta SQL. Esta técnica es absolutamente obligatoria en cualquier aplicación PHP que maneje datos del usuario.

<?php
// Conectar con PDO
try {
    $pdo = new PDO(
        "mysql:host=localhost;dbname=mi_db;charset=utf8",
        "usuario",
        "contraseña",
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false
        ]
    );
} catch (PDOException $e) {
    die("Error: " . $e->getMessage());
}

// SELECT simple
$usuarios = $pdo->query("SELECT * FROM usuarios")->fetchAll();

// SELECT con prepared statement (SEGURO contra SQL injection)
$id = 1;
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE id = ?");
$stmt->execute([$id]);
$usuario = $stmt->fetch();

// Parámetros nombrados
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE nombre = :nombre");
$stmt->execute([":nombre" => "Ana"]);

// INSERT
$stmt = $pdo->prepare(
    "INSERT INTO usuarios (nombre, email) VALUES (?, ?)"
);
$stmt->execute(["Carlos", "carlos@mail.com"]);
$nuevoId = $pdo->lastInsertId();

// UPDATE
$stmt = $pdo->prepare("UPDATE usuarios SET edad = ? WHERE id = ?");
$stmt->execute([31, $nuevoId]);

// DELETE
$stmt = $pdo->prepare("DELETE FROM usuarios WHERE id = ?");
$stmt->execute([$nuevoId]);

// Transacción
try {
    $pdo->beginTransaction();
    $pdo->prepare("INSERT INTO pedidos (usuario_id) VALUES (?)")->execute([1]);
    $pdo->prepare("UPDATE inventario SET stock = stock - 1 WHERE id = ?")->execute([5]);
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollback();
    throw $e;
}
Consejo🔒 SIEMPRE usa Prepared Statements con PDO. NUNCA concatenes valores del usuario directamente en SQL. La concatenación directa permite SQL injection.
← Herencia, Interfaces y TraitsSeguridad Web: XSS y Validación →

Practica esta lección

Resuelve los ejercicios del curso de PHP en la app, gratis y con corrección automática.

Empezar a practicar