Manual de PHP: MySQL

De Foros del Web

Contenido


Como mencionamos al hablar de bases de datos, MySQL es el gestor de bases de datos más difundido y quizás el más usado. PHP dispone de un amplio grupo de funciones para interactuar con este motor, haciendo que el manejo de la información almacenada en la base de datos desde un script PHP sea muy fácil.

Ya mencionamos que para poder enviarle instrucciones al servidor MySQL tenemos que hacerlo en su propio lenguaje, el lenguaje SQL. Conforme vayamos desarrollando cada sección iremos viendo la sintaxis básica de las sentencias SQL más usadas.


Videotutorial

A continuación puedes ver un video con un ejemplo de como conectarse a una base de datos de mySQL y extraer información, el video está basado en los ejemplos y la documentación que leerás en esta misma página.

Conectar y desconectar al servidor

Antes de ejecutar cualquier consulta SQL debemos primero abrir una conexión con el servidor MySQL. Para ello disponemos de la función mysql_connect(). Para abrir una conexión debemos contar con la dirección del servidor MySQL (proporcionada por el proveedor de hosting, o en su defecto localhost), un nombre de usuario y una contraseña, los cuáles pasaremos como parámetros a esta función.

$servidor = 'localhost';
$usuario = 'root';
$clave = 'abcdef';
 
mysql_connect($servidor, $usuario, $clave);

Luego de hacer esto tendremos una conexión abierta con nuestro servidor MySQL, y podemos ahora trabajar sobre ella.

Ocasionalmente necesitaremos conectarnos a dos o más servidores simultáneamente (de hecho son casos muy excepcionales). Para poder lograrlo debemos trabajar también con recursos de conexión. Un recurso es, en términos simples, una variable que lleva consigo la llave de determinado proceso. La función mysql_connect() genera un recurso de conexión, llamado identificador de enlace, que lleva consigo la conexión abierta con el servidor MySQL. Podemos usar ese recurso para hacer referencia a esa conexión de forma específica. Para obtenerlo basta con asignar la función vista a una variable que se convertirá en el recurso para esa conexión:

$conexion = mysql_connect($servidor, $usuario, $clave);

Como casi nunca tendremos que abrir varias conexiones simultáneas, no tocaremos más el tema de los identificadores de enlace. Sólo tienes que saber que están ahí.

También disponemos de mysql_close(), una función destinada a cortar la conexión abierta con el servidor MySQL. Antiguamente se sugería siempre cerrar la conexión con el servidor MySQL al terminar de ejecutar todas las consultas SQL, argumentando que se liberaba la memoria usada por ésta en el servidor; pero ahora se sugiere dejarla abierta, ya que al terminar la ejecución del script todas las conexiones abiertas son cerradas automáticamente; además, si por alguna razón se necesita volver a consultar a la base de datos tendremos que abrir nuevamente la conexión, y eso sí genera una carga totalmente innecesaria al servidor. Por lo tanto, el uso de mysql_close() debe quedar reservado exclusivamente para aquellos casos en los que se requiera procesar una gran cantidad de información tras ejecutar las consultas SQL.

En general, nunca cerraremos la conexión con el servidor MySQL; bastará con indicar entonces que para hacerlo basta con llamar a esa función:

mysql_close();

Seleccionar la base de datos

Una vez que tenems abierta la conexión con el servidor MySQL debemos seleccionar nuestra base de datos. Aclaremos que el servidor MySQL no es lo mismo que la base de datos. Un servidor contiene numerosas bases de datos, nosotros podemos crear nuevas bases de datos o borrar alguna del servidor. Por lo tanto, es imprescindible indicarle al script y al servidor sobre qué base de datos vamos a trabajar. Para realizarlo, usamos la función mysql_select_db(), a la cuál pasaremos como parámetro el nombre de nuestra base de datos.

mysql_select_db('base_de_datos');

Una vez seleccionada la base de datos, podemos empezar a ejecutar consultas SQL.

Realizar consultas

Como ya hemos venido diciendo, las consultas SQL, o también conocidas por su nombre en inglés como queries, son instrucciones que le enviamos al servidor MySQL para que ejecute determinada tarea. Una consulta, en términos prácticos, no es más que una cadena de texto. Para ejecutar la consulta debemos usar la función mysql_query() pasándole como parámetro la cadena de texto que contiene la consulta SQL. Al llamarla así, estaremos haciendo una consulta a la base de datos. Al igual que mysql_connect(), esta función también crea un recurso, el cuál no será útil después paratrabajar en base a la consulta que hemos realizado. Veamos un ejemplo de todo lo visto hasta ahora:

mysql_connect('localhost', 'admin', '');
mysql_select_db('mi_base_de_datos');
 
