Funciones de acceso seguro a Base de Datos mySQL desde PHP

Edit: hay otro mensaje con una solución de acceso a base de datos integrada en una clase. Además, retorna los resultados en arrays.

Hace un tiempo decidí asegurar las consultas a la Base de datos, tanto de esta web como de Dynamic Web Resources, en aquella época, aún en construcción.

El caso es que ya tenía un archivo include que se encargaba de la conexión, asi que lo reformulé añadiéndole unas funciones que ahora permiten controlar mysql a través de ellas. Con esto consigo que, si por casualidad quisiese cambiar a Posgres toda la web, pudiese hacerlo cambiando tan solo este archivo.

Lo hice de una manera funcional, ya que para reutilizar todos los archivos de de esta web sin modificarlos no podía pasarlo a objetos.

Mas adelante, modifiqué el archivo para usar las funciones mysqli, que dan mas rendimiento.

Para finalizar, activé el soporte UTF8 por defecto en la conexión, para compatibilizar con cualquier idioma (característica de Dynamic Web Resources) e implementé una función paramétrica para hacer los queries que escapa los parámetros automáticamente teniendo en cuenta la configuración del servidor. Para mantener la compatibilidad, la misma función se puede usar con queries no paramétricos, pero no ofrece escapamiento de carácteres automático.

A final, dicho include quedó así:



<?php
if( !isset($conectado) ) {

/**
 * Config. de la BBDD, conexion a MySQL.
 * Rellenar estas variables con los datos del servidor:
 */
    $config["DB_HOST"] = "localhost";
    $config["DB_LOGIN"] = "user";
    $config["DB_PASSWORD"] = "pass";
    $config["DB_NAME"] = "db_name";

    // FIN CONFIGURACION


    $ddbb["db"] = false;

    function ddbb_query($q) {
        global $ddbb;
        $n func_num_args();
        if( $n ) {
            $a func_get_args();
            for( $i 1$i $n$i++ ) {
                if(get_magic_quotes_gpc()) $a[$i] = stripslashes($a[$i]);
                if(!is_numeric($a[$i])) $a[$i] = mysqli_real_escape_string$ddbb["db"], stripslashes($a[$i]));
                }
            $c call_user_func_array('sprintf'$a);
            if( isset($ddbb) && isset($ddbb["debug"]) && $ddbb["debug"] ) echo "\n<!-- [ ".$c." ] -->\n";
            return mysqli_query$ddbb["db"], $c);
            }
        if( isset($ddbb["debug"]) && $ddbb["debug"] ) echo "\n<!-- [ ".$q." ] -->\n";
        return mysqli_query$ddbb["db"], $q);
        }


    function ddbb_last_id() {
        global $ddbb;
        return mysqli_insert_id($ddbb["db"]);
        }


    function ddbb_num_rows(&$r) {
        return mysqli_num_rows($r);
        }

    function ddbb_fetch_array(&$r$i) {
        return mysqli_fetch_array($r);
        }

    function ddbb_fetch_row(&$r$i) {
        return mysqli_fetch_row($r);
        }

    function ddbb_bool($b) {
        return ( $b );
        }

    if( !( $ddbb["db"] = mysqli_connect($config["DB_HOST"], $config["DB_LOGIN"], $config["DB_PASSWORD"], $config["DB_NAME"] ) ) ) {
        echo "<p align=\"center\"><b>Error, no he podido conectar a la base de datos.</b></p>";
        }
     else {
        // nuevo metodo: mysqli_query( $ddbb["db"], "SET NAMES 'utf8'");
        mysqli_set_charset$ddbb["db"], 'utf8');
        $conectado true;
        }
    } // FIN


Un ejemplo de su uso puede ser:

$q = ddbb_query("SELECT COUNT( * ) AS n FROM `%s` WHERE UPPER( `Usuario` ) = '%s'", $tablaUsuarios, $_GET["usuario"]);
if( $f = ddbb_fetch_array( $q, 0 ) ) echo "<"."?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n\n".$f["n"]."\n";




    Editado por Daniel el 19/05/2010 a las 13:07:57h.