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' => '',
'user' => '',
'pwd' => '',
'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();