> Manuales > Manual de PHP

Conexión con bases de datos en PHP. Presentación del lenguaje SQL y del sistema gestor de base de datos MySQL o MariaDB. Pasos previos para trabajar en PHP.

Trabajar con bases de datos en PHP

En este artículo del Manual de PHP comenzamos una etapa nueva que nos va a acercar a algo tan fundamental en la programación web como son las bases de datos. Es un tema tan importante como amplio, por lo que nos llevará varias entregas en las que iremos ampliando poco a poco nuestro conocimiento.

De momento vamos simplemente a establecer las bases sobre las bases de datos y su tratamiento en PHP y más adelante nos pondremos con operaciones más concretas sobre ellas.

Por qué son tan importantes las bases de datos

Una de las principales ventajas que presenta el trabajar con programación del lado del servidor es el poder trabajar con contenidos que están alojados en bases de datos. Gracias a las bases de datos ganamos muchas ventajas a la hora de desarrollar y mantener un sitio web.

Compatibilidad con la mayoría de motores de base de datos

El lenguaje PHP, ya hemos dicho, ofrece interfaces para el acceso a la mayoría de las bases de datos existentes. Podrás encontrar bases de datos de código abierto, como MySQL o MariaDB, comerciales porpietarias como Oracle y además tiene librerías para acceso a datos por ODBC, lo que nos permite comunicar con todas las bases de datos posibles en sistemas Microsoft Windows, como Access o SQL Server.

Gracias a las funciones existentes para cada sistema gestor de base de datos, podremos realizar cualquier acción con los datos que necesitemos para el desarrollo de la más variada gama de aplicación web.

Pero además, PHP también ofrece la posibilidad de trabajar con bases de datos de manera independiente al sistema gestor. Existen diversos grados de abstracción. Primero el que llamamos "abstracción del acceso a los datos", que permite las extensiones oficiales de PHP "PDO". Otro nivel sería la "abstracción de la base de datos", que nos permite incluso trabajar con datos sin tener que lidiar con SQL, que es el lenguaje con el que trabajamos con las bases de datos y del que vamos a hablar a continuación. En cualquier caso, estos concetos de "abstracción" son un tema un poco más avanzado en el que no entraremos todavía, pero que es muy habitual cuando trabajamos con aplicaciones complejas y sobre todo cuando entremos a los frameworks.

Lenguaje SQL

La interacción con la base de daots se realiza, por un lado, a partir de las funciones que PHP nos propone para cada tipo de base de datos y, por otro estableciendo un diálogo a partir de un idioma universal: SQL (Structured Query Language) el cual es común a todas las bases de datos.

Este lenguaje resulta, como veremos en el tutorial de SQL, muy potente y fácil de aprender. A lo largo del manual de PHP nos limitaremos a la utilización las instrucciones SQL básicas, que serán aprendidas a medida que explicamos las diferentes formas de actuar sobre una base de datos, dejando para el tutorial de SQL los aspectos más avanzados de ese lenguaje de acceso a datos.

Hemos dicho que el lenguaje SQL se encuentra estandarizado y es así. Sin embargo, a la hora de implementarlo en los distintos sistemas gestores de base de datos pueden haber diferencias, que generalmente son menores y relacionadas con aspectos más avanzados del acceso o manipulación de los datos. Por eso, no todo SQL que funciona por ejemplo en MySQL funcionará igual en otras bases de datos como PostgreSQL o SQL Server. Ese es el punto por el que es tan importante la abstracción de la que hablábamos antes.

Trabajaremos con MySQL

Como base ejemplo de estos capítulos hemos elegido MySQL, sin duda el sistema gestor de base de datos más extendido en combinación con PHP. Su eficiencia y simplicidad la han hecho una buena candidata, además de su amplia disponibilidad en todo tipo de alojamientos web. No obstante, en caso de utilizar cualquier otra base compatible con PHP, las correcciones a llevar a cabo con respecto a nuestros ejemplos no son excesivamente grandes y la lectura de esos capítulos seguirá siendo de gran utilidad.

Combiene aclarar aquí que existe una base de datos hermana de MySQL que se denomina MariaDb. Este sistema gestor tiene la característica de ser totalmente compatible con MySQL. De hecho, muchas veces podremos creer que trabajamos con MySQL cuando en un servidor lo que realmente hay instalado es MariaDB. Por tanto, todos los ejemplos que veremos aquí aplican a ambos sistemas gestores. Puedes intercambiar uno u otro con total transparencia.