$query = mysql_query('SELECT * FROM tabla');

Al realizar la consulta, tenemos el recurso $query que podremos usar luego para leer los datos devueltos por la consulta o trabajar sobre ella.

NOTA: es muy frecuente ver que muchos intentan usar el recurso devuelto por mysql_query() como si fuese el resultado en sí de la consulta. Debemos aclarar que por sí sólo este recurso no representa nada, no se puede imprimir ni se puede emplear directamente, sino a través de otras funciones que veremos en las siguientes secciones.

Procedimientos más comunes

En esta sección vamos a revisar las tareas más frecuentemente usadas al trabajar con bases de datos. Para hacerlo, pensemos que tenemos una base de datos llamada "principal" y una tabla en ella llamada "comentarios" que tiene la siguiente estructura:

* id → almacena el identificador de cada registro, es un campo autoincrementable, esto quiere decir que para cada registro el valor de este campo se incrementa en 1.
* nombre → el nombre de la persona que envía el comentario
* email → la dirección de correo de la persona que envía el comentario
* comentario → el comentario del usuario
* estado → el estado actual del comentario (publicado, eliminado o spam)

Archivo:Bd-tabla.png

No profundizaremos en el código SQL usado para crear la bases de datos o esa tabla en ella, pues no es algo que vayamos a realizar rutinariamente en nuestros scripts. Además existen aplicaciones como PHPMyAdmin que van a facilitar estas tareas. Basta con indicar que las consultas SQL son estas:

Crear la base de datos

CREATE DATABASE 'principal';

Crear la tabla comentarios

CREATE TABLE `comentarios` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `nombre` CHAR( 75 ) NOT NULL ,
  `email` CHAR( 75 ) NOT NULL ,
  `comentario` LONGTEXT NOT NULL ,
  `estado` CHAR( 20 ) NOT NULL 
)

Si realmente deseas profundizar en el tema del lenguaje SQL puedes leer el manual de SQL en Maestros del Web.

Vamos a revisar los procedimientos más comunes al hablar de bases de datos, los cuáles son:

  • SELECT: Obtener los datos existentes
  • INSERT: Insertar nuevos datos
  • UPDATE: Actualizar los datos existentes
  • DELETE: Eliminar datos existentes

SELECT: Obtener los datos

La primera tarea que vamos a ver es la extracción de datos de una base de datos. La sentencia SQL que usaremos es SELECT. Nos permite seleccionar los datos de una tabla específica en nuestra base de datos. La sintaxis básica de una consulta tipo SELECT es:

SELECT campo1, campo2, ... FROM tabla

Veamos un ejemplo sencillo:

// La consulta SQL
$sql = "SELECT nombre, email FROM comentarios";
 
$query = mysql_query($sql);

Con esta consulta le estamos pidiendo al servidor MySQL que nos envíe el nombre y email de todos los registros en la tabla comentarios. Si quisiéramos todos los datos, en vez de colocar uno a uno los nombres de los campos podemos usar un asterisco (*) para hacer referencia a todas las columnas de la tabla.

Podemos hacer la consulta un poco más específica, para ello hacemos uso de las claúsulas disponibles para esta sentencia. Una claúsula actúa igual que un parámetro para los tags HTML. Veamos las más comunes:

  • WHERE: Actúa como un filtro en la consulta SQL, haciendo que ésta devuelva sólo los campos que cumplan con los criterios allí establecidos (WHERE campo1 = 'valor1' AND campo2 = 'valor2'). Lo más común es hacer comparaciones, donde comparamos el valor de un campo con un valor guía.
  • LIMIT: Define cuántos registros queremos que nos devuelva la consulta SQL y desde dónde debe empezar a extraer (LIMIT registro_inicial, número_de_registros). El primer registro en nuestro resultado va a ser el registro cero (0), por lo que si queremos extraer 3 registros a partir del segundo deberemos poner LIMIT 1, 3
  • ORDER BY: Ordena los resultados en base a una columna (ORDER BY campo ASC/DESC). Por ejemplo, si queremos ordenar en orden alfabético (ascendente) en base al campo nombre, pondremos ORDER BY nombre ASC

Veamos la nueva consulta, pero esta vez más específica:

// La consulta SQL
$sql = "SELECT * FROM comentarios WHERE estado = 'spam' ORDER BY id DESC LIMIT 0, 3";
 
$query = mysql_query($sql);

Si despedazamos la consulta, veremos que le estamos pidiendo al servidor MySQL que nos devuelva todos los campos (SELECT *) de los registros de la tabla 'comentarios' (FROM comentarios) cuyo estado es 'spam' (WHERE estado = 'spam'), pero ordenándolos en orden descendente en base al valor del campo 'id' (ORDER BY id DESC) y que sólo nos dé 3 registros empezando por el primero (LIMIT 0, 3).

