Esta lección comenta el uso de bases de datos SQL en PHP.
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 (MySQL, PostgreSQL, MariaDB, Firebird, etc) o comerciales (Oracle, MS SQL Server, Actian X (antes llamada 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. 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.
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 (enero de 2024), PHP se sigue distribuyendo con muchas de estas extensiones, pero en su lugar se recomienda utilizar la biblioteca PDO que se comenta a continuación.
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 (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 (enero de 2024), la extensión PDO es la biblioteca recomendada para acceder a SGBD desde PHP.
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, RedBeanPHP, Eloquent o Propel 2. Actualmente (enero de 2024), otros proyectos similares como MDB2, Propel o Propel 3 parecen abandonados.
Actualmente (enero de 2024), ninguna de estas bibliotecas está incluida en PHP.
PHP ha tenido tres extensiones para acceder a la base de datos MySQL:
Aunque actualmente (enero de 2024) PHP incluye la extensión mysqli, en su lugar se recomienda utilizar acceder a MySQL mediante la extensión PDO.
Internamente, estas bibliotecas utilizan un controlador para acceder a MySQL. Antiguamente se utilizaba el controlador libmysql, desarrollado por la empresa MySQL AB, pero desde PHP 5.3 (publicado en junio de 2009) el controlador aconsejado ha sido mysqlnd (MySQL Native Driver), desarrollado por el equipo de PHP. El controlador utilizado se selecciona al compilar el ejecutable de PHP, por lo que nuestros programas no pueden elegir el controlador a utilizar. En PHP 8.2 (publicado en diciembre de 2022) se eliminó el controlador libmysql, por lo que desde entonces se utiliza siempre el controlador mysqlnd.
SQLite lleva desarrollándose desde el año 2000, con licencia de Dominio Público. Se publican nuevas versiones cada pocos meses.
SQLite está 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).
PHP ha tenido tres extensiones para acceder a la base de datos SQLITE:
Aunque actualmente (enero de 2024) PHP incluye la extensión sqlite3, se recomienda utilizar SQLite mediante la extensión PDO.