Tampoco es nuestro objetivo actualmente explicar cómo se trabaja con MySQL, pero lo irás viendo progresivamente a lo largo del manual. No obstante, para quienes quieran profundizar en este sistema gestor de bases de datos recomendamos la lectura del Manual de MySQL, donde hemos presentado los comandos básicos que nos pueden permitir abordarla con una relativa facilidad.

Lo importante es que en este punto hayas podido instalar el motor de base de datos MySQL (o MariaDB, es indiferente) en tu ordenador de desarrollo. Este paso probablemente ya lo hayas realizado, dado que hemos explicado en capítulos anteriores cómo conseguirlo. Si no es así, te recomendamos la lectura del artículo con la Guía definitiva para crear tu entorno de desarrollo para PHP, donde encontrarás un resumen de las distintas opciones que puedes tomar, dependiendo de tu sistema operativo, para conseguir PHP y MySQL.

Configurar la tabla que vamos a utilizar para los ejemplos de este manual

Una vez instalado MySQL y antes de poder comenzar con nuestros ejemplos, será necesario llevar a cabo las siguientes operaciones:

Nuevamente, señalamos que no es el momento para ver cómo poder administrar las bases de datos, porque esto es algo que depende mucho del sistema operativo, de cómo hayas instalado tu entorno de desarrollo, de los programas que prefieras para administrar, etc. Muchas instalaciones de PHP y MySQL proporcionan una aplicación web llamada PhpMyAdmin que te servirá perfectamente para la operación de crear las tablas y ver los datos en crudo. Otras personas prefieren trabajar con programas más avanzados como DBeaver, HeidiSQL, MySQL Workbench o similares. En último caso, puedes también acceder a MySQL mediante terminal y lanzar las sentencias SQL en crudo.

Sentencia create database

Introducidos dentro de MySQL, crearemos la base de datos dentro de nuestro sistema gestor de base de datos, para ello usamos una sentencia "create database", que tendrá el siguiente código SQL:

create database ejemplo;

Aquí nuestra base de datos se llamará "ejemplo", pero tú podrías cambiarle el nombre por el que te parezca más oportuno. También podrías, a la hora de crear la base de datos, especificar que deseas trabajar con el juego de caracteres UTF-8, que es una recomendación para evitar que te den problemas caracteres especiales como acentos, "ñ", etc.

Sentencia use

Si estamos accediendo a MySQL mediante comandos SQL, como por ejemplo mediante línea de comandos y queremos trabajar con alguna de las bases de datos creadas en el servidor, tenemos que definir cuál de ellas mediante el comando "use".

Esta sería la sentencia que nos permite seleccionar la base de datos "ejemplo", que acabamos de crear, como la base de datos a utilizar:

use ejemplo;

Sentencia create table

Una vez estamos ya dentro de la base de datos "ejemplo" (o el nombre que le hayas dado a tu base de datos), crearemos a continuación la tabla "clientes".

Las tablas nos permiten guardar la información de una entidad. En este caso "clientes" nos permitirá guardar la información de todos los clientes que tengamos en nuestra aplicación. Podemos tener tantas entidades como sean necesarias para una aplicación y generalmente cada una de ellas se almacenará en una tabla independiente.

Al crear la tabla nuestro objetivo es darle un nombre y definir qué columnas o campos van a tener los registros de esa tabla. Por ejemplo, si tendremos un identificador para cada cliente, si tendremos un nombre para cada cliente, su teléfono, etc. Cada campo se tiene que especificar indicando el nombre y además el tipo de datos de esa columna.

Esta será la sentencia SQL que nos permitirá crear la tabla "clientes", tal como la queremos para los siguientes ejemplos:

create table clientes (
  nombre varchar(100),
  telefono varchar(100)
);

Ahora ya disponemos de nuestra tabla vacía. Si queremos comprobar cómo ha quedado, podemos usar la sentencia SQL "describe" seguida del nombre de la tabla que queramos visualizar.

> describe clientes;

este comando nos ofrecerá la siguiente salida, en la que vemos los nombres de campos de la tabla y sus tipos de datos configurados.

