Integración de los lenguajes de script de servidor con los SGBD

per Victor Carceler darrera modificació 2020-03-25T16:28:27+02:00

PHP soporta diferentes extensiones para el acceso a SGBD, las mas comunes son: MySQL, mysqli y PDO. La primera es la extensión más veterana para el acceso a MySQL, sigue estando disponible aunque no soporta las últimas características del servidor. La segunda, mysqli, es una 'versión mejorada' de la anterior. A la interfaz de funciones añade soporte POO y permite acceder a todas las características de las últimas versiones de MySQL. Y PDO es una capa de abstracción que permite acceder de manera homogénea a diferentes SGBD.

En general para nuevos proyectos que utilicen el servidor MySQL se recomienda la extensión mysqli.

La instalación de la extensión MySQL y mysqli se realiza a través del paquete php5-mysql. Una vez instalado será posible comprobar mediante la función phpinfo() la disponibilidad de dichas extensiones.

Conexión con MySQL

La conexión con un servidor MySQL típicamente se realiza mediante la siguiente secuencia:

  1. Inicializar la extensión y obtener un recurso mediante la función mysqli_init()
  2. Invocar a mysqli_options() las veces que sea necesario para fijar el valor de las opciones deseadas
  3. Obtener una conexión mediante la función mysqli_real_connect()
  4. Finalmente se utilizará mysqli_close() para cerrar la conexión y liberar recursos

Se deberá comprobar el resultado de cada una de las llamadas para detectar los posibles errores.

Para probar la extensión mysqli se hará uso de la BBDD de ejemplo World, que se puede descargar desde la propia web de MySQL. Una vez importada en el servidor MySQL podemos definir un usuario para utilizarla.

mysql> grant all privileges on world.* TO world_user IDENTIFIED BY 'world_password';

Un ejemplo de conexión sería mysqli-connection.php:

<?php
/*
** Ejemplo original: http://es2.php.net/manual/es/mysqli.real-connect.php
**
** Se han añadido comentarios
** BBDD de ejemplo: http://downloads.mysql.com/docs/world.sql.gz
** mysql> grant all privileges on world.* TO world_user IDENTIFIED BY 'world_password';
*/


// Se inicializa la extensión y se obtiene un recurso
$link = mysqli_init();
if (!$link) {
die('mysqli_init failed');
}

// Se fija una opción
// MYSQLI_INIT_COMMAND determina el comando a ejecutar en MySQL para cada nueva conexión
// SET AUTOCOMMIT = 0 Desactiva el commit automático para cada sentencia que actualice la tabla
// http://dev.mysql.com/doc/refman/5.0/es/commit.html
if (!mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Setting MYSQLI_INIT_COMMAND failed');
}

// Se fija una opción
// MSYQLI_OPT_CONNECT_TIMEOUT determina el número de segundos para el timeout al
// establecer una conexión.
if (!mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}

// Se establece la conexión
if (!mysqli_real_connect($link, 'localhost', 'world_user', 'world_password', 'world')) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}

echo 'Success... ' . mysqli_get_host_info($link) . "\n";

mysqli_close($link);
?>

Conexiones persistentes

En una aplicación real no resulta eficiente abrir/cerrar conexión con MySQL en cada lugar que se debe ejecutar un grupo de consultas. Establecer una conexión cuesta tiempo, así que es más eficaz reutilizarlas mediante conexiones persistentes.

Para abrir una conexión persistente se debe concatenar el prefijo 'p:' al nombre del host al establecer la conexión.

// Se establece una conexión persistente
if (!mysqli_real_connect($link, 'p:localhost', 'world_user', 'world_password', 'world')) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}

La extensión mysqli se ocupa de limpiar el estado previo de la conexión cuando se reutiliza.

Crear BBDDs en MySQL

La sentencia CREATE DATABASE <nombre> permite definir una nueva base de datos en MySQL. Si ya existe una base de datos con el nombre especificado se producirá un error a no ser que se añada IF NOT EXISTS. Para cada BBDD se creará un nuevo directorio que contendrá sus tablas (normalmente en /var/lib/mysql). En el interior de cada directorio el fichero db.opt contiene las opciones de la BBDD.

Puede eliminarse una BBDD existente con la orden DROP DATABASE <nombre>.

Crear tablas en MySQL

La sentencia CREATE TABLE <nombre> permite definir una nueva tabla en una base de datos de MySQL.

Además de los tipos de columna habituales y sus definiciones (PRIMARY KEY, UNIQUE, AUTO_INCREMENT...) es posible utilizar la palabra TEMPORARY para definir una tabla temporal. Son temporales aquellas tablas que solo están disponibles para la conexión desde las que se crean, dejando de existir al cerrar la conexión.

Para cada tabla se creará un fichero de definición nombre.frm en el directorio de datos, los ficheros de datos de la tabla dependerán del motor de almacenamiento utilizado. El motor de almacenamiento se podrá seleccionar al crear la tabla y su elección determinará las características de la misma.

Algunos de los más utilizados son:

InnoDB
Soporta transacciones, bloqueo de registro y claves foráneas.
MyISAM
Es el motor tradicional, no soporta transacciones ni bloqueo a nivel de registro pero es extremadamente rápido realizando consultas.
MEMORY
Guarda las tablas en memoria, si se reinicia el servidor se pierde el contenido de la tabla pero no su definición.