Funciones de acceso seguro a BBDD desde PHP - Clase

Hace tiempo escribí un post con unas funciones de acceso seguro a BBDD. Estos sistemas sirven para poder cambiar de servidor e incluso de base de datos cambiando muy pocas líneas en nuestro código.

Pues bien, ahora he creado el mismo sistema pero en un objeto y con resultados de tipo array. De esta manera podemos trabajar aún mas cómodamente con nuestra base de datos.

La clase para trabajar con bases de datos mysql, usando la extensión mysqli, es la siguiente:


class ddbb {
protected $db = false;
 
public function __construct( $host="localhost", $login="root", $pass="", $dbname="" ) {
if( !( $this->db = mysqli_connect($host, $login, $pass, $dbname ) ) ) {
echo "Error, no he podido conectar a la base de datos.";
return false;
}
// nuevo metodo: mysqli_query( $this->db, "SET NAMES 'utf8'");
mysqli_set_charset( $this->db, 'utf8');
return true;
}
 
public function query($q) {
$n = func_num_args();
if( $n > 1 ) {
$mq = get_magic_quotes_gpc();
$args = func_get_args();
$userfn = array();
$userfn[] = $q;
for( $i = 1; $i < $n; $i++ ) {
$act = $args[$i];
if( $mq ) $act = stripslashes($act);
if( !is_numeric($act) ) $act = mysqli_real_escape_string( $this->db, stripslashes($act) );
$userfn[] = $act;
}
$c = call_user_func_array('sprintf', $userfn);
$res = mysqli_query( $this->db, $c);
} else {
$res = mysqli_query( $this->db, $q);
}
if( $res === false || $res === true ) return $res;
$ret = array();
while( $act = mysqli_fetch_array($res) ) $ret[] = $act;
return $ret;
}
 
 
public function last_id() {
return mysqli_insert_id($this->db);
}
 
public function bool($b) {
return ( $b );
}
 
} // FIN
 
 
$ddbb = new ddbb("HOST", "USUARIO", "PASSWORD", "NOMBRE_BBDD");
?>
(cambiar la última línea de código con tus datos del servidor; se pueden usar varias conexiones a varios servidores, si se desea).

Para su uso, podemos usar el método parametrizado, que nos asegura que los parámetros están bien codificados y no hay nada raro, o el método directo, de toda la vida, en el que como siempre debemos revisar los parámetros antes de hacer el query, para que no haya problemas:


include "ddbb.php";

//Modo parametrizado

$qq = $ddbb->query("SELECT `taginterno` FROM `%s` WHERE `IDitem` = %d AND `lang` = '%s' ORDER BY `taginterno`", $tabla, $id, $lang);
if($qq && isset($qq[0]) ) foreach($qq as $ff) echo $ff['taginterno'];
 
//Modo sin seguridad en los parametros:
$qq = $ddbb->query("SELECT `taginterno` FROM `".$tabla."` WHERE `IDitem` = ".(int) $id." AND `lang` = '".$lang."' ORDER BY `taginterno`");
if($qq && isset($qq[0]) ) foreach($qq as $ff) echo $ff['taginterno'];
?>


Para el método paramétrico, los parámetros se especifican básicamente con un % seguido de una letra. El manual de PHP indica los posibles parámetros. Un resumen es:

%d => Entero (para IDs, números, edades...)
%s => Cadena de carácteres, string. La clase se encarga de codificarlos correctamente.
%F => Coma flotante y también números con decimales (números científicos, moneda...)




Con esto tenemos acceso centralizado y seguro a nuestra base de datos mysql. Si modificamos las funciones de la clase un poco podríamos cambiar la base de datos a, por ejemplo, Posgres, sin cambiar nada mas del código.


    Editado por Daniel el 20/05/2010 a las 05:36:09h.