Hola, esta es la clase que utilizo para conectar con la base de datos mediante PHP PDO.
<?php class Database { private $dsn; private $host; private $port; private $database; private $user; private $pwd; private $charset; private $typeDb; public $_con; public $servidor; public $errorConnection; protected $reconnectRetries; function __construct($servidor = 'default'){ global $__SERVERS_; if(isset($__SERVERS_[$servidor])): $this->dsn = $__SERVERS_[$servidor]['dsn']; $this->host = $__SERVERS_[$servidor]['host']; $this->port = $__SERVERS_[$servidor]['port']; $this->database = $__SERVERS_[$servidor]['database']; $this->user = $__SERVERS_[$servidor]['user']; $this->pwd = $__SERVERS_[$servidor]['pwd']; $this->charset = $__SERVERS_[$servidor]['charset']; $this->typeDb = strtolower($__SERVERS_[$servidor]['type']); $this->server = $servidor; $this->errorConnection = false; $this->reconnectRetries = 3; $this->_connect(); else: // Guardar en un LOG o algo parecido ya que de lo contrario para la ejecución del fichero // exit('Servidor desconocido '.$servidor); endif; } /** * Conectar contra la base de datos */ public function _connect(){ try { if($this->typeDb == 'AS400'): $cn = "$this->dsn;DBQ=$this->database;DATABASE=$this->database;$this->charset;SYSTEM=$this->host;UID=$this->user;PWD=$this->pwd;"; elseif($this->typeDb == 'MYSQL'): $cn = "$this->dsn:host=$this->host:$this->port;dbname=$this->database;$this->charset;"; elseif($this->typeDb == 'SQL'): // Hace falta la libreria PDO_SQLSRV $cn = "$this->dsn:Server=$this->host;Database=$this->database;"; elseif($this->type == 'sqlODBC'): $cn = "$this->dsn;Server=$this->host,$this->port;Database=$this->database;"; elseif($this->type == 'sqlExpress'): $cn = "$this->dsn:Server=$this->host;Database=$this->database;"; elseif($this->typeDb == 'ORACLE'): // Hace falta la libreria OCI de Oracle $cn = "$this->dsn:dbname=$this->database;host=$this->host;"; else: throw new Exception("Error tipo de conexión desconocida"); endif; // $option = array(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->_con = new PDO($cn, $this->user, $this->pwd, array()); $this->_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); if($this->typeDb == 'mysql') $this->_con->exec("SET NAMES utf8"); if($this->typeDb == 'sql') $this->_con->exec("SET DATEFORMAT ymd"); if($this->_con) return $this->_con; // Devuelve la conexión, pero tambien podemos trabajar con la propiedad class->_con else throw new Exception("Error no se ha podido establecer la conexión"); }catch (PDOException $e) { // Esto para producción habria que controlarlo de alguna forma, guardarlo en un LOG o algo parecido // exit('!!!ERROR DB '.strtoupper($this->server).' !!!'); } } /** * Cerrar la conexion con la base de datos */ public function _close(){ $this->_con = NULL; } /** * Cambiar la BD sobre la misma conexión * * @param {string} nombre de la base de datos */ public function _changeDB($db){ $this->_con->exec("USE $db"); } /** * Reconectar con la base de datos */ protected function _reConnect(){ $this->_close(); $this->_connect(); } /** * Comprobar que la conexión esta activa, si no * se intenta reconectar $reconnectRetries veces * @return [boolean] */ public function _checkConnection(){ if(!$this->_con){ for ($tries = 1; $tries <= $this->reconnectRetries; $tries++) { $this->_connect(); if($this->errorConnection){ $this->_reConnect(); }else{ $this->errorConnection = false; break; } if ($tries == $this->reconnectRetries) { $this->_close(); $this->errorConnection = true; break; } } }else{ $this->errorConnection = false; } return $this->errorConnection; } } ?>
Y aquí como se crea el array con las diferentes conexiones, pueden estar en un fichero de configuración o en el mismo fichero PHP de la clase o incluso crear una propiedad dentro de la clase que contenga todo esto, se pueden tener tantas como se quiera, lo único que cambia es el nombre.
$__SERVERS_ = array(); $__SERVERS_['default'] = array( 'dsn' => 'sqlsrv', 'host' => 'IP', 'port' => '1433', 'database' => 'nombre base de datos', 'user' => 'usuario', 'pwd' => 'contraseña', 'charset' => 'UTF-8', 'type' => 'SQL' ); $__SERVERS_['nombre'] = array( 'dsn' => 'sqlsrv', 'host' => 'IP\sqlexpress', 'port' => '1433', 'database' => 'tracking_trans', 'user' => 'sa', 'pwd' => 'Master01', 'charset' => 'Client_CSet=UTF-8', 'type' => 'sqlExpress' ); $__SERVERS_['Nombre2'] = array( 'dsn' => 'odbc:DRIVER={iSeries Access ODBC Driver}', 'host' => '', 'port' => '', 'database' => '', 'user' => '', 'pwd' => '', 'charset' => 'Client_CSet=UTF-8', 'type' => 'AS400' ); $__SERVERS_['Nombre3'] = array( 'dsn' => 'odbc:Driver={SQL Server Native Client 10.0}', 'host' => '', 'port' => '1433', 'database' => '', 'user' => '', 'pwd' => '', 'charset' => 'CharacterSet=UTF-8', 'type' => 'sqlODBC' ); $__SERVERS_['Nombre4'] = array( 'dsn' => 'mysql', 'host' => '', 'port' => '3306', 'database' => '', 'user' => '', 'pwd' => '', 'charset' => 'UTF-8', 'type' => 'MYSQL' );
Y aquí un ejemplo de como utilizar
// Aquí se conecta a la base de datos por defecto $clDb = new Database(); $clDb ->_connect(); $clDb ->_close(); // Aquí le indicamos que nos queremos conectar a otra diferente $clDb = new Database('Nombre3'); $clDb ->_connect(); $clDb ->_close();