borrame.com - Colección particular de recortes de código y documentación para programación web

Canales RSS

Lo más fresco

  1. Enlaces sobre desarrollo web Modificado
  2. Cadena aleatoria en PHP Modificado
  3. Recortar texto Nuevo

Sugerencias del chef

Lo más visitado

  1. Canales RSS
  2. Formato condicional según el día de la semana
  3. Enlaces sobre desarrollo web
  4. Recortar texto
  5. Convertir de minutos a horas
Compartir esta página

Conectarse a MySQL con PDO

Configurar PDO para MySQL puede ser lioso. Entre bugs de una y otra parte, mejoras tardías, opciones predeterminadas cuestionables, servidores con configuraciones peculiares… es imposible recordar todos los detalles. Esta es mi chuleta.

/** * @param string $servidor * @param string $base_de_datos * @param string $usuario * @param string $contrasena * @param string $codificacion * @return PDO * @throws PDOException * * @version 2017-11-11 */ function conectar($servidor, $base_de_datos, $usuario, $contrasena, $codificacion = 'utf8mb4') { $dsn = "mysql:host=$servidor;dbname=$base_de_datos"; $opciones = array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_AUTOCOMMIT => true, // Solo hay transacción si la iniciamos explícitamente // Debemos habilitar buffered queries si el servidor muestra este error: // // SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. // Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, // you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. #PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); $set = array(); $soporte_dsn_charset = version_compare(PHP_VERSION, '5.3.6', '>='); $soporte_init_command = defined('PDO::MYSQL_ATTR_INIT_COMMAND'); /* * Cómo establecer el juego de caracteres de la conexión depende de la versión de PHP. En orden de preferencia: * * 1. Parámetro charset en el DSN * 2. Opción PDO::MYSQL_ATTR_INIT_COMMAND * 3. Ejecutar SET NAMES utf8 directamente */ if ($soporte_dsn_charset) { $dsn .= ";charset=$codificacion"; } else { $set[] = "NAMES $codificacion"; } /* * Modo estricto - https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_traditional */ $set[] = "@@SESSION.sql_mode='TRADITIONAL'"; if ($soporte_init_command) { $opciones[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET ' . implode(', ', $set); } $conexion = @new PDO($dsn, $usuario, $contrasena, $opciones); if (!$soporte_init_command) { $conexion->exec('SET ' . implode(', ', $set)); } return $conexion; }

Recuerda: solo es una plantilla y además pensada para cubrir muchas versiones de PHP (casi todas ya obsoletas) que tal vez ni uses. Personalízala según tus necesidades (quizás en el constructor de una clase que herede de PDO).

¿@new PDO()? ¿En serio?

El operador @ siempre es polémico pero un Warning: PDO::__construct(): [2002] Se produjo un error durante el intento de conexión ya que la par (trying to connect via tcp://localhost:3306) sumado a la excepción es francamente poco útil y @ es lo más fácil. Aplíquese aquí el criterio de cada cual: @, gestor de errores personalizado… o nada.

Historial

v2017-11-11
Organizar el código de forma más lógica.
Dar forma de función para documentar mejor los parámetros.
v2013-03-22
Primera versión.

Esta página ha sido impresa el jueves 13 de agosto de 2026 (14:59:36 +0200) desde https://borrame.com/recortes/php/pdo-mysql.html. La última vez que miré contenía HTML válido con CSS fresquito y si tiene flatas de ortografía ha sido sin querer.

Lorem ipsum dolor sit amet.

© 2005-2026 by Álvaro González (alvaro.es) • Burgos (España) • borrame.com