Hecha la consulta hemos obtenido un recurso, y lo hemos guardado en la variable $query. Ahora podemos trabajar sobre esa consulta haciendo referencia a esa variable.

Leer los datos devueltos

Como dijimos anteriormente, un recurso no puede ser usado directamente para imprimir los resultados, sino que debe asociarse a una función según lo que queremos realizar. Empezaremos explicando cómo leer los registros que coincidieron con nuestra consulta. Para hacer ello, PHP tiene la función mysql_fetch_assoc(), la cuál genera un arreglo que contiene como índices los nombres de los campos (array asociativo), cada uno con su valor correspondiente, para cada registro que devolvió nuestra consulta.

En cada llamada a esta función se devuelve un fila o registro, por lo que, para leer todos los registros debemos llamar la función tantas veces como filas haya devuelto nuestra consulta. Es por ello que, para leer las filas de una consulta SQL, se usa generalmente un ciclo while, basándonos en el principio de que, al terminar de leer todas las filas y volver a llamar a la función mysql_fetch_assoc(), ésta devolverá false, lo cuál determiará el fin del ciclo.

Existen otras funciones similares, como mysql_fetch_row(), que devuelve los datos con índices numéricos (array numérico); mysql_fetch_array(), que devuelve un array que es a la vez asociativo y numérico (array mixto); y mysql_fetch_object(), que devuelve un objeto en vez de un array.

En el ejemplo anterior habíamos hecho la consulta SQL y ya teníamos el recurso $query para trabajar sobre esa consulta. Ahora veamos el código con el cuál recogemos las filas:

while($fila = mysql_fetch_assoc($query)) {
    echo 'El comentario #' . $fila['id'] . ' escrito por ' . $fila['nombre'] . ' ( ' . $fila['email'] . ') es spam<br>';
}

Si te fijas en el ejemplo, en cada ciclo creamos un array $fila que contiene los datos de la fila correspondiente a ese ciclo. Como estamos usando mysql_fetch_assoc(), obtenemos un array asociativo, esto quiere decir que los índices del array son los nombres de los campos de la tabla en la base de datos. Usando la tabla que especificamos al inicio, con esta consulta obtendremos lo siguiente:

El comentario #9 escrito por Brenda ([email protected]) es spam 
El comentario #6 escrito por María ([email protected]) es spam 
El comentario #5 escrito por Miguel ([email protected]) es spam 

Es importante que notes que, en la condición del while no hacemos una comparación (== ó ===), sino una asignación (=). En la práctica, la asignación $variable = false devuelve en su conjunto false, y como ya mencionamos, al llegar al final de los resultados la función mysql_fetch_assoc() devuelve false. Por eso es que el ciclo funciona.

Calcular el número de filas

Muchas veces queremos saber cuántas filas ha devuelto nuestra consulta. Para hacerlo tenemos a nuestra disposición la función mysql_num_rows(), que nos dirá este valor:

$total = mysql_num_rows($query);
 
if($total == 0) {
    echo 'La consulta no devolvió ningún resultado';
} else {
    echo 'La consulta devolvió ' . $total . '$filas';
    // Podemos mostrar aqui los resultados (while...)
}

Obtener un dato específico

Mencionemos también que podemos obtener el dato de un campo dentro de un registro o fila específico. Para eso usamos la función mysql_result(). La sintaxis básica es:

mysql_result(recurso, fila, campo);

El recurso es el resultado devuelto por la llamada a mysql_query(), la fila es el número de fila que queremos extraer (Recordemos que la primera fila es cero!), y como parámetro opcional campo debemos indicar el nombre o número del campo deseado si en nuestra consulta solicitamos más de una columna.

Veamos algunos ejemplos tomando como base el ejemplo anterior:

echo mysql_result($query, 0, 'nombre'); // Imprime: Brenda
echo mysql_result($query, 1, 'email'); // Imprime: [email protected]
echo mysql_result($query, 2); // Imprime: 5 (No escribir el campo hace que se tome el valor del primer campo, en este caso id)
echo mysql_result($query, 0, 2); // Imprime: [email protected] (El campo #2 es 'email' {tercer campo})

Liberando la memoria

Podemos usar mysql_free_result() para liberar la memoria usada por la consulta SELECT actual. Sin embargo, no es necesario hacerlo a menos que estemos trabajando con un montón muy grande (demasiado grande) de datos.

mysql_free_result($query)

INSERT: Insertar datos

Para insertar datos podemos usar la sentencia INSERT. Esta sentencia tiene dos sintaxis básicas, de las cuáles la primera es la más usada y conocida:

