Creando una capa de abstraccion con PHP y mysqli

Iniciado por Destructor.cs, Enero 29, 2013, 12:54:32 PM

Tema anterior - Siguiente tema

0 Miembros y 2 Visitantes están viendo este tema.

mysqli, es el conector para bases de datos MySQL recomendado por PHP, para interactuar desde tu aplicación con una base de datos MySQL. Pero crear una capa de abstracción genérica, reutilizable y orientada a objetos, suele ser un dolor de cabeza. En este artículo, veremos como lograr crear una capa de abstracción a bases de datos, simple y muy fácil de usar.

En otras palabras mysqli es una extencion mejorada del conector mysql, esta extencion hace que la coneccion con la base de datos sea mas segura y contiene mas seguridad contra inyecciones SQL y mas...

Por los que no saben que es una capa de abstraccion a base de datos fijense aqui: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Resumiendo todo en este tutorial les voy a mostrar un codigo para que se puedan conectar totalmente seguros a un base de datos gracias a mysqli!

Código: php
class DBConnector {
        protected static $conn;
        protected static $stmt;
        protected static $reflection;
        protected static $sql;
        protected static $data;
        public static $results;
        protected static function conectar() {
            self::$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
        }
       
        protected static function preparar() {
            self::$stmt = self::$conn->prepare(self::$sql);
            self::$reflection = new ReflectionClass('mysqli_stmt');
        }
       
        protected static function set_params() {
            $method = self::$reflection->getMethod('bind_param');
            $method->invokeArgs(self::$stmt, self::$data);
        }
       
        protected static function get_data($fields) {
            $method = self::$reflection->getMethod('bind_result');
            $method->invokeArgs(self::$stmt, $fields);
            while(self::$stmt->fetch()) {
                self::$results[] = unserialize(serialize($fields));
            }
        }
       
        protected static function finalizar() {
            self::$stmt->close();
            self::$conn->close();
        }
       
        public static function ejecutar($sql, $data, $fields=False) {
            self::$sql = $sql;
            self::$data = $data;
            self::conectar();
            self::preparar();
            self::set_params();
            self::$stmt->execute();
            if($fields) {
                self::get_data($fields);
            } else {
                if(strpos(self::$sql, strtoupper('INSERT')) === 0) {
                    return self::$stmt->insert_id;
                }
            }
            self::finalizar();
        }
    }


ese seria el codigo de la capa de abstraccion basicamente, ahora, para guardar datos en la base de datos se usa este codigo:
Código: php
        $sql = "INSERT INTO productos
            (categoria, nombre, descripcion, precio)
            VALUES (?, ?, ?, ?)";
        $data = array("isbd",
                    "{$categoria}", "{$nombre}", "{$descripcion}", "{$precio}");
        $insert_id = DBConnector::ejecutar($sql, $data);


y el codigo para generar una consulta seria el siguiente
Código: php
        $sql = "SELECT nombre, descripcion, precio
                FROM productos
                WHERE categoria = ?";
        $data = array("i", "{$categoria}");
        $fields = array("Producto" => "", "Descripción" => "", "Precio" => "");
        DBConnector::ejecutar($sql, $data, $fields);


Si quieren entender el siguiente codigo les recomiendo leer la primera edicion de los libros No tienes permitido ver los links. Registrarse o Entrar a mi cuenta yo no los puse ya que se me extenderia y la mayoria no entenderia casi nada, a mi se me complico bastante para entender, imaginense para alguien que no tiene conocimientos de mysqli!

Ya de paso agradesco a No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y recomiendo estas revistas de hackers and developers!

la verdad hacen falta aportes como este.

se agradece.

saludos!

Graciaas, soy mas de hacer aportes bastante completos, pero igual no los hago muy seguido xdd, en un ratito subo uno bastante bueno de cuando estaba en un viejo team!

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Graciaas, soy mas de hacer aportes bastante completos, pero igual no los hago muy seguido xdd, en un ratito subo uno bastante bueno de cuando estaba en un viejo team!

yo no tengo tiempo de hacer muchos aportes, asique normalmente traigo aportes de otras personas.

pero tengo serias ganas de hacer aportes como las Formas normales para normalizar una base de datos.

entre otras cosas, empezar a aportar cosas más avanzadas de las que están ahora, no la gran cosa pero si mejor que el tipo de aportes que hay hoy en día, como principios de encapsulamiento.

pero no eh tenido tiempo :/

saludos!

Buen aporte! en lo personal prefiero PDO, aunque MySQLi es una muy buena alternativa
Zalu2
Sólo el conocimiento te hace libre.

Gracias por tu ayuda, voy a intentar ponerme a ello =D!
Tengo algo muy gordo entre manos!