Clase para conectar a una base de datos MySQL con PHP usando Singleton
Singleton es un patrón de diseño utilizado para que una clase tenga una única instancia en toda la aplicación y se pueda acceder a ella de forma global.
No siempre es necesario usar el patrón Singleton en nuestras clases, pero es realmente útil a la hora de hacer consultas a la base de datos.
Si nos conectamos a nuestra base de datos de la forma tradicional con PHP, es decir, usando la función «mysqli_connect«, estaremos creando una nueva conexión a la base de datos cada vez que ejecutemos esta función.
Sin embargo, si utilizamos Singleton para conectarnos a nuestra base de datos, nos conectaremos una única vez, por lo que cuando queramos ejecutar una consulta recuperaremos la instancia de nuestra clase que contiene la primera y única conexión hacia nuestra base de datos, obteniendo un menor consumo de recursos por parte de nuestro servidor web.
Una vez explicado que es el Singleton, vamos a ver cómo sería una clase utilizando este patrón para conectarnos a nuestra base de datos MySQL utilizando PHP 5.
class Database { private $_connection; private static $_instance; //The single instance private $_host = "localhost"; private $_username = "db_user"; private $_password = "db_password"; private $_database = "db_name"; /* Get an instance of the Database @return Instance */ public static function getInstance() { if(!self::$_instance) // If no instance then make one { self::$_instance = new self(); } return self::$_instance; } // Constructor private function __construct() { $this->_connection = new mysqli($this->_host, $this->_username,$this->_password, $this->_database); // Error handling if(mysqli_connect_error()) { trigger_error("Failed to conencto to MySQL: " . mysql_connect_error(),E_USER_ERROR); } } // Magic method clone is empty to prevent duplication of connection private function __clone() { } // Get mysqli connection public function getConnection() { return $this->_connection; } public function get_data($sql) { $ret = array('STATUS'=>'ERROR','ERROR'=>'','DATA'=>array()); $mysqli = $this->getConnection(); $res = $mysqli->query($sql); if($res) $ret['STATUS'] = "OK"; else $ret['ERROR'] = mysqli_error(); while($row = $res->fetch_array(MYSQLI_ASSOC)) { $ret['DATA'][] = $row; } return $ret; } public function exec($sql) { $ret = array('STATUS'=>'ERROR','ERROR'=>''); $mysqli = $this->getConnection(); $res = $mysqli->query($sql); if($res) $ret['STATUS'] = "OK"; else $ret['ERROR'] = mysqli_error(); return $ret; } }
Esta clase contiene 2 métodos llamados «get_data» y «exec«, el primero devuelve los datos de un «SELECT» en un array asociativo y el segundo ejecuta una consulta tipo «INSERT, UPDATE, etc … «.
Para por ejemplo hacer una consulta distinta en otra clase podríamos hacer algo así:
include_once "database.php"; class Prueba { private $db; public function __construct() { //Obtenemos la instancia de la BD $this->db = Database::getConnection(); } public function prueba_consulta() { //ejecutamos una query cualquiera ... $sql = "SELECT * FROM usuarios LIMIT 10"; $result = $this->db->query($sql); //obtenemos los resultados // .... } }