Documente Academic
Documente Profesional
Documente Cultură
1. Instalando MySQL
Instalar MySQL en su versin para Windows, e ir haciendo pruebas antes de subir nuestras pginas, es bastante sencillo. En la seccin Programas podeis encontrarlo para bajarlo. Simplemente haced doble click en el programa de instalacin, responded a las tpicas preguntas de dnde lo quieres instalar, etc., y ya est. Ahora hay que ponerlo en marcha. Para ello, siempre debe estar ejecutndose (estar en segundo plano) el programa mysqld.exe, situado en el subdirectorio bin del directorio en el que se haya instalado el programa. Con este programa en marcha, ejecutaremos mysql.exe para ver cmo entrar sentencias SQL, o directamente podremos probar scripts PHP que conecten con el servidor MySQL. Como PHP lleva soporte interno para MySQL, nicamente hemos de acordarnos de tener en memoria el programa mysqld.exe, el resto lo hace l solo, como iremos viendo en los siguientes captulos.
Y ahora que hemos creado la tabla, vamos a borrarla (ms que nada porque estamos practicando y hay que ver de todo, no porque sea la costumbre usual ;-) ). Para ello, haremos: mysql> DROP TABLE USUARIOS; Query OK, 0 rows affected (0.11 sec) mysql> _ Llevad cuidado cuando borreis una tabla, pues no quedar ni rastro de ella, as que luego no podreis recuperar los datos que hubiera. Hay que estar muy seguro de que se quiere borrar una tabla para hacerlo. Y, puestos a borrar, vamos a borrar la base de datos (repito, esto no es lo usual cuando uno trabaja con ellas ;-) ), para lo que haremos: mysql> DROP DATABASE Prueba; Query OK, 0 rows affected (0.11 sec) mysql> _ Hemos borrado la base de datos entre otras cosas porque era un ejemplo y tampoco era demasiado til O;-) Vamos a salir del programa, ejecutando exit. Ya sabemos crear la base de datos, elegirla de entre unas cuantas, crear tablas... insertar registros tampoco ser nada complicado, sin embargo, estara bien poder pensar cmo ser la base de datos, escribir en algn fichero los comandos a ejecutar, y pasar ese script a MySQL, incluso, con algunas inserciones de registros, si es necesario. Bien, pues de eso es de lo que vamos a ver ahora un ejemplo. Con cualquier editor de texto, nos creamos un fichero como este (yo lo he llamado ScriptEjemplo.sql): CREATE DATABASE REGISTRO; USE REGISTRO; CREATE TABLE USUARIOS( USUARIO VARCHAR(30) NOT NULL, EMAIL VARCHAR(50) NOT NULL, NOMBRE VARCHAR(20) NOT NULL, APELLIDOS VARCHAR(40) NOT NULL, ICONO INTEGER, PRIMARY KEY(USUARIO) ); La extensin no es importante, simplemente ser para recordarnos que ese archivo contiene comandos SQL, pero a MySQL le dar igual que pongas esa, otra o ninguna extensin. Lo que le importar es que el fichero exista, y que contenga comandos escritos correctamente y en el orden correcto (por ejemplo, no se puede crear una tabla antes de elegir la base de datos). Lo grabamos donde queramos, y luego ejecutamos: mysql < UNIDAD:\RUTA\ScriptEjemplo.sql Si todo ha ido bien, MySQL habr hecho todo lo que estuviera escrito en el fichero. Si algo ha fallado, dir qu error ha sucedido. Con la base de datos del ejemplo del script, volvemos a entrar en MySQL. Escribimos USE Registro; para seleccionar esa base de datos, y vamos a insertar un registro, tal que este (por ejemplo): mysql> INSERT INTO USUARIOS(USUARIO,EMAIL,NOMBRE,APELLIDOS,ICONO) -> VALUES( -> 'MADDY', -> 'MADDY@MADDY.COM', -> 'MADDY', -> 'MADDY', -> 1); Query OK, 1 row affected (0.33 sec) mysql> _ Si queremos realizar ahora una consulta, ser tan sencillo como escribir lo siguiente: mysql> SELECT USUARIO FROM USUARIOS; +---------+ | USUARIO | +---------+ | MADDY | +---------+ 1 row in set (0.55 sec) mysql> _ Por ltimo, vamos a ver una accin que nos resultar til cuando no nos acordemos de cmo estaba definida una tabla, qu campos tena, de qu tipo, etc., se trata de SHOW COLUMNS FROM tabla. Lgicamente, para ello debemos tener seleccionada una base de datos ;-) mysql> SHOW COLUMNS FROM USUARIOS; +-----------+-------------+------+-----+---------+-------+---------------------------------+ | Field | Type | Null | Key | Default | Extra | Privileges | +-----------+-------------+------+-----+---------+-------+---------------------------------+ | USUARIO | varchar(30) | | PRI | | | select,insert,update,references | | EMAIL | varchar(50) | | | | | select,insert,update,references |
| NOMBRE | varchar(20) | | | | | select,insert,update,references | | APELLIDOS | varchar(40) | | | | | select,insert,update,references | | ICONO | int(11) | YES | | NULL | | select,insert,update,references | +-----------+-------------+------+-----+---------+-------+---------------------------------+ 5 rows in set (0.60 sec) Y aqu tenemos la informacin que queramos :-)
donde $NombreBD e $IdConexion son las variables que tenamos definidas antes, una con el nombre de la base de datos y otra con el identificador de la conexin.
Dejamos el captulo en este punto, y en el siguiente ya comenzamos a ver funciones para acceder a los datos de la base de datos. Entre otras cosas, se explicar la funcin mysql_query();, que ha aparecido por aqu "por arte de magia" ;-)
4. Consultas
Comenzaremos este captulo con un script de ejemplo, llamado PruebaBD.phtml: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE> Prueba PHP y MySQL </TITLE> </HEAD> <BODY BGCOLOR=white> <?php $NombreBD = "Registro"; $Servidor = "localhost"; $Usuario = "root"; $IdConexion = mysql_connect($Servidor, $Usuario); print("Se acaba de establecer la conexin.<BR>"); print("Servidor: ".$Servidor."<P>"); mysql_select_db($NombreBD, $IdConexion); $Query = 'SELECT USUARIO,EMAIL FROM USUARIOS'; $IdConsulta = mysql_query($Query, $IdConexion); $ResultQuery = mysql_fetch_array($IdConsulta); print("Usuario: ".$ResultQuery["USUARIO"]."<B>"); print("E-mail: ".$ResultQuery[1]."<P>"); ?> Fin de la conexin a BD. </BODY> </HTML> En este ejemplo, cuya ejecucin podemos observar en la siguiente imagen, se ven varios elementos ya estudiados en el captulo anterior, y uno nuevo, que es el que trataremos extensamente en este captulo.
Podemos ver estas dos lneas de cdigo: $IdConexion = mysql_connect($Servidor, $Usuario); [...] mysql_select_db($NombreBD, $IdConexion); que, como sabemos, la primera establece la conexin, devolviendo en la variable $IdConexion el identificador de la conexin para referirnos a ella despus, y la segunda elige una base de datos de entre todas las que hay, utilizando el identificador de conexin devuelto por la primera. Comenzamos analizando las siguientes dos sentencias: $Query = 'SELECT USUARIO,EMAIL FROM USUARIOS'; $IdConsulta = mysql_query($Query, $IdConexion); En primer lugar, introducimos en una variable a la cual llamamos $Query (como podamos haberla llamado $Consulta o de otra manera) la consulta que queremos hacer y, en segundo lugar, llamamos a la funcin mysql_query, a la que le pasamos la consulta y nos devuelve un identificador de consulta. Veamos ms detalladamente su estructura: mysql_query(string Consulta, int IdConexion); Como se aprecia en la definicin, hemos de pasarle como parmetro obligatorio una cadena en la que debe estar almacenada la consulta a realizar y, como parmetro opcional, el identificador de la conexin abierta (si no se especifica, se toma el que est activo en ese momento). Adems, devuelve un identificador de consulta, que podemos almacenar en una variable para referirnos luego a dicha consulta. Lo que hacemos con esta funcin es enviar la sentencia SQL al servidor MySQL para que sta sea ejecutada. Una vez hecha la consulta, hay que saber cmo recuperar los datos; esto es lo que hacemos en las siguientes lneas: $ResultQuery = mysql_fetch_array($IdConsulta); print("Usuario: ".$ResultQuery["USUARIO"]."<B>"); print("E-mail: ".$ResultQuery[1]."<P>"); Tenemos varias funciones para recuperar los datos de una consulta. Una de ellas es, como vemos en el ejemplo, mysql_fetch_array();. Esta funcin devuelve en un array el contenido de la sentencia SELECT, identificando cada elemento con un campo de la base de datos y avanzando a la siguiente fila. Para ello, debemos pasarle el identificador de consulta devuelto por mysql_query();. Observamos, adems, que como ndice podemos especificar tanto su posicin numrica (los arrays van del 0 al N-1, donde N es el nmero de elementos) como, entre comillas, el nombre del campo. Si queremos recorrer todas las filas devueltas por el SELECT, tendremos que ir haciendo la asignacin fila a fila hasta que ya no queden filas. Para saber cuntas filas devuelve un SELECT, tenemos la funcin mysql_num_rows();. Esta funcin, cuya definicin vemos: mysql_num_rows(int IdConsulta); devuelve un entero, que ser el nmero de filas del SELECT, de la consulta correspondiente al identificador IdConsulta. Por ejemplo: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE> Prueba PHP y MySQL </TITLE> </HEAD> <BODY BGCOLOR=white> <?php $NombreBD = "Registro"; $Servidor = "localhost"; $Usuario = "root";
$IdConexion = mysql_connect($Servidor, $Usuario); print("Se acaba de establecer la conexin.<BR>"); print("Servidor: ".$Servidor."<P>"); mysql_select_db($NombreBD, $IdConexion); $Query = 'SELECT USUARIO,EMAIL FROM USUARIOS'; $IdConsulta = mysql_query($Query, $IdConexion); $ResultQuery = mysql_fetch_array($IdConsulta); print("Usuario: ".$ResultQuery["USUARIO"]."<B>"); print("E-mail: ".$ResultQuery[1]."<P>"); $NFilas = mysql_num_rows($IdConsulta); print("Hay ".$NFilas." filas devueltas en la consulta<P>"); ?> Fin de la conexin a BD. </BODY> </HTML> Cuyo resultado es:
Al igual que tenemos mysql_fetch_array();, hay una funcin que se llama mysql_fetch_row();. Hace lo mismo, pero con una salvedad, y es que no se puede usar el nombre del campo en el array que devuelve como si fuera una manera de indexar. Es decir, slo admite referencias numricas a los campos de la consulta. Hay que tener en cuenta que el primero es el 0. Otras funciones que pueden sernos tiles son: mysql_field_name(int IdConsulta, int IndiceCampo); Nos devuelve el tipo de dato correspondiente a un campo de la base de datos, perteneciente a la consulta IdConsulta y cuya posicin en el SELECT viene dada por IndiceCampo, siendo 0 la primera posicin. Probad a poner, como muestra, este cdigo en el ejemplo: $TipoDato = mysql_field_type($IdConsulta, 1); print("Tipo de dato del campo: ".$TipoDato."<P>"); mysql_field_name(int IdConsulta, int IdCampo); Esta funcin nos devuelve el nombre del campo que ocupa la posicin IdCampo referente a la consulta IdConsulta. Una vez ms, hay que decir que los campos se numeran de 0 a N-1, siendo N el nmero de campos de la consulta. Podemos incluir este fragmento de cdigo en el ejemplo anterior: $NombreDato = mysql_field_name($IdConsulta,0); print("Nombre del campo: ".$NombreDato."<P>"); Nos queda por ver una funcin, mysql_result();. Esta funcin tiene la siguiente definicin: mysql_result(int IdConsulta, int Fila, int Campo); Esta funcin nos devuelve el dato referido a la consulta IdConsulta que ocupa la posicin (Fila, Campo). Por ejemplo, si aadimos este cdigo al que tenamos: $Dato1 = mysql_result($IdConsulta, 0, 0); print("El valor obtenido en la posicin (0,0) ". "es: <B>".$Dato1."</B><P>");
Insertar, borrar y actualizar registros es igualmente sencillo. Simplemente, tenemos que almacenar nuestra consulta en una variable, y pasrsela como argumento a la funcin mysql_query();. Terminamos el captulo viendo un ejemplo en el que insertamos un nuevo registro y luego mostramos cuntos hay: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE> Prueba PHP y MySQL </TITLE> </HEAD> <BODY BGCOLOR=white> <?php $NombreBD = "Registro"; $Servidor = "localhost"; $Usuario = "root"; $IdConexion = mysql_connect($Servidor, $Usuario); print("Se acaba de establecer la conexin.<BR>"); print("Servidor: ".$Servidor."<P>"); mysql_select_db($NombreBD, $IdConexion); $Query = 'INSERT INTO USUARIOS '. '(USUARIO,EMAIL) '. 'VALUES ('. '"LOLITA","EMILIO@PUNTO.COM");'; $IdInsercion = mysql_query($Query, $IdConexion); $Query = 'SELECT USUARIO,EMAIL FROM USUARIOS;'; $IdConsulta = mysql_query($Query, $IdConexion); $NFilas = mysql_num_rows($IdConsulta); for($i=0;$i<$NFilas;$i++) { print("Fila ".$i."<BR>"); $ResultQuery = mysql_fetch_array($IdConsulta); print("Usuario: ".$ResultQuery["USUARIO"]."<BR>"); print("E-mail: ".$ResultQuery[1]."<P>"); } ?> Fin de la conexin a BD. </BODY> </HTML> Podemos ver el resultado en la imagen:
5. Un ejemplo final
Para hacernos una idea de cmo trabajar, vamos a desarrollar en este captulo un ejemplo cuya finalidad ser, dada una base de datos con una nica tabla, insertar en ella comentarios. Es un ejemplo sencillo que, convenientemente modificado, puede dar lugar a aplicaciones como un libro de visitas, o ampliar sus posibilidades para hacer un sistema de comentarios en la web, etc. Partimos del siguiente cdigo, que nos crear un formulario en la pgina (obviaremos las directivas de la cabecera y nos centramos directamente en <BODY>): <FORM ACTION="Comentarios.phtml" METHOD="POST" NAME="Comentario"> <CENTER> <H2>Comentarios</H2> <TABLE BORDER=0 CELLSPACING=2 CELLPADDING=2> <TR> <TD>Nombre: </TD> <TD><INPUT TYPE=TEXT SIZE=20 NAME="Nombre"></TD></TR> <TR> <TD>Email: </TD> <TD><INPUT TYPE=TEXT SIZE=20 NAME="Email"></TD></TR> <TR> <TD COLSPAN=2>Escribe tu comentario: <BR> <TEXTAREA ROWS=5 COLS=30 NAME="TComentario"></TEXTAREA></TD></TR> </TABLE> <INPUT TYPE=SUBMIT VALUE="Enviar"> <INPUT TYPE=RESET VALUE="Borrar"> </CENTER> </FORM> Podemos afinar ms, y en lugar de un elemento SUBMIT poner simplemente uno de tipo BUTTON que en su evento onClick tenga asociado un cdigo de validacin de datos, para no permitir campos vacos, o una direccin de correo sin arrobas, etc., para lo que habra que hacer el correspondiente script JavaScript. Pero eso es una ampliacin y queda como ejercicio al lector. La idea va a ser, con los datos del formulario, rellenar los campos de una tabla en una base de datos que ha sido creada invocando a MySQL pasndole este script: CREATE DATABASE COMENTARIOS; USE COMENTARIOS; CREATE TABLE COMENTARIOS( IDCOMENTARIO INTEGER NOT NULL AUTO_INCREMENT, NOMBRE VARCHAR(40) NOT NULL, EMAIL VARCHAR(40) NOT NULL, MENSAJE TEXT NOT NULL, PRIMARY KEY(IDCOMENTARIO) ); Antes de seguir, una aclaracin: el campo IDCOMENTARIO es un entero de tipo AUTO_INCREMENT, esto quiere decir que no necesitaremos incrementar manualmente su valor, sino que cuando insertemos un registro, este valor se generar de forma automtica.
Parece claro, pues, que el contenido del campo Nombre del formulario se insertar en la columna NOMBRE, el del campo Email en la columna EMAIL y el campo TComentario en la columna MENSAJE. Estos datos son pasados al script PHP llamado Comentarios.phtml va el mtodo POST, muy adecuado para este tipo de aplicaciones, ya que, al haber un elemento TEXTAREA, es muy fcil sobrepasar la limitacin de 1 KB de informacin que permite GET. Como sabemos, los nombres para las variables escogidos en el formulario sern los nombres de variables PHP que tendremos que usar en el script que procesa los datos, pues ser ah donde tendremos sus valores. La idea del script ser esta: insertar los datos que nos acaban de introducir en el formulario en la base de datos, y mostrar todos los datos que hubiera hasta el momento, dndole algo de formato. As, el cdigo queda: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD> <TITLE> Ejemplo MySQL </TITLE> </HEAD> <BODY BGCOLOR=white> <?php $NombreBD = "Comentarios"; $Servidor = "localhost"; $Usuario = "root"; $IdConexion = mysql_connect($Servidor, $Usuario); mysql_select_db($NombreBD, $IdConexion); $Query = 'INSERT INTO COMENTARIOS'. ' (NOMBRE,EMAIL,MENSAJE)'. ' VALUES ('. '"'.$Nombre.'","'.$Email.'","'.$TComentario.'");'; $IdInsercion = mysql_query($Query, $IdConexion); ?> Mensajes insertados hasta ahora: <P> <?php $Query = 'SELECT NOMBRE,EMAIL,MENSAJE FROM COMENTARIOS;'; $IdConsulta = mysql_query($Query, $IdConexion); $NFilas = mysql_num_rows($IdConsulta); ?> <CENTER> <TABLE BORDER=0 BGCOLOR=#7BA9E8 CELLPADDING=4 CELLSPACING=3> <? for($i=0;$i<$NFilas;$i++) { $ResultQuery = mysql_fetch_array($IdConsulta); print("<TR>"); print("<TD>Nombre: ".$ResultQuery["NOMBRE"]."</TD>"); print("<TD>E-mail: ".$ResultQuery["EMAIL"]."</TD></TR>"); print("<TR><TD BGCOLOR=#ACC1FB COLSPAN=2>"); print("Mensaje: ".$ResultQuery["MENSAJE"]."</TD>"); print("</TR>"); } ?> </TABLE> </CENTER> </BODY> </HTML> Con todo lo visto, no queda mucho ms por comentar aqu, ya que no se ha hecho nada nuevo con respecto a captulos anteriores. Un ejemplo, tras varias inserciones de prueba, de este script, podemos verlo en la imagen: