Programación Avanzada PHP – PDO

Introducción a PDO

PDO (PHP Data Objects) es una extensión de PHP que proporciona una capa de abstracción para interactuar con bases de datos de forma segura y eficiente.

Ventajas de PDO

  • Compatible con múltiples bases de datos.
  • Usa consultas preparadas, evitando inyecciones SQL.
  • Permite manejar excepciones con try-catch.

Configuración de PDO y conexión a la base de datos

Para este ejemplo usaremos la siguiente base de datos

CREATE DATABASE ejemplo_pdo;
USE ejemplo_pdo;

CREATE TABLE usuarios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50),
    email VARCHAR(50),
    edad INT
);

Conectar con PDO

<?php
$host = "localhost";
$dbname = "ejemplo_pdo";
$user = "root";
$pass = "";

try {
    $conexion = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass);
    $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "Conexión exitosa";
} catch (PDOException $e) {
    echo "Error en la conexión: " . $e->getMessage();
}
?>

Usando exec() (NO recomendado para datos de usuario)

<?php
$sql = "INSERT INTO usuarios (nombre, email, edad) VALUES ('Juan Pérez', 'juan@example.com', 30)";
$conexion->exec($sql);
echo "Usuario agregado";
?>

Usando consultas preparadas (RECOMENDADO)

<?php
$sql = "INSERT INTO usuarios (nombre, email, edad) VALUES (:nombre, :email, :edad)";
$stmt = $conexion->prepare($sql);
$stmt->execute([
    ":nombre" => "María López",
    ":email" => "maria@example.com",
    ":edad" => 25
]);
echo "Usuario agregado";
?>

Consultar datos con PDO

<?php
$sql = "SELECT * FROM usuarios WHERE email = :email";
$stmt = $conexion->prepare($sql);
$stmt->execute([":email" => "maria@example.com"]);
$usuario = $stmt->fetch(PDO::FETCH_ASSOC);

print_r($usuario);
?>

Obtener un solo registro

<?php
$sql = "SELECT * FROM usuarios WHERE email = :email";
$stmt = $conexion->prepare($sql);
$stmt->execute([":email" => "maria@example.com"]);
$usuario = $stmt->fetch(PDO::FETCH_ASSOC);

print_r($usuario);
?>

Obtener todos los registros

<?php
$sql = "SELECT * FROM usuarios";
$stmt = $conexion->query($sql);
$usuarios = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($usuarios as $usuario) {
    echo "Nombre: " . $usuario["nombre"] . "<br>";
}
?>

Actualizar datos con PDO

<?php
$sql = "UPDATE usuarios SET edad = :edad WHERE email = :email";
$stmt = $conexion->prepare($sql);
$stmt->execute([
    ":edad" => 35,
    ":email" => "maria@example.com"
]);
echo "Usuario actualizado";
?>

Eliminar datos con PDO

<?php
$sql = "DELETE FROM usuarios WHERE email = :email";
$stmt = $conexion->prepare($sql);
$stmt->execute([":email" => "juan@example.com"]);
echo "Usuario eliminado";
?>

Crearemos ahora una clase para manejar la base de datos con PDO

<?php
class Database {
    private $host = "localhost";
    private $dbname = "ejemplo_pdo";
    private $user = "root";
    private $pass = "";
    private $conexion;

    public function __construct() {
        try {
            $this->conexion = new PDO("mysql:host={$this->host};dbname={$this->dbname};charset=utf8mb4", $this->user, $this->pass);
            $this->conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            die("Error en la conexión: " . $e->getMessage());
        }
    }

    public function ejecutar($sql, $params = []) {
        $stmt = $this->conexion->prepare($sql);
        return $stmt->execute($params);
    }

    public function obtenerUno($sql, $params = []) {
        $stmt = $this->conexion->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    public function obtenerTodos($sql, $params = []) {
        $stmt = $this->conexion->prepare($sql);
        $stmt->execute($params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}
?>

Y una clase Usuario para manejar los datos

<?php
require_once "Database.php";

class Usuario {
    private $db;

    public function __construct() {
        $this->db = new Database();
    }

    public function agregarUsuario($nombre, $email, $edad) {
        $sql = "INSERT INTO usuarios (nombre, email, edad) VALUES (:nombre, :email, :edad)";
        return $this->db->ejecutar($sql, [":nombre" => $nombre, ":email" => $email, ":edad" => $edad]);
    }

    public function obtenerUsuario($email) {
        $sql = "SELECT * FROM usuarios WHERE email = :email";
        return $this->db->obtenerUno($sql, [":email" => $email]);
    }

    public function obtenerUsuarios() {
        $sql = "SELECT * FROM usuarios";
        return $this->db->obtenerTodos($sql);
    }
}
?>

Probamos la clase Usuario.php

<?php
require_once "Usuario.php";

$usuario = new Usuario();

// Agregar usuario
$usuario->agregarUsuario("Carlos Gómez", "carlos@example.com", 40);

// Obtener un usuario
$resultado = $usuario->obtenerUsuario("carlos@example.com");
print_r($resultado);

// Obtener todos los usuarios
$todos = $usuario->obtenerUsuarios();
foreach ($todos as $user) {
    echo "Nombre: " . $user["nombre"] . "<br>";
}
?>

A esto deberiamos de agregar manejo de sesiones y autentificación más adelante :).

Deja un comentario

I’m Luis E. Fagúndez

Bienvenidos a mi página web personal. Mi nombre es Luis, me gusta enseñar, programar y tomar litros y litros de café.

En esta web vas a encontrar materiales sobre educación, programación, Gnu/Linux, software libre y mucho más.

Esta web busca brindar información sobre las asignaturas que imparto en DGETP-UTU, así como proyectos personales y otras cosas.

Gracias por ser parte de esta hermosa comunidad.

Formas de contacto