+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| nombre   | varchar(100) | YES  |     | NULL    |       |
| telefono | varchar(100) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
2 rows in set (0,00 sec)

Lógicamente, si estás usando un programa de interfaz gráfica para administrar tu base de datos no necesitas hacer este describe, porque el mismo programa te presentará de manera visual las propiedades de las tablas, pero es una buena herramienta si estás accediendo a MySQL a través de la consola de comandos.

Ahora sólo queda comenzar a llenar la tabla con los registros que iremos insertando. Sin embargo, estas tareas las veremos un poco más adelante, en capítulos sucesivos.

API de funciones para trabajar con MySQL: mysqli

Existen diversos juegos de funciones para trabajar con bases de datos MySQL en PHP (o MariaDB, ya que son compatibles). Antiguamente se usaban las funciones "mysql" pero de un tiempo para aquí se usa la nueva interfaz de acceso a MySQL denominada "mysqli". Es importante usar "mysqli" porque está mejorada, pero sobre todo porque en las versiones modernas de PHP solamente funciona "mysqli", siendo el API de funciones "mysql" declarado obsoleto.

Como API de funciones nos referimos a todo el conjunto de funciones existentes en el lenguaje que nos permiten conectarnos con un servidor MySQL, acceder a los datos almacenados en las tablas, realizar actualizaciones, inserciones, etc. Para cada tipo de operación usaremos una función de PHP o, mejor dicho, una combinación de llamadas a funciones que se realizarán en secuencia.

Además, cabe decir que estas interfaces de acceso a las bases de datos y a sus datos se encuentran publicadas en formato "funciones clásicas" o por medio de "objetos". Nosotros vamos a preferir el acceso usando la interfaz de "objetos", dado que las funciones clásicas se planea marcar como obosoletas, por lo que es posible que dentro de poco se eliminen del lenguaje.

Es verdad que no hemos hablado de objetos todavía en el manual. No te preocupes porque la sintaxis la podrás aprender sobre la marcha y tenemos más adelante capítulos específicos para hablar de ellos. No obstante, te recomendamos consultar el Manual de orientación a objetos en PHP para más información detallada.

Conexión con una base de datos desde PHP

Para acabar este artículo vamos a ver un ejemplo de conexión con una base de datos MySQL, usando la interfaz de conexión mysqli basada en objetos, que es la recomendada en estos momentos.

Vamos a ver un pedazo de código para conectarnos con un servidor MySQL y luego lo explicamos con detalle.

<?php
    $mysqli_conexion = new mysqli("localhost", "usuario", "clave", "ejemplo");
    if($mysqli_conexion->connect_errno) {
        echo "Error de conexión con la base de datos: " . $mysqli_conexion->connect_errno;	
    } else {
        echo "Hemos podido conectarnos con MySQL";
    }
?>

Comenzamos por la línea donde se crea la conexión con la base de datos:

$mysqli_conexion = new mysqli("localhost", "usuario", "clave", "ejemplo");

Esta línea está creando un nuevo objeto para la conexión con el servidor MySQL. Una vez creado ese objeto lo estamos almacenando en la variable $mysqli_conexion. Para crear el objeto de conexión usamos el operador "new", indicando a continuación el nombre del tipo de objeto que estamos creando y los parámetros que se requiere para su creación, que son los siguientes:

A hora veamos el condicional siguiente:

if($mysqli_conexion->connect_errno) {

En esta línea estamos consultando el objeto que tenemos en la variable $mysqli_conexion para ver si tiene algún error asociado. Para ello consultamos la propiedad connect_errno de ese objeto. Si no hubo un error esa propiedad estará a un valor que se interpretará como falso, por lo que no entrará en el lado positivo del if.

Si hubo un error entonces entrará en la parte positiva, por lo que usaremos la misma propiedad connect_errno para describir el error para el posible usuario.

echo "Error de conexión con la base de datos: " . $mysqli_conexion->connect_errno;	

Si no hubo error, entonces podemos acceder con confianza a los datos de la base de datos, con funciones del API de msqli que veremos en artículos siguientes. De momento queríamos que quedase claro únicamente cuál es el mecanismo de conexión, ya que lo utilizaremos sin más explicaciones en todos los ejemplos siguientes.

Solo un detalle más. Habitualmente, cuando se produce un error en la base de datos no tiene sentido seguir ejecutando código de la página, dado que si la base de datos no responde no habrá datos que mostrar al usuario, por lo que el código podría cambiar un poco a algo como esto:

<?php
    $mysqli_conexion = new mysqli("localhost", "usuario", "clave", "ejemplo");
    if($mysqli_conexion->connect_errno) {
        echo "Error de conexión con la base de datos: " . $mysqli_conexion->connect_errno;	
        exit;
    }
    // Si estoy aquí es que la base de datos ha podido conectarse, por lo que seguiré con el código de la página...
?>

Si te fijas, en este caso hemos añadido la sentencia exit; en el caso positivo del if. Es para mostrar el error de conexión con la base de datos y luego salir inmediatamente del script, parando toda la ejecución de la página. Aquí se podría también redirigir a una página de error, o mostrar un include o cualquier otra cosa, pero siempre acabando en exit esa rama del if, para asegurarnos que no se realiza nada a continuación.

Esto nos permite no poner una rama de else en este if, ya que no sería necesaria, evitando el uso de llaves del caso negativo, que ensucien un poco el código del bloque siguiente donde ya realizaremos el acceso a los datos. Esto también nos permitirá que este código de conexión se encuentre en un "include" separado, de modo que se escriba una única vez y no tengamos disperso en decenas de lugares de la página este mismo código de conexión.

Cerrar las conexiones con las bases de datos MySQL

Es importante que se cierren las conexiones con el sistema gestor de bases de datos, para liberarlas y que la ejecución de otras páginas las puedan utilizar. Para ello, sobre el objeto de conexión realizaremos la invocación del método close().

Usaremos un código como el que sigue.

$conexion->close();

En el anterior código $conexion es el objeto que hemos creado al conectarnos con la base de datos. Simplemente invocamos el método close() con lo que PHP cerrará la conexión con MySQL. Si tenemos que volver a conectarnos se debería realizar de nuevo otra conexión.

El método close() devuelve un valor boleano como resultado, para indicar si pudo cerrar correctamente la conexión o no. Generalmente ese valor no lo procesamos, ya que damos por hecho que las conexiones se podrán cerrar y, en caso contrario poco podremos hacer, simplemente se cerrará cuando se pueda ella sola.

Todas las conexiones con la base de datos acabarán cerrándose tarde o temprano, aunque no las cerremos explícitamente con el método close() desde PHP. Sin embargo, es mucho mejor cerrarlas nosotros mismos una vez ya no se vayan a usar, dado que así nos aseguramos que así se liberan cuanto antes. Ten en cuenta que MySQL o MariaDB tienen un número de conexiones limitado, que suelen ser unas 100 (Esto es configurable en el sistema gestor de la base de datos). Habitualmente esas 100 conexiones son más que suficientes, porque el tiempo de ejecución de una página PHP generalmente es cuestión de milisegundos, o pocos segundos como máximo, y por tanto la conexión bien cerrada ocupará una de esas conexiones solamente por unos instantes. Sin embargo, si tenemos mucho tráfico y no cerramos las conexiones normalmente, es posible que se queden abiertas por más tiempo y llegue un momento en el que MySQL nos devuelva errores porque no tenga cuota de apertura de nuevas conexiones.

Guión de artículos relativos a las bases de datos en PHP

De momento, dejamos por aquí toda esta información inicial sobre el acceso a las bases de datos PHP. A lo largo del manual ofreceremos varios artículos, en los que trataremos cada una de las operaciones com la base de datos más típicas, como selecciones, actualizaciones o inserciones, siguiendo el siguiente guión:

Para completar todo aquello que debes saber sobre el acceso a bases de datos en PHP encontrarás multitud de artículos prácticos en el Taller de PHP, como son la Recepción el último ID de una inserción con PHP y MySQL, la Paginación de resultados con PHP y MySQL, Programar un buscador con PHP y MySQL, etc.

Además, para los que prefieran verlo todo paso a paso en vivo, contamos con un videotutorial sobre las bases de datos en PHP que te ayudará a entender mejor cómo trabajar con las bases de datos en PHP.

Rubén Alvarez

Rubén es doctor en química y programador principalmente en sus ratos libres con...

Manual