Construyendo una taberna

Autor: Scailay

Introducción

Lo que se detalla en el artículo no es más que la programación de un shoutbox a lo grande, sistema de comentarios, o como se conoce en Hispabyte, una taberna.
La finalidad del artículo es básicamente introducirse un poco en PHP, así que intentaré explicarlo todo lo más detalladamente posible. Sin embargo, para alguien que no conozca ningún lenguaje de programación sí le recomendaría que echase un vistazo al manual oficial de PHP para tener unas ideas previas sobre la sintaxis de las funciones y otras cosas básicas.

Para crear la taberna necesitaremos lo siguiente:

Construyendo la base de datos

Lo primero que nos encontraremos al entrar en el phpMyAdmin por primera vez será algo como lo siguiente. Para crear la base de datos tan sólo le indicamos el nombre (en este caso taberna, por ejemplo):

PhpMyAdmin

El siguiente paso es crear las tablas que compondrán nuestra base de datos (ver imagen). En este caso tan sólo será necesario una tabla, en la que guardaremos todo lo necesario. Si quisiesemos dar más funcionalidad a la taberna (por ejemplo, registro de usuarios), lo ideal sería crear otra tabla para gestionarlos, pero como no es el caso se queda así.

Creando Tablas

La tabla main se compondrá de cuatro campos:

Creando Campos

La base de datos ya está creada. Las tablas que se vayan creando aparecerán en la columna de la izquierda (que como ya hemos dicho por el momento no son necesarias más), y pinchando sobre ellas podréis modificar la tabla, insertar valores e incluso realizar consultas SQL, pero como esto no es unun tutorial de phpMyAdmin os dejaré que investigueis, ya que lo imprescindible ya está hecho.

Formulario de inserción de mensajes

Para programar esto (al igual que el resto) os vale cualquier editor de textos (eso lo dejo a vuestra elección). Cread un archivo index.php. Me pararé lo justo en el diseño y el código HTML. Tras rellenar la cabecera, ya en el cuerpo de la página cread un formulario tal que así:

<form name="form" method="post" action="insert.php">
    <input type="text" name="autor">
    <br />
    <textarea class="input" rows="6" cols="40" name="mensaje">
    </textarea>
    <br />
    <input type="submit" label="Enviar">
</form>

Lo único a destacar de esto es la primera línea. Creamos un formulario, y con la etiqueta action le indicamos que la información introducida en los campos ha de ser enviada al fichero indicado por nosotros (insert.php) usando el método indicando en method, y que lo pasaremos por POST (lo más habitual).
En el momento que pulsamos el botón enviar, el contenido de los campos se envía al insert.php para procesarlo. En el siguiente apartado veremos cómo hacerlo.

Guardando los mensajes en la base de datos

Bien, ya estamos en el script donde procesaremos el mensaje escrito. ¿Pero cómo recogemos los datos? Al enviar los datos del formulario usando POST, habremos de recogerlo usando el mismo sistema. Pero lo primero de todo es conectarnos a nuestro servidor y seleccionar nuestra base de datos. Para ello hacemos lo siguiente:

$conex = mysql_connect("localhost");
if(!$conex)
    die("Error en la conexion a la BD. ".mysql_error());

$bd_name="taberna";
$bd = mysql_select_db($bd_name);
if(!$bd)
    die("Imposible seleccionar BD $bd_name".mysql_error());

Con la sentencia mysql_connect nos conectamos al servidor indicado, en este caso localhost (el servidor donde tenemos la base de datos es el mismo donde estarán los scripts de la taberna). Además se le pueden pasar otros dos parámetros opcionales: el usuario y la contraseña. En este caso creamos la base de datos sin contraseña, pero lo normal sería crear un usuario y un password, que deberíamos pasarle como parámetros para poder conectarnos.

Las dos siguientes líneas son una simple comprobación para que en el caso de que no pudiésemos conectarnos nos diese un aviso por pantalla del problema. A continuación seleccionamos la base de datos, en nuestro caso 'taberna', con la sentencia mysql_select_db.

Una vez hecho todo esto ya estamos conectados a nuestra base de datos y listos para trabajar con ella. Veamos ahora cómo guardar los mensajes que recibimos del otro script.

PHP dispone de una variable global llamada $_POST, que forma una matriz asociativa con todas las variables que le pasamos por POST en el index.php. Es una forma de tenerlo todo agrupado. Para acceder a una variable en concreto, la sintaxis sería por ejemplo $_POST['autor'] para trabajar con el autor, y $_POST['texto'] para trabajar con el texto principal del mensaje.

Recordemos que además del autor y el mensaje hemos de insertar la fecha en que fue insertado éste. Para ésto último PHP dispone de la función date(), que devuelve la fecha actual con el formato que le indiquemos. Por ejemplo:

$fecha = date("y-m-d, H:i:s");
Tras todo esto, vemos que ya tenemos localizado todas las variables necesarias:

El siguiente paso es guardarlas en la base de datos, para lo cual haremos una consulta en SQL de este estilo:

$consulta = "INSERT INTO tabla_donde_insertaremos (campos) 
             VALUES (valores_a_insertar)";
Así, nos quedaría algo como lo siguiente:
$consulta = "INSERT INTO main (id_msg, autor, texto, fecha) 
        VALUES ('', '$_POST['autor']', '$_POST['texto']', '$fecha')";
El campo id_msg lo dejamos en blanco porque, recordad, a la hora de crear la tabla le indicamos que se auto incrementase en cada nueva inserción, por lo cual no hace falta preocuparse del valor que deberemos darle. El resto de las variables se las pasamos como indicamos anteriormente.
Ahora hemos de "decirle" al intérprete de PHP que queremos procesar la consulta (que no viene a ser más que una cadena de texto) contenida en la variable $consulta:
$sql = mysql_query($consulta);

 if(!$sql)
      die("Error en la consulta: ".mysql_error());
 else
      header("Location: index.php");

Lo que hacemos con el if y el else es una comprobación de error. Si hubo algún error a la hora de insertar los valores, $sql no contendrá nada, y por tanto al evaluar if(!$sql) dará cierto y nos sacará un mensaje de error. En caso de que la inserción se haya realizado correctamente, nos redireccionará a la página principal.

Extrayendo los mensajes de la base de datos

Ya sabemos cómo insertar los mensajes escritos en el formulario de index.php en la base de datos. Ahora nos falta lo obvio: mostrar esos mensajes en la pantalla principal. Así pues, volvamos a index.php, donde hasta ahora el único código que teníamos es el formulario. A continuación de él abrimos las etiquetas para insertar código PHP.

El primer paso es el mismo que en el apartado anterior, conectarnos al servidor y seleccionar la base de datos. El segundo paso será hacer una consulta que extraiga los mensajes junto con su autor y la fecha en que fueron escritos. La sintaxis sería:

$consulta = "SELECT * FROM main ORDER BY id_msg DESC LIMIT 10";
Con la consulta anterior estamos diciendo que en la tabla main seleccione todos los campos (id_msg, autor, texto y fecha), y que los ordene en orden descendente por el id_msg (así los últimos mensajes quedarían arriba del todo). Con LIMIT 10 le indicamos que sólo queremos los 10 últimos mensajes escritos. No nos olvidemos de la comprobación de error:
$msgs = mysql_query($consulta);
  if(!$msgs)
     die("Error en la consulta a la BD".mysql_error());
Ahora procesamos la consulta para mostrar los mensajes:
$numFilas = mysql_num_rows($msgs);
     
for($i=0; $i<$numFilas; $i++)
     {
       $tupla=mysql_fetch_array($msgs);
       
       echo "<table  style='border-style: groove; border-width: thin;'
             cellspacing='0' width='100%' 
             cellpadding='0' bgcolor='#C7DFFF' align='center'>"; echo "<tr><td>"; echo "#".$tupla['id_msg']."   Escrito por: ".$tupla['autor']." ::  ".$tupla['fecha']; echo "</td></tr></table>"; echo nl2br($tupla['texto']); echo "<p />"; }
Con mysql_num_rows() guardamos en la variable $numFilas el número de filas que resultan de la consulta, que como máximo serán 10, ya que así lo impusimos a la hora de realizar la consulta.

Lo que tenemos que hacer ahora es ir procesando mensaje por mensaje, haciendo para ello un bucle que constará de tantas iteraciones como filas tenga la consulta.

El resultado obtenido en la consulta (guardado en $msgs) debe ser convertido para poder manejarlo correctamente. Para ello usaremos la función mysql_fetch_array(). Cada vez que llamemos a esta función nos devolverá una tupla (dicho a grosso modo, una tupla en este caso la formarían un identificador de mensaje, con su correspondiente mensaje, autor y fecha). Cuando llamemos por primera vez a mysql_fetch_array, en $tupla tendremos guardado un array con cuatro variables: id_msg, autor, texto y fecha. Ahora los mostramos por pantalla usando la orden echo de PHP. En el ejemplo que puse anteriormente creé una tabla para mostrar el identificador, seguido del autor y de la fecha en que fue escrito.

A continuación sacamos el texto. Fijémonos en la función nl2br(). Lo que hace es sustituir los retornos de carro introducidos por nosotros en el formulario por "<br />", de tal forma que a la hora de mostrarlo por pantalla se visualicen correctamente.

Al acabar la iteración, cogemos la tupla siguiente, que contendrá otro identificador, otro autor, otro mensaje y otra fecha, y realiza el mismo proceso para mostrarlo debajo del anterior. Cuando salga del bucle habremos mostrado los 10 primeros mensajes (o menos, si no se han insertado más de 10) y habremos terminado.

Para terminar

Y esto es todo. Aunque muy sencilla, ya hemos conseguido crear nuestra propia taberna. Como posibles mejoras se le podría implementar un sistema de registro de usuarios, de tal modo que sólo tengan acceso aquellos que estén registrados e identificados, pero eso ya implica trabajar con sesiones y cookies, así que queda para otra ocasión.