1.2. API nativa en MySQL

1.2. API nativa en MySQL Dataprix 29 Octubre, 2009 - 11:46

Para trabajar con la API nativa de MySQL en PHP, deberemos haber compilado el intérprete con soporte para este SGBD, o bien disponer ya del binario de PHP precompilado con el soporte incorporado.

En el caso de tenerlo que compilar, únicamente deberemos indicar como opción --with-mysql. Posteriormente, o en el caso de que ya dispongamos del binario, podemos validar que el soporte para MySQL está incluido correctamente en el intérprete con la ejecución del siguiente comando:

$ php -i | grep MySQL
supported databases => MySQL MySQL
Support => enabled
$

A partir de aquí, PHP proporciona unos parámetros de configuración que nos permitirán controlar algunos aspectos del funcionamiento de las conexiones con el SGBD, y las propias funciones de trabajo con la base de datos.

En cuanto a los parámetros, deberán situarse en el fichero php.ini, o bien configurarse para nuestra aplicación en concreto desde el servidor web. Destacan los siguientes:

mysql.allow_persistent: indica si vamos a permitir conexiones persistentes a MySQL. Los valores posibles son true o false.

mysql.max_persistent: número máximo de conexiones persistentes permitidas por proceso.

mysql.max_links: número máximo de conexiones permitidas por proceso, incluyendo las persistentes.

mysql.connect_timeout: tiempo que ha de transcurrir, en segundos, antes de que PHP abandone el intento de conexión al servidor.

Las conexiones persistentes son conexiones a la base de datos que se mantienen abiertas para evitar el tiempo de latencia que se pierde en conectar y desconectar. El intérprete,
al ejecutar la sentencia de conexión a la base de datos, examina si hay alguna otra conexión abierta sin usar, y devuelve ésta en lugar de abrir una nueva. Lo mismo sucede al desconectar, el intérprete puede realizar la desconexión si hay suficientes conexiones aún abiertas, o bien mantener la conexión abierta para futuras consultas.

Por lo que respecta a la utilización de la API para la conexión y consulta de bases de datos, empezaremos con un ejemplo:

1 <?php
2 // Conectando y eligiendo la base de datos con que vamos a trabajar
3 $link = mysql_connect(`host_mysql´, `usuario_mysql´, `password_mysql´) or die
(`No puedo conectarme: ´ . mysql_error());
4 echo `Conexión establecida´;
5 mysql_select_db(`mi_database´,$link) or die(`No he podido acceder a la base de datos´);
6
7 // Realizando una consulta SQL
8 $query = `SELECT * FROM mi_tabla´;
9 $result = mysql_query($query,$link) or die(`Consulta errónea: ´ . mysql_error());
10
11 // Mostramos los resultados en HTML
12 echo "<table>";
13 while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
14    echo "\t<tr>\n";
15    foreach ($line as $col_value) {
16    echo "\t\t<td>$col_value</td>\n";
17    }
18 echo "\t</tr>\n";
19 }
20 echo "</table>\n";
21
22 // Liberamos el resultset
23 mysql_free_result($result);
24
25 // Cerramos la conexión
26 mysql_close($link);
27 ?&gt;

En las cinco primeras líneas se establece la conexión y se selecciona la base de datos con que se va a trabajar. El código es bastante explícito y la mayoría de errores al respecto suelen deberse a una mala configuración de los permisos del usuario sobre la base de datos con la que debe trabajar.

Conviene estar muy atento, sobre todo a las direcciones de origen de la conexión, ya que, aunque podemos usar localhost como nombre de equipo, si el intérprete y el SGBD están en el mismo servidor, suele ocurrir que PHP resuelve localhost al nombre real del equipo e intenta conectarse con esta identificación. Así pues, debemos examinar cuidadosamente los archivos de registro de MySQL y los usuarios y privilegios del mismo si falla la conexión.

Para   establecer   una   conexión   persistente,   debemos   utilizar   la   función mysql_pconnect() con los mismos parámetros.
 

Utilidad de la sentencia de conexión
Hemos proporcionado la sentencia SQL a la función y el enlace nos ha devuelto la sentencia de conexión. Esta funcionalidad es absolutamen- te necesaria si se trabaja con varias conexiones simultáneamente, si únicamente hay una conexión establecida en el script, este parámetro es opcional.

A continuación, se utiliza la función mysql_query() para lanzar la consulta a la base de datos.

La función mysql_error() es universal, y devuelve el último error ocurrido en el SGBD con nuestra conexión, o con la conexión $link que le indique- mos como parámetro.

La función mysql_query() puede devolver los siguientes resultados:

•    FALSE si ha habido un error.

•    Una referencia a una estructura si la sentencia es de consulta y ha tenido éxito.

•    TRUE si la sentencia es de actualización, borrado o inserción y ha tenido éxito.

La función mysql_affected_rows() nos permite conocer el número de filas que se han visto afectadas por sentencias de actualización, borrado o inserción.

La función mysql_num_rows() nos permite conocer el número de filas devuelto por sentencias de consulta.

Una vez obtenido el recurso a partir de los resultados de la consulta, PHP proporciona multitud de formas de iterar sobre sus resultados o de acceder a uno de ellos directamente. Comentamos las más destacadas:

•    $fila = mysql_fetch_array($recurso, <tipo_de_array>)

Esta función va iterando sobre el recurso, devolviendo una fila cada vez, hasta que no quedan más filas, y devuelve FALSE. La forma del array devuelto dependerá del parámetro <tipo_de_array> que puede tomar estos valores:

–    MYSQL_NUM: devuelve un array con índices numéricos para los campos. Es decir, en $fila[0] tendremos el primer campo del SELECT, en $fila[1], el segundo, etc.

–    MYSQL_ASSOC: devuelve un array asociativo en el que los índices son los nombres de campo o alias que hayamos indicado en la sentencia SQL.

–    MYSQL_BOTH: devuelve un array con los dos métodos de acceso.

Recuperando el ejemplo inicial, entre las líneas 7 y 21:

7    // Realizando una consulta SQL
8    $query = `SELECT * FROM mi_tabla´;
9    $result = mysql_query($query,$link) or die(`Consulta errónea: ´. mysql_error());
10
11 // Mostramos los resultados en HTML
12 echo "<table>\n";
13 while ($line = mysql_fetch_array($result, MYSQL_BOTH)) {
14    echo "\t<tr>\n";
15    for($i=0;$i$line[$i]\n";
17    }
18    echo "<td>Nombre: $line[`nombre´]</td>&amp;";
19    echo "\t</tr>\n";
20 }
21 echo "</table>\n";

•    $objeto = mysql_fetch_object($recurso)

Esta función va iterando sobre los resultados, devolviendo un objeto cada vez, de manera que el acceso a los datos de cada campo se realiza a través de las propiedades del objeto. Al igual que en el array asociativo, hay que vigilar con los nombres de los campos en consulta, evitando que devuelva campos con el mismo nombre fruto de combinaciones de varias tablas, ya que sólo podremos acceder al último de ellos:

Volvemos sobre el ejemplo inicial

7   // Realizando una consulta SQL
8   $query = `SELECT nombre,apellidos FROM mi_tabla´;
9   $result = mysql_query($query,$link) or die(`Consulta errónea:´ . mysql_error());
10
11 // Mostramos los resultados en HTML
12 echo "<table>\n";
13 while ($object = mysql_fetch_array($result, MYSQL_BOTH)) {
14    echo "\t<tr>\n";
15    echo "<td>Nombre: " . $object-&gt;nombre . "</td>";
16    echo "<td>Apellidos: " . $object-&gt;apellidos . "</td>";
17    echo "\t</tr>\n";
18 }
19 echo "</table>\n";

