# Conexiones y su administración

Las conexiones se establecen creando instancias de la clase base PDO. No importa el controlador que se utilice; siempre se usará el nombre de la clase PDO. El constructor acepta parámetros para especificar el origen de la base de datos (conocido como DSN) y, opcionalmente, el nombre de usuario y la contraseña (si la hubiera).

Ejemplo #1 Conectarse a MySQL

`<?php
$mbd = new PDO('mysql:host=localhost;dbname=prueba', $usuario, $contraseña);
?>`

Si hubieran errores de conexión, se lanzará un objeto `PDOException`. Se puede capturar la excepción si fuera necesario manejar la condición del error, o se podría optar por dejarla en manos de un manejador de excepciones global de aplicación configurado mediante set_exception_handler().

Ejemplo #2 Manejo de errores de conexión

`<?php
try {
$mbd = new PDO('mysql:host=localhost;dbname=prueba', $usuario, $contraseña);
foreach($mbd->query('SELECT * from FOO') as $fila) {
print_r($fila);
}
$mbd = null;
} catch (PDOException $e) {
print "¡Error!: " . $e->getMessage() . "<br/>";
die();
}
?>`
Advertencia

Si la aplicación no captura la excepción lanzada por el constructor de PDO, la acción predeterminada que toma el motor zend es la de finalizar el script y mostrar información de seguimiento. Esta información probablemente revelará todos los detalles de la conexión a la base de datos, incluyendo el nombre de usuario y la contraseña. Es su responsabilidad capturar esta excepción, ya sea explícitamente (con una sentencia `catch`) o implícitamente por medio de set_exception_handler().

Una vez realizada con éxito una conexión a la base de datos, será devuelta una instancia de la clase PDO al script. La conexión permanecerá activa durante el tiempo de vida del objeto PDO. Para cerrar la conexión, es necesario destruir el objeto asegurándose de que todas las referencias a él existentes sean eliminadas; esto se puede hacer asignando `null` a la variable que contiene el objeto. Si no se realiza explícitamente, PHP cerrará automáticamente la conexión cuando el script finalice.

> Nota: Si aún existen otras referencias a esta instancia de PDO (tales como desde una instancia de PDOStatement, o desde otras variables que hacen referencia a la misma instancia de PDO), estas también han de eliminarse (por ejemplo, asignando NULL a la variable que hace referencia al PDOStatement).

Ejemplo #3 Cerrar una conexión

`<?php
$mbd = new PDO('mysql:host=localhost;dbname=prueba', $usuario, $contraseña);
// Utilizar la conexión aquí
$sth = $mbd->query('SELECT * FROM foo');
// Ya se ha terminado; se cierra
$sth = null;
$mbd = null;
?>`

Muchas aplicaciones web se beneficiarán del uso de conexiones persistentes a servidores de bases de datos. Las conexiones persistentes no son cerradas al final del script, sino que son almacenadas en caché y reutilizadas cuando otro script solicite una conexión que use las mismas credenciales. La caché de conexiones persistentes permite evitar la carga adicional de establecer una nueva conexión cada vez que un script necesite comunicarse con la base de datos, dando como resultado una aplicación web más rápida.

Ejemplo #4 Conexiones persistentes

`<?php
$mbd = new PDO('mysql:host=localhost;dbname=prueba', $usuario, $contraseña, array(
PDO::ATTR_PERSISTENT => true
));
?>`

> Nota:

> Para utilizar conexiones persistentes, se deberá establecer `PDO::ATTR_PERSISTENT` en las opciones del array del controlador pasado al constructor de PDO. Si este atributo se establece con PDO::setAttribute() después de la instanciación del objeto, el controlador no utilizará conexiones persistentes.

> Nota:

> Si se usa el controlador PDO y las bibliotecas ODBC admiten el aprovisionamiento de conexiones ODBC (unixODBC y Windows lo hacen; podrían haber más), se recomienda no utilizar las conexiones persistentes de PDO, y, en su lugar, dejar el almacenamiento en caché de conexiones a la capa del aprovisionamiento de conexiones de ODBC. La provisión de conexiones de ODBC se comparte con otros módulos en el proceso; si se le indica a PDO que almacene en caché la conexión, entonces dicha conexión nunca será devuelta a la provisión de conexiones de ODBC, dando como resultado la creación de conexiones adicionales para servir a los demás módulos.