Interfaces de bases de datos
Como ya hemos comentado anteriormente, PHP admite bibliotecas para conectar con gran cantidad de bases de datos: Oracle, SQL Server, PostgreSQL, etcétera. Por regla general la conexión y consultas en todas las BBDD son similares a las utilizadas por MySQL. Pero, ¿qué pasaría si tenemos nuestro proyecto realizado usando la librería MySQLI y lo tuviéramos que migrar a Oracle? Nos tocaría ir fichero a fichero para cambiar las conexiones, las consultas, recorridos, etcétera.
Desde PHP 4 han ido apareciendo diferentes interfaces de acceso a bases de datos con el objetivo de independizar el código PHP que accede a la base de datos. Para ello se suele colocar una capa de abstracción de datos entre PHP y el servidor de base de datos, por ejemplo:
- PEAR::DB (http://pear.php.net/package/DB)
- PEAR::MDB2 (http://pear.php.net/package/MDB2)
- PHP Data Objects (PDO) (http://docs.php.net/manual/es/book.pdo.php)
- ADOdb (http://adodb.sourceforge.net/)
En la siguiente figura queda más claro donde se colocaría la capa de acceso de abstracción o capa de acceso a datos.
**Veamos un ejemplo de consulta con PEAR::DB**
<?php
//requerimos la clase DB.php de la libreria PEAR
require_once('DB.php');
$user = 'comprador';
$pass = 'proweb2013';
$host = 'localhost';
$db_name = 'uazon';
//dsn ! Data Source Name (nombre de la fuente de datos)
$dsn = "mysqli://$user:$pass@$host/$db_name";
$db = DB::connect($dsn);
if (DB::isError($db)) {
//mostrar error y salir
}
$query = "select * from libros";
$result = $db->query($query);
for ($i=0; $i < $num_results; $i++) {
$libro = $result->fetchRow(DB_FETCHMODE_ASSOC);
...
Como vemos en el ejemplo anterior, con la interfaz **PEAR::DB** disponemos de funciones parecidas a las vistas anteriormente. Configuramos el _data source_ (dsn, data source name) especificando el controlador (en nuestro caso mysqli) y a partir de ahí utilizaremos funciones propias de dicha interfaz. Lo interesante de usar este tipo de interfaces es la portabilidad, es decir, si migramos nuestra aplicación a un servidor de base de datos como ORACLE o PostgreSQL tan sólo tendremos que cambiar la cadena de conexión a la fuente de datos y toda la aplicación funcionará de la misma forma.
Desde la versión 5.1 podemos usar PDO, que es la interfaz de conexión que usan prácticamente todos los ORM's (Object-Relational Mapping - mapeo objeto relacional) actuales: Doctrine, Propel, etcétera.