INSERT INTO tabla (campo1, campo2, ...) VALUES ('valor1', 'valor2', ...)
INSERT INTO tabla SET campo1 = 'valor1', campo2 = 'valor2', ...

El siguiente ejemplo muestra cómo podríamos insertar nuevos datos a nuestra tabla de ejemplo:

$sql = "INSERT INTO comentarios (nombre, email, comentario, estado) VALUES ('Álex', '[email protected]', 'Comentario de Álex', 'publicado')";
 
mysql_query($sql);

A diferencia de la sentencia SELECT, mysql_query() no retornará un recurso cuando se ejecuta una sentencia INSERT. En su lugar retornará el valor booleano true si la consulta se ejecutó con éxito, y false en el caso contrario.

Es posible agregar varias filas usando la misma consulta, sólo hay que separar los grupos VALUES con comas, de la siguiente forma:

$sql = "INSERT INTO comentarios (nombre, email, comentario, estado) VALUES 
    ('Johanny', '[email protected]', 'Comentario de Johanny', 'publicado'), 
    ('Mayra', '[email protected]', 'Comentario de Mayra', 'publicado'), 
    ('Xiomara', '[email protected]', 'Comentario de Xiomara', 'publicado')
";
 
mysql_query($sql);

Podemos usar, adicionalmente, la función mysql_affected_rows() para saber cuántas filas se insertaron tras la ejecución de la consulta:

echo 'Se insertó ' . mysql_affected_rows() . ' nuevos registros';

Por último, podemos omitir el especificar los nombres de los campos de la tabla a la cuál queremos insertar los datos, pero en los grupos VALUES tendremos que implícitamente hacer referencia a ellos. Vale decir, el primer valor irá al primer campo, el segundo irá al segundo campo, y así sucesivamente:

$sql = "INSERT INTO comentarios VALUES (NULL, 'Patty', '[email protected]', 'Comentario de Patty', 'publicado')";
mysql_query($sql);

Nota que el valor NULL corresponde al campo id, y le asignamos un valor nulo porque al ser un campo auto_increment su valor va aumentando automáticamente al crear nuevos registros.

UPDATE: Modificar registros

Para actualizar registros en la base de datos hacemos uso de la sentencia UPDATE. Su sintaxis básica es:

UPDATE tabla SET campo1 = 'valor1', campo2 = 'valor2', ... WHERE campoA = 'valorA' AND campoB = 'valorB' AND ...

En este caso definimos una claúsula WHERE para indicarle al servidor qué filas son las que deseamos modificar. Puede ser una única fila, o múltiples filas, siempre que cumplan con los criterios establecidos.

$sql = "UPDATE comentarios SET comentario = 'Este comentario ha sido marcado como spam' WHERE estado = 'spam'";
mysql_query($sql);

En este ejemplo vamos a modificar el valor del campo comentario de nuestra tabla para todos los registros cuyo campo estado tenga como valor spam, y les vamos a asignar el valor textual 'Este comentario ha sido marcado como spam'. Al iguul que en el caso de INSERT, la función mysql_query() no retorna un recurso, sino un valor booleano. Y también aquí podemos usar la función mysql_affected_rows() para obtener el número de filas modificadas por la consulta. En nuestro ejemplo:

echo 'Se han modificado ' . mysql_affected_rows() . ' filas';

Y en este caso nos diría que se han modificado 3 (las 3 que tienen como estado spam).

DELETE: Borrar registros

Finalmente, la última sentencia que vamos a ver es la sentencia DELETE. Su sintaxis es:

DELETE FROM tabla WHERE campo1 = 'valor1' AND campo2 = 'valor2' AND ...

Y también aquí podemos usar la función mysql_affected_rows() para determinar el número de filas eliminadas de la tabla con la ejecución de la consulta. Ejemplo:

$sql = "DELETE FROM comentarios WHERE estado = 'eliminado'";
mysql_query($sql);
 
echo 'Se han eliminado ' . mysql_affected_rows() . ' registros';

Con este ejemplo, estamos eliminando de la tabla comentarios todas las filas cuyo campo estado tenga el valor de eliminado, que en total son 3 filas.



Como has visto a lo largo de este manual, desde PHP podemos controlar todos los datos existentes en nuestra base de datos. Usando formularios y tomando los datos introducidos podemos crear muchas aplicaciones dinámicas, como blogs, sistemas de comentarios, o sistemas de noticias. Las 4 sentencias vistas son las sentencias básicas del lenguaje SQL, pero hay muchas más que hacen más sencillo todavía el trabajar con bases de datos. Te invito a que investigues y leas un poco sobre todas ellas.

Este artículo es parte del Manual de PHP.






-- Okram 08 Jul 2009

Herramientas personales