7 Programación del servidor web: PHP
Listado 7.19. Creación de tablas en una base de datos MySQL vacía Obtener el ejemplo completo
La línea 6 del Listado 7.19 invoca la función mysql_connect($host, $user, $pass) para intentar establecer una conexión con el servidor de base de datos MySQL que está en la computadora local (puesto que el valor de $db_host es 'localhost'), con el usuario y contraseña que se crearon para uso exclusivo de los scripts de PHP. Si mysql_connect() logra establecer la conexión, retorna un recurso de PHP (resource) que representa a la conexión y puede usarse subsecuentemente. Si no se puede establecer la conexión, mysql_connect() retorna false y PHP verifica la segunda condición del or en la línea 7, que detiene la ejecución del script con mensaje de error para el navegador. Como se dijo antes, este mensaje es útil para el desarrollador, pero poco amigable para el visitante.
Si la ejecución alcanza la línea 11 del Listado 7.19, indica que la conexión con el DBMS fue establecida exitosamente. El DBMS puede tener muchas bases de datos a su cargo, y es necesario indicarle con cual de todas ellas se quiere trabajar con la función mysql_select_db($db_name).
A partir de la línea 40 en adelante, se empiezan a crear las tablas de la base de datos Universidad, pero si ya existen, se mantienen inalteradas. Sin embargo, pueda que por alguna razón el administrador del sitio web de la Universidad (webmaster) quiera limpiar la base de datos y empezar de cero. Para efectos ilustrativos, si se ha provisto el parámetro create_schema.php?drop_tables=true en el URL (de esto se hablará luego) se destruirán todas las tablas existentes de la base de datos sin confirmación alguna, lo cual no es un buen diseño, pero se hace aquí con propósitos ilustrativos. En caso de que el administrador solicite recrear las tablas, el método más eficiente es eliminarlas de golpe (DROP TABLE) y volverlas a crear vacías. Para poder borrarlas se necesita conocer el nombre de cada una de ellas. El script podría tener estos nombres en un arreglo, o bien, solicitarlos al DBMS mediante una consulta SHOW TABLES de MySQL. Cada cual tiene sus ventajas y desventajas. Aquí se seguirá la segunda.
La consulta SHOW TABLES opera de la misma forma que una consulta SELECT de SQL. La consulta es ejecutada con la función mysql_query($sql_query), la cual retorna un recurso que representa el resultado de la consulta, a veces llamado "record set". En la línea 21 del Listado 7.19, este recurso se almacena en una variable $result.
Es importante hacer notar que $result almacena un recurso, no los datos que se obtuvieron de la consulta. En el modelo relacional, los datos resultado de una consulta son una tabla temporal, y aunque algunos DBMS permiten acceder a todos ellos como si fuesen una matriz en memoria aleatoria (RAM, Random Access Memory), es más eficiente recorrerlos una fila a la vez. Cada invocación a la función mysql_fetch_row($query_result) trae de la base de datos la próxima fila resultado de una consulta, y la retorna en un arreglo que permite acceder a cada valor por un índice que equivale al número de la columna. Para el caso de SHOW TABLES sólo se retorna una columna con el nombre de cada tabla presente en la base de
datos. La línea 28 del Listado 7.19 muestra cómo acceder a este valor. Si se quiere acceder al valor por el nombre de la columna en lugar de un índice, utilícese la función mysql_fetch_assoc($query_result), que puede tener el efecto de hacer al código más portable.
Una vez que se ha obtenido el nombre de la tabla, se emite otra consulta DROP TABLE para eliminarla de la base de datos (línea 30). Nótese que la invocación a mysql_fetch_row() se hace en un ciclo, ya que es muy probable que existan varias tablas en la base de datos. Cuando se ha terminado de procesar la última de ellas, mysql_fetch_row() retornará false en lugar de un arreglo de valores.
La línea 35 del Listado 7.19 invoca la función mysql_free_result($query_result) para liberar las estructuras de datos en memoria que alojan el resultado de la consulta obtenido en la línea 21 con mysql_query(). Si se omite esta invocación, el intérprete de PHP lo hará automáticamente cuando el script termine su ejecución.
En síntesis, el código de las líneas 18 a 36 del Listado 7.19 se ejecuta sólo cuando se ha solicitado eliminar las tablas existentes de la base de datos, obteniendo el nombre de cada una de ellas y eliminándolas con DROP TABLE. Una vez que se han eliminado, el programa sigue su ejecución normal en la línea 40, que emite otras consultas (CREATE TABLE) con la misma función mysql_query(), pero debido a la naturaleza de la instrucción CREATE TABLE de SQL, no se generan registros de datos como resultado, sino los valores true y false indicando respectivamente si la creación de la tabla fue exitosa o no. Como puede inferirse, la función mysql_query() se utiliza para ejecutar cualquier tipo de consulta SQL: crear tablas, insertar valores, actualizar valores, eliminar valores y obtener datos.
Para mysql_query() la consulta es un simple string que pasa directamente al DBMS. La sintaxis de dicha consulta es completamente dependiente del DBMS en uso. El desarrollador web debe consultar la documentación oficial de su DBMS para comprobar su validez u otras opciones útiles. En los ejemplos de este documento se ha utilizado MySQL cuya sintaxis se puede consultar en línea.
Finalmente la línea 64 del Listado 7.19 desconecta al intérprete de PHP del servidor de bases de datos con la función
mysql_close(), la cual libera recursos y permite que el DBMS pueda aceptar otras conexiones; aspecto importante cuando
se atienden miles de visitantes simultáneamente en un sitio web.
7.3.2 Objetos para acceder a la base de datos
7.4 Formularios web
A diferencia de otros medios tradicionales, como la radio y televisión; el web permite una comunicación interactiva, donde el visitante puede expresarse y retroalimentar a los autores. El mecanismo de interacción más primitivo es activar un
elemento, haciendo click sobre él con el puntero del ratón o navegando con el teclado. Sin embargo, es el formulario web el mecanismo que permite al visitante comunicar información textual, a través de campos de texto, seleccionando valores en una lista emergente, adjuntando un archivo de su computadora, y otros controles que guardan mucha similitud a los que dispone la interfaz de una aplicación de escritorio.
Las aplicaciones web actuales recurren al formulario web como el escenario donde la interacción con el usuario tiene lugar. Tómese de ejemplo un cliente web de correo (como GMail). Los campos para el destinatario, las copias, y el título del mensaje, se implementan con campos de texto (text fields); el cuerpo del mensaje se escribe en un control de área de texto (text area); los botones permiten formatear el texto del mensaje, adjuntar archivos, y uno en especial, el botón de enviar (submit) termina la edición del mensaje y envía copias a los destinatarios.
En la mayoría de casos, la interacción con un formulario web tiene repercusiones en el lado del sevidor. Por ejemplo en el caso del cliente de correo, además de enviar el mensaje a los destinatarios, se guardará una copia en el buzón de salida. Es decir, algún texto se concatenará a un archivo, o un registro se agregará a la base de datos del servidor de correo. Es por esto que la implementación de un formulario web requiere trabajo en ambas partes: en el lado del cliente, el navegador despliega el formulario y asiste al informante en el ingreso de información mediante JavaScript; mientras que en el lado del servidor se reciben los datos, se realiza la validación de los mismos y se aplica el efecto para el cual se ideó el formulario (enviar un correo, almacenar datos, buscar información, etc.).
El formulario web es un concepto que existe desde los inicios de la web, y se escribe con el elemento form como se ejemplifica en las líneas 12 a 16 del Listado 7.20. La primera vez que se carga este programa, ninguna de las variables $username y $password tendrán un valor, por lo que el control alcanza el else y despliega el formulario web de las líneas 12 a 16. Nota: El operador <<< se conoce como Heredoc, y es seguido por un identificador y un cambio de línea. Todos los caracteres que se encuentren entre ese cambio de línea y la próxima ocurrencia del identificador forman un string en el cual se hace interpolación de variables. Es útil para encerrar texto que contiene comillas dobles sin tener que utilizar caracteres de escape (\). La única restricción es que el identificador de cierre sólo puede estar precedido por un cambio de línea como se ve en la línea 17.
<body><?php 1.
$username = isset($_GET['username']) ? $_GET['username'] : '';
$password = isset($_GET['password']) ? $_GET['password'] : '';
3.
if ( $username != '' && $password != '' )
4.
{
5.
echo "<p>Bienvenido(a) <strong>$username</strong> a nuestro sitio seguro. ";
6.
echo "(No eres <a href=\"login1.php\">$username</a>?).</p>";
7. } 8. else 9. { 10. echo <<<_EOT 11.
<form method="get" action="login1.php">
12.
<p><label>Usuario: <input type="text" name="username"/></label></p>
13.
<p><label>Contraseña: <input type="password" name="password"/></label></p>
14.
<p><input type="submit" value="Enviar"/></p>
15. </form> 16. _EOT; 17. } 18. ?></body> 19.