certmundo.
es‑mx

6 min de lectura

¿Cómo conectar PHP con MySQL usando PDO?

Conectar PHP con MySQL usando PDO significa crear un puente seguro entre tu código y tu base de datos mediante la extensión PDO (PHP Data Objects).

El problema con la conexión antigua

Imagina que eres desarrollador en una tienda en línea como Liverpool. Un día alguien escribe esto en el buscador del sitio: ' OR '1'='1. Si tu conexión a la base de datos usa las funciones antiguas de mysql_connect(), ese texto puede destruir o exponer toda tu base de datos en segundos. Ese tipo de ataque se llama inyección SQL y fue la causa de cientos de hackeos en México durante los años 2010–2015.

Las funciones antiguas como mysql_query() ya no existen en PHP moderno. Fueron eliminadas porque eran inseguras y difíciles de mantener. Hoy tienes dos opciones modernas: MySQLi y PDO. Esta lección se enfoca en PDO porque es más flexible y funciona con múltiples motores de base de datos.

¿Qué es PDO exactamente?

PDO significa PHP Data Objects. Es una capa de abstracción que te permite conectarte a MySQL, PostgreSQL, SQLite y otros motores usando el mismo código base. Piensa en PDO como un adaptador universal de corriente: sin importar el país (motor de base de datos), el enchufe siempre funciona igual.

Las ventajas clave de PDO son tres:

  • Sentencias preparadas: protegen contra inyección SQL de forma automática.
  • Compatibilidad: cambia de MySQL a otro motor con cambios mínimos.
  • Manejo de errores: usa excepciones de PHP, lo que hace el código más limpio.

El sistema de conexión PDO: el patrón DSN

Para conectarte con PDO necesitas construir un DSN (Data Source Name). Es una cadena de texto que le dice a PDO dónde está tu base de datos y cómo llamarla. El formato para MySQL es este:

mysql:host=SERVIDOR;dbname=NOMBRE_BASE;charset=utf8mb4

Este DSN tiene tres partes importantes:

  • mysql: — le indica a PDO que el motor es MySQL.
  • host= — la dirección del servidor (casi siempre localhost en desarrollo local).
  • dbname= — el nombre exacto de tu base de datos.
  • charset=utf8mb4 — garantiza que los caracteres especiales como ñ, é, á funcionen correctamente.

Recuerda que en la lección anterior configuramos la base de datos con utf8mb4_unicode_ci. Aquí se cierra ese círculo: el charset del DSN debe coincidir con el de tu base de datos.

Cómo escribir la conexión paso a paso

La forma más segura de manejar la conexión es crear un archivo separado llamado conexion.php. Nunca escribas las credenciales directamente en cada página de tu sitio. Aquí está el código completo:

<?php
$host     = 'localhost';
$dbname   = 'tienda_liverpool';
$usuario  = 'root';
$password = 'mi_clave_segura';
$charset  = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";

$opciones = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    $pdo = new PDO($dsn, $usuario, $password, $opciones);
} catch (PDOException $e) {
    die('Error de conexión: ' . $e->getMessage());
}

Analicemos cada bloque:

Las variables de credenciales ($host, $dbname, $usuario, $password) se definen por separado. Esto te permite cambiarlas sin tocar el resto del código. En un servidor de producción estas variables vendrían de un archivo .env externo para mayor seguridad.

El array $opciones configura el comportamiento de PDO con tres ajustes:

  • ERRMODE_EXCEPTION hace que PDO lance una excepción cuando ocurre un error. Sin esto, los errores pasan silenciosos y son imposibles de depurar.
  • FETCH_ASSOC hace que los resultados lleguen como arreglos asociativos ($row['nombre']) en lugar de índices numéricos ($row[0]). Es mucho más legible.
  • EMULATE_PREPARES => false activa las sentencias preparadas reales en el servidor MySQL. Esto es crítico para la seguridad.

El bloque try-catch intenta crear la conexión. Si falla (contraseña incorrecta, servidor apagado, base de datos inexistente), atrapa el error y detiene la ejecución con un mensaje claro.

Tu primera consulta con PDO

Ya tienes la conexión en $pdo. Ahora úsala para obtener datos. Supongamos que tu base de datos tiene una tabla productos con columnas nombre y precio.

<?php
require_once 'conexion.php';

$stmt = $pdo->query('SELECT nombre, precio FROM productos LIMIT 5');

while ($fila = $stmt->fetch()) {
    $precio_formato = '$' . number_format($fila['precio'], 0, '.', ',');
    echo $fila['nombre'] . ' — ' . $precio_formato . '<br>';
}

Si tu tabla tiene datos reales, la salida en pantalla sería algo así:

