Otra vez por aquí. Aprovechando que estoy esperando, voy a dejar colgado un nuevo ejercicio básico de PHP. Sigue en la línea de los últimos publicados, trabajo con archivos de texto. En este caso el ejercicio será un libro visitas realizado con PHP, por lo que el control de errores lo dejaré un poco de lado. Quizás en futuras versiones de este mismo ejercicio me centre más en ellas, pero por el momento no va a ser el caso.
El enunciado del ejercicio vendría siendo; El “Museo Cerdo” quiere recoger los comentarios de sus visitantes sobre las exposiciones del centro. Para ello ha habilitado una página Web donde se van a recoger sus opiniones, de cara a organizar próximas exposiciones temporales, ver qué aspectos se pueden mejorar, o cosas por el estilo.
Para ello hay que crear un libro de visitas basado en dos archivos. El primero será donde los comentarios se almacenen y lo llamaremos visitantes.txt, mientras que el libro de visitas propiamente dicho será la página visitantes.php. En este caso voy a utilizar el index.php para incluir el formulario en el que el usuario introducirá los datos que quiera publicar. En este index.php se mostrarán también los comentario añadidos.
Este libro almacenará el comentario, el nombre, la fecha del comentario, la hora en el que se produzca y la dirección de email del usuario.
Además los nuevos comentarios se mostrarán los primeros de la lista que se va a generar en el index.php.
Nota: El fichero visitantes.txt debe estar almacenado en la misma carpeta que el archivo PHP remoto.
Se puede ver un ejemplo funcional del ejercicio en este enlace. Si en algún momento deja de funcionar este libro visitas y alguien se da cuenta, que deje un comentario al respecto.
Código del ejercicio del libro visitas con PHP:
<!DOCTYPE html> <html> <head> <title>Ejercicio 35</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> </head> <body> <!--en onSubmit se indica que si el nombre es menor de 4 caracteres no se va a enviar--> <form method=post action=visitantes.php onSubmit='if ( this.nom.value.length < 4 ) { return false ;}' > <table align="center"> <th colspan="3" bgcolor="#f0f0f0"><h1>Museo Cerdo</h1></th> <tr> <td>Nombre* :</td> <td><input type=text name=nom size=25 ></td> <td rowspan=2><input type=submit value=Enviar> <input type="reset" value="Borrar"> </td> </tr> <tr> <td>Mail :</td> <td><input type=text name=email size=25 ></td> </tr> <tr> <td>Mensaje :</td><td colspan=2> <textarea name=mensaje wrap="hard" rows=4 cols=47></textarea> </td> </tr> </table> </form> <hr> </body> </html> <?php //mostramos los comentarios ya añadidos centrados echo "<div align='center'><h2>Mensajes dejados por los usuarios</h2>"; echo "<hr>"; //comprobamos si existe el fichero dónde se guardan los comentarios if (file_exists("visitantes.txt")){ $nombre_fichero = "visitantes.txt"; //Apertura para sólo lectura; coloca el puntero al fichero al principio del fichero. $fichero = fopen($nombre_fichero,"r"); //fread — Lectura de un fichero en modo binario seguro //con filesize se toma todo el fichero indicado, sinó se podría indicar un tamaño a leer $contenido = fread($fichero, filesize($nombre_fichero)); //cerramos el fichero fclose($fichero); //separamos el contenido tomado con fread y lo separamos por el signo - $lineas = explode("-",$contenido); //ordenamos el array lineas de manera inversa por la clave primaria (que se genera automáticamente //para poder visualizar primero el último comentario añadido. krsort($lineas); //imprimimos cada una de las líneas dentro de una tabla. echo "<table>"; foreach ($lineas as $linea) { echo "<tr>"; echo "<td>".$linea."</td>"; echo "</tr>"; } //cerramos la tabla en la que mostramos los comentarios. echo "</table>"; }else{ //En caso de que no exista el fichero de comentarios se va a ver //el siguiente mensaje. echo "<b><i>Todavía no se han agregado comentarios</i></b>"; } echo "</div>"; ?>
<?php //Apertura del archivo en modo solo escritura. Coloca el puntero al //final del fichero. Si el fichero no existe se intenta crear. $archivo = fopen("visitantes.txt",'a') or die ("ERROR al abrir el archivo"); //Convertimos los caracteres html con htmlspecialchars de nom y mail $nom = htmlspecialchars($_POST['nom']); //comprobamos primero si el email viene vacío, de venir vacío se rellena con //un email genérico. if(empty($_POST['email'])){ $_POST['email']="sin@email.com"; } $mail = htmlspecialchars($_POST['email']); //Comprobamos si el mensaje viene vacío, de ser así, se rellena con un mensaje //genérico. if(empty($_POST['mensaje'])){ $_POST['mensaje']="Sin comentario"; } //stripslashes quita las barras de un string con comillas escapadas //nl2br Inserta saltos de línea HTML antes de todas las nuevas líneas de un string //htmlentities es una función idéntica a htmlspecialchars() en todos los aspectos, //excepto que con htmlentities(), todos los caracteres que tienen equivalente HTML //son convertidos a esas entidades. $message = stripslashes(nl2br(htmlentities($_POST['mensaje']))); //tomamos la fecha y la hora del sistema $d = date ( "d/m/Y H:i:s" ); //aquí guardaremos el nombre, el email, la fecha, hora y el mensaje. $page = ""; //creamos el enlace para mandar un email. Se usa mailto para ello. $lemail = "<a href=\"mailto:$mail\">$mail</a>"; $page .= "<b>$nom</b> (".$lemail.") <b>Fecha:</b> $d<br> <b>Mensaje:</b> $message\n<br><hr>-"; //Añadimos el mensaje fwrite($archivo,"$page" ,strlen("$page")); //cierre del archivo fclose($archivo); //mostramos el mensaje de añadido echo "<div align='center'>Gracias por tu mensaje.<br>"; echo "<a href='index.php' title='Volver'>Volver</a></div>"; ?>