PDO y MySQL: modernizar una conexión PHP antigua
Evolución de una conexión PDO de 2018: credenciales fuera del código, utf8mb4, excepciones y consultas preparadas.
- Revisado
- Compatibilidad
- PHP 8.1+; concepto aplicable a PDO desde PHP 5
- Lectura
- 2 min
- Autor
- Gabriel — infinit8
Las notas originales ya usaban PDO y excepciones, dos decisiones acertadas para su época. El problema era común en proyectos internos: credenciales escritas en el snippet y SET NAMES utf8 ejecutado después de conectar.
Configuración actualizada
El juego de caracteres forma parte del DSN y los secretos proceden del entorno. El ejemplo falla pronto si falta configuración en lugar de inventar valores por defecto.
$dsn = sprintf(
'mysql:host=%s;dbname=%s;charset=utf8mb4',
getenv('APP_DB_HOST'),
getenv('APP_DB_NAME')
);
$pdo = new PDO($dsn, getenv('APP_DB_USER'), getenv('APP_DB_PASSWORD'), [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
Nunca publiques credenciales aunque sean antiguas. Si alguna vez estuvieron en un repositorio o página accesible, rótalas en el proveedor correspondiente.
Valores mediante parámetros
Los valores externos no se concatenan en SQL. Los nombres de tabla o columna no pueden sustituirse con parámetros: deben salir de una lista permitida.
$statement = $pdo->prepare(
'SELECT id_product, reference FROM ps_product WHERE id_product = :id'
);
$statement->execute(['id' => $productId]);
$product = $statement->fetch();
Qué merece conservarse
La transición desde APIs MySQL antiguas hacia PDO, el modo de excepciones y la separación de la conexión fueron pasos importantes. Modernizar no significa borrar el aprendizaje, sino completar las garantías que entonces faltaban.
Preguntas frecuentes
¿Por qué utf8mb4 y no utf8?
En MySQL, utf8mb4 representa todo Unicode, incluidos caracteres de cuatro bytes. Declararlo en el DSN permite al driver conocer el juego de caracteres desde la conexión.
¿Las consultas preparadas permiten parametrizar una tabla?
No. Los marcadores representan valores completos, no identificadores ni fragmentos de sintaxis.
Referencias y revisión
Contenido contrastado con documentación oficial. Comprueba siempre el comportamiento en un entorno de pruebas antes de desplegar cambios.