Bases de datos

PHP y bases de datos

Cuando una aplicación web necesita conservar información de forma permanente para recuperarla posteriormente, suele ser conveniente recurrir a un sistema gestor de bases de datos (SGBD).

Normalmente los SGBD son aplicaciones externas que se instalan y administran de forma separada. PHP permite utilizar la mayoría de los SGBD más conocidos, libres o comerciales (MySQL, Oracle, MS SQL Server, PostgreSQL, MariaDB, Firebird, Ingres, etc) como se puede consultar en el apartado sobre acceso a bases de datos del manual de PHP.

Un caso particular es SQLite, que no es una aplicación externa sino una biblioteca en C que implementa un motor de bases de datos SQL. SQLite estaba disponible en PHP desde junio de 2003 como extensión PECL (para PHP 4.3 y posteriores), y se incluye en el código fuente de PHP desde PHP 5.0 (publicado en agosto de 2004). Eso quiere decir que PHP puede gestionar bases de datos directamente, sin necesidad de recurrir a SGBD externos.

Aunque PHP siempre ha permitido utilizar numerosos SGBD, la forma de hacerlo ha ido variando con el tiempo.

Acceso mediante bibliotecas específicas

En las primeras versiones de PHP, la única manera de acceder a un SGBD era a través de una biblioteca específica, que contenía las funciones necesarias. A esas bibliotecas se les suelen llamar también extensiones. En algunos casos esas extensiones se incluían en las distribuciones oficiales de PHP y para poder utilizarlas era suficiente con incluir la directiva correspondiente en el archivo de configuración php.ini. En otros casos esas extensiones no estaban incluidas en las distribuciones oficiales de PHP, pero estaban incluidas en PEAR o PECL y para poder utilizarlas era necesario instalarlas por separado.

Con el paso del tiempo, este enfoque fue mostrando sus limitaciones. El principal inconveniente de este enfoque es que cada extensión está estrechamente vinculada a cada SGBD y si se quiere cambiar de SGBD es necesario reescribir completamente la aplicación (los nombres de cada función son diferentes, el orden de los argumentos distinto, las funcionalidades disponibles son diferentes, etc.). Además en algunos casos, las extensiones no están mantenidas adecuadamente (bugs de seguridad, etc.).

Actualmente (diciembre de 2016), PHP se sigue distribuyendo con muchas de estas extensiones y todavía se pueden utilizar, pero en su lugar se recomienda utilizar la biblioteca PDO que se comenta a continuación.

Acceso mediante PDO

Para poder escribir programas independientes del SGBD elegido, es necesario utilizar una capa de abstracción que permita acceder de una forma común a cualquier SGBD. Esta necesidad no es exclusiva de PHP, sino que afecta a cualquier aplicación que necesita trabajar con un SGBD y no tiene solución completa pues las diferencias entre los SGBD no permiten olvidarse de cuál estamos utilizando realmente.

Una de estas capas de abstracción es ODBC (Open DataBase Connectivity), una API independiente del sistema operativo, lenguaje de programación o SGBD utilizada que se empezó a desarrollar en 1992. En PHP existe una extensión llamada también ODBC que permite conexiones ODBC (creo que esta extensión se incorporó en PHP 3.0, publicado en junio de 1998, en cualquier caso estaba activada en PHP 4.0, publicado en mayo de 2000). El inconveniente de ODBC es que introduce un elemento más en la cadena, el controlador ODBC del sistema operativo, lo que puede ralentizar el rendimiento.

La capa de abstracción propia de PHP se llama PDO. PDO, biblioteca orientada a objetos, se podía utilizar como extensión PECL de PHP 5.0, publicado en agosto de 2004 y está incluida en PHP desde PHP 5.1, publicado en noviembre de 2005. PDO incluye controladores para acceder a las bases de datos más populares y la lista se va ampliando con el tiempo (aunque no incluye todos los SGBD que disponen de extensiones específicas). Utilizando PDO no podemos olvidarnos completamente del SGBD utilizado, pero la mayor parte del código es independiente del SGBD y sólo en algunas partes del programa (en la conexión con el SGBD o en la creación de tablas, por ejemplo) el código es específico del SGBD.

Actualmente (diciembre de 2016), la extensión PDO es la biblioteca recomendada para acceder a SGBD desde PHP.

En el futuro ...

Existen capas de abstracción de nivel superior a PDO y que se engloban bajo el acrónimo ORM (Object-relational mapping, mapeo objeto-relacional). Estas capas resuelven el problema de conversión de los objetos definidos en la aplicación en entidades que se puedan almacenar en una base de datos relacional. Además, permiten en teoría olvidarse completamente del SGBD ya que son capaces de reescribir las sentencias SQL o simular características no presentes en el SGBD. Algunas de estas capas son las bibliotecas Doctrine DBAL, Propel o RedBeanPHP (el paquete PEAR MDB2 parece actualmente -diciembre de 2016- abandonado).

Actualmente (diciembre de 2016) ninguna de estas bibliotecas está incluida en PHP.

PHP y MySQL

PHP ha tenido tres extensiones para acceder a la base de datos MySQL:

Aunque la extensión mysqli se si gue incluyendo actualmente (diciembre de 2016) en PHP, en su lugar se recomienda acceder a MySQL mediante la extensión PDO.

Internamente, estas bibliotecas utilizan un controlador para acceder a MySQL. Antiguamente el controlador se llamaba libmysqlclient y había sido desarrollado por la empresa MySQL AB, pero a partir de PHP 5.3 (publicado en junio de 2009), el controlador es mysqlnd (MySQL Native Driver), desarrollado por el equipo de PHP. Nuestros programas no pueden utilizar directamente estos controladores.

PHP y SQLite

PHP ha tenido tres extensiones para acceder a la base de datos SQLITE:

Aunque actualmente (diciembre de 2016) la extensión sqlite3 se incluye en PHP, en su lugar se recomienda utilizar SQLite mediante la extensión PDO.