•    $valor = mysql_result($recurso,$numero_de_fila,$numero_de_campo)

Esta función consulta directamente un valor de un campo de una fila especificada. Puede ser útil si queremos conocer un resultado sin necesidad de realizar bucles innecesarios. Evidentemente, hemos de saber exactamente dónde se encuentra.

•    $exito = mysql_data_seek($recurso,$fila)

Esta función permite mover el puntero dentro de la hoja de resultados representada por $recurso, hasta la fila que deseemos. Puede ser útil para avanzar o para retroceder y volver a recorrer la hoja de resultados sin tener que ejecutar la sentencia SQL de nuevo. Si la fila solicitada no existe en la hoja de resultados, el resultado será FALSE, al igual que si la hoja no contiene ningún resultado. Es decir, el valor de $fila debe estar entre 0 (la primera  fila)  y  mysql_num_rows()-1,  excepto  cuando  no  hay  ningún resultado, en cuyo caso devolverá FALSE.

Finalmente, comentaremos las funciones de liberación y desconexión. En el primer caso, PHP realiza un excelente trabajo liberando recursos de memoria cuando la ejecución en curso ya no los va a utilizar más. Aun así, si la consulta devuelve una hoja de datos muy grande, puede ser conveniente liberar el recurso cuando no lo necesitemos.

Por lo que respecta al cierre de la conexión, tampoco suele ser necesario, ya que PHP cierra todas las conexiones al finalizar la ejecución y, además, el cierre siempre está condicionado a la configuración de las conexiones persistentes. Tal como ya hemos comentado, si activamos las conexiones persistentes (o bien hemos conectado con mysql_pconnect), esta función no tiene nin gún efecto y, en todo caso, será PHP quien decida cuándo se va a cerrar cada conexión.

Bibliografía
Hay otras funciones más         específicas para obtener          información sobre el cliente    que origina la conexión, o        sobre el propio servidor           donde se está ejecutando.       Conviene consultar la               documentación para obtener   información sobre usos más    avanzados de esta API.           

Ya  hemos comentado  que las API específicas para cada  motor  incluyen  un conjunto de funciones que podía ayudar a trabajar con sus aspectos particulares, a continuación, enumeramos las más importantes:

•    mysql_field_flags, mysql_field_name, mysql_field_table, mysql_field_type:  estas  funciones  reciben  como  parámetro  un  $recurso y un índice de campo dentro de la consulta ejecutada y devuelven información sobre el campo; en concreto, sus restricciones, nombre, tabla a la que corresponden y tipo de campo. Pueden ser muy útiles para trabajar con consultas genéricas sobre bases de datos y/o campos que no conocemos al realizar el script.

•    mysql_insert_id: esta función devuelve el último identificador obtenido de una inserción en un campo autoincremental.

•    mysql_list_dbs, mysql_list_tables, mysql_list_fields: con distintos parámetros, estas funciones permiten consultar datos de administración del motor de la base de datos.