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
          // ....

     }

}

Sobre Reacción Estudio

Somos un estudio informático formado por jóvenes centrados en el desarrollo web, el diseño gráfico y la fotografía. Puedes solicitar presupuesto para tu proyecto a través de nuestra página web o por teléfono, pero en este blog hablaremos de todo lo que engloba el desarrollo web a día de hoy.


  • aloncito3x

    puedes publicar un ejemplo de conexión. lo intente y me arroja error.

    • Alberto

      ¿Qué error te devuelve?

      • aloncito3x

        Strict standards: Non-static method Database::getConnection() should not be called statically.

        db = Database::getConnection();
        }
        function listarNombres() {

        $sql = “SELECT * FROM nombres”;
        $result = $this->db->query($sql);
        while ($row = $result->fetch_array()) {
        echo ” . $row['nombre'] . ”;
        }
        }
        }

        $test = new lotes();
        $test->listarNombres();

        • cero

          $db = Database::getInstance();
          $db =$db->getConnection();

          $rs= $db->query(“SELECT * FROM `table`”);

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies.     ACEPTAR