downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

Transacciones y 'auto-commit'> <Constantes predefinidas
[edit] Last updated: Thu, 23 May 2013

view this page in

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 datos (conocido como DSN) y, opcionalmente, el nombre de usuario y la contraseña (si la hubiera).

Ejemplo #1 Conectarse a MySQL

<?php
$gbd 
= new PDO('mysql:host=localhost;dbname=test'$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 gestor de excepciones global de una aplicación configurado mediante set_exception_handler().

Ejemplo #2 Manejo de errores de conexión

<?php
try {
    
$gbd = new PDO('mysql:host=localhost;dbname=test'$usuario$contraseña);
    foreach(
$gbd->query('SELECT * from FOO') as $fila) {
        
print_r($fila);
    }
    
$gbd 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 rastreo. 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.

Ejemplo #3 Cerrar una conexión

<?php
$gbd 
= new PDO('mysql:host=localhost;dbname=test'$usuario$contraseña);
// Use la conexión aquí


// ya se ha terminado; la cerramos
$gbd 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
$gbd 
= new PDO('mysql:host=localhost;dbname=test'$usuario$contraseña, array(
    
PDO::ATTR_PERSISTENT => true
));
?>

Nota:

Si se quiere usar 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 agrupamiento 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 agrupamiento de conexiones de ODBC. El agrupamiento de conexiones de ODBC es compartido 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 al agrupamiento de conexiones de ODBC, dando como resultado la creación de conexiones adicionales para servir a los demás módulos.



Transacciones y 'auto-commit'> <Constantes predefinidas
[edit] Last updated: Thu, 23 May 2013
 
add a note add a note User Contributed Notes Conexiones y su administración - [6 notes]
up
9
neville at whitespacers dot com
3 years ago
To avoid exposing your connection details should you fail to remember to catch any exception thrown by the PDO constructor you can use the following class to implicitly change the exception handler temporarily.

<?php

Class SafePDO extends PDO {
 
        public static function
exception_handler($exception) {
           
// Output the exception details
           
die('Uncaught exception: ', $exception->getMessage());
        }
 
        public function
__construct($dsn, $username='', $password='', $driver_options=array()) {

           
// Temporarily change the PHP exception handler while we . . .
           
set_exception_handler(array(__CLASS__, 'exception_handler'));

           
// . . . create a PDO object
           
parent::__construct($dsn, $username, $password, $driver_options);

           
// Change the exception handler back to whatever it was before
           
restore_exception_handler();
        }

}

// Connect to the database with defined constants
$dbh = new SafePDO(PDO_DSN, PDO_USER, PDO_PASSWORD);

?>
up
3
ekkart at ekkart dot de
2 years ago
In order to set the encoding of the database connection, use the exec function:
<?php
try {
   
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
   
$dbh->exec("SET CHARACTER SET utf8");
   
$dbh = null;
} catch (
PDOException $e) {
    print
"Error!: " . $e->getMessage() . "<br/>";
    die();
}
?>
up
3
jak dot spalding at gmail dot com
2 years ago
Just thought I'd add in and give an explanation as to why you need to use 127.0.0.1 if you have a different port number.

The mysql libraries will automatically use Unix sockets if the host of "localhost" is used. To force TCP/IP you need to set an IP address.
up
0
angela
3 years ago
I spent hours today trying to get my portable wamp to update a database, using localhost:800 and port 3307 for mysql. For it to work I needed to adjust the connect() instruction as described:
$dsn = "mysql:host=127.0.0.1;port=3307;dbname=mydatabase";
up
-1
dan dot franklin at pearson dot com
5 years ago
Note that you can specify a port number with "port=####", but this port number will be ignored if the host is localhost.  If you want to connect to a local port other than the default, use host=127.0.0.1 instead of localhost.
up
-1
alvaro at demogracia dot com
1 year ago
On connection errors, the PDO constructor seems to do two things no matter your PDO::ATTR_ERRMODE setting:

1. Trigger a warning
2. Throw a PDOException

If you set the PDO::ATTR_ERRMODE parameter, it will only take effect on further operations.

 
show source | credits | sitemap | contact | advertising | mirror sites