Playera Bimbo Edición Especial — $350
Termo FEMSA 500ml — $289
Mochila Liverpool Sport — $1,200
Audífonos Bluetooth — $2,499
Funda para celular — $180

Fíjate cómo number_format() formatea el precio con coma como separador de miles. Esto es importante para mostrar precios en formato mexicano correcto: $1,200 en lugar de 1200.

Consultas con parámetros: la protección real

Cuando el usuario ingresa datos (un buscador, un formulario de login), nunca los pongas directo en el SQL. Usa sentencias preparadas con marcadores de posición. Así funciona:

<?php
require_once 'conexion.php';

$categoria = $_GET['categoria'] ?? 'ropa';

$stmt = $pdo->prepare('SELECT nombre, precio FROM productos WHERE categoria = :categoria');
$stmt->execute([':categoria' => $categoria]);

$productos = $stmt->fetchAll();

foreach ($productos as $producto) {
    $precio_formato = '$' . number_format($producto['precio'], 0, '.', ',');
    echo $producto['nombre'] . ': ' . $precio_formato . '<br>';
}

El :categoria es un marcador de posición. PDO reemplaza ese marcador con el valor real de forma segura, escapando cualquier carácter peligroso. Si alguien manda ' OR '1'='1 como categoría, PDO lo trata como texto plano, no como código SQL. El ataque falla completamente.

Errores comunes que debes evitar

Error 1: Poner las credenciales en cada archivo. Muchos principiantes escriben new PDO(...) con usuario y contraseña en diez archivos distintos. Cuando cambias la contraseña del servidor, tienes que editar diez archivos. Crea siempre un solo conexion.php y usa require_once donde lo necesites.

Error 2: Ignorar el charset en el DSN. Si no pones charset=utf8mb4 en el DSN, los nombres con acentos (Región, Jalapeño, González) pueden guardarse o leerse como caracteres extraños. Siempre incluye el charset desde el principio.

Error 3: Mostrar el error de conexión en producción. El bloque catch con die($e->getMessage()) está bien en desarrollo, pero en un servidor público eso le muestra al atacante el nombre de tu base de datos, el servidor y las credenciales parciales. En producción, guarda el error en un log privado y muestra solo un mensaje genérico al usuario.

Error 4: Usar query() con datos del usuario. El método query() sirve para consultas fijas sin variables externas. En cuanto haya un dato que viene del usuario (formulario, URL, cookie), usa obligatoriamente prepare() y execute().

Error 5: No verificar si la conexión fue exitosa antes de usarla. Si el archivo conexion.php falla silenciosamente y luego intentas usar $pdo, PHP lanzará un error de variable indefinida difícil de rastrear. El bloque try-catch garantiza que el script se detenga inmediatamente si la conexión falla.

Estructura de archivos recomendada

Para un proyecto real, organiza tus archivos así:

/mi_tienda/
├── conexion.php        ← credenciales y objeto $pdo
├── productos.php       ← lista productos usando require_once
├── detalle.php         ← detalle de un producto
└── admin/
    ├── agregar.php     ← formulario para agregar productos
    └── editar.php      ← formulario para editar

Esta estructura separa las responsabilidades. conexion.php solo conecta. El resto de archivos solo consultan. Si mañana cambias de servidor, editas un solo archivo.

Una conexión segura es la base de todo

Todo lo que construyas en PHP y MySQL —catálogos de productos, carritos de compra, sistemas de usuarios— depende de que esta conexión esté bien hecha. PDO con sentencias preparadas y opciones correctas no es un detalle técnico avanzado: es el piso sobre el que descansa toda tu aplicación.

Una conexión PDO bien configurada no solo conecta tu código a la base de datos, sino que protege todos tus datos desde el primer día.

Puntos clave

  • PDO (PHP Data Objects) es la forma moderna y segura de conectar PHP con MySQL. Reemplaza las funciones antiguas `mysql_*` que ya no existen en PHP moderno.
  • El DSN (Data Source Name) debe incluir siempre `charset=utf8mb4` para que los caracteres especiales del español (ñ, é, á) funcionen correctamente en tu aplicación.
  • Configura PDO con tres opciones clave: `ERRMODE_EXCEPTION` para capturar errores, `FETCH_ASSOC` para resultados legibles y `EMULATE_PREPARES => false` para activar la protección real contra inyección SQL.
  • Usa siempre `prepare()` y `execute()` con marcadores de posición (`:variable`) cuando el SQL incluya datos del usuario. Nunca uses `query()` con valores de formularios o URLs.
  • Centraliza tus credenciales en un solo archivo `conexion.php` y usa `require_once` en el resto de tus páginas. Cambiar el servidor será editar un solo archivo, no diez.

Comparte esta lección: