Clase PHP PDO para conectar con la base de datos

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();

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Captcha cargando...