Underc0de

Programación Web => Base de Datos => Mensaje iniciado por: Destructor.cs en Enero 29, 2013, 12:54:32 PM

Título: Creando una capa de abstraccion con PHP y mysqli
Publicado por: Destructor.cs en Enero 29, 2013, 12:54:32 PM
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: http://www.symfony.es/noticias/2007/03/22/asi-funciona-una-capa-de-abstraccion-de-base-de-datos/

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!

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:
        $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
        $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 www.hdmagazine.org 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 www.hdmagazine.org y recomiendo estas revistas de hackers and developers!
Título: Re:Creando una capa de abstraccion con PHP y mysqli
Publicado por: Alex en Enero 29, 2013, 01:23:48 PM
la verdad hacen falta aportes como este.

se agradece.

saludos!
Título: Re:Creando una capa de abstraccion con PHP y mysqli
Publicado por: Destructor.cs en Enero 29, 2013, 01:26:19 PM
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!
Título: Re:Creando una capa de abstraccion con PHP y mysqli
Publicado por: Alex en Enero 29, 2013, 01:30:18 PM
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!
Título: Re:Creando una capa de abstraccion con PHP y mysqli
Publicado por: 2Fac3R en Enero 29, 2013, 03:43:03 PM
Buen aporte! en lo personal prefiero PDO, aunque MySQLi es una muy buena alternativa
Zalu2
Título: Re:Creando una capa de abstraccion con PHP y mysqli
Publicado por: sr.mcbecker en Enero 30, 2013, 09:11:01 PM
Gracias por tu ayuda, voy a intentar ponerme a ello =D!