Como lo prometido es deuda, aquí estoy otra vez para colgar un ejercicio que se me había quedado por el camino. Se trata del ejercicio básico 33 de php. Como este ejercicio tiene mucho que ver con el anterior (el 32), voy a dejar el código de ambos ejercicios en este post, para poder jugar al mismo tiempo con los dos. Además de realizar el ejercicio de turno, he tocado un poco del ejercicio anterior. Ahora el DNI que el usuario mete por teclado tiene que tener el formato español de toda la vida (ocho números y una letra). Esto hace que no se pueda meter cualquier cosa en ese campo.
Y ahora veamos que el ejercicio 33 que traigo hoy se trata de el alumno que ha realizado el examen, curso o lo que sea que ha realizado, quiere consultar on-line el resultado de su examen (la nota que un supuesto docente ha puesto (injusta o justamente). Por lo tanto hay que crear un formulario donde dado el DNI del alumno este devuelva la nota que el profesor ha puesto al alumno. En este enlace se puede ver como he planteado los dos ejercicios. Los he dejado para poder interactuar entre el formulario del ejercicio 32 y el del ejercicio 33. Como ya he dicho, el ejercicio 32 sería el formulario que utilizaría el profesor. El formulario del ejercicio 33 sería el que utilizaría el alumno para consultar su nota. Se puede mover entre ellos mediante los enlaces en la parte inferior del formulario.
Ejercicio PHP: Lectura de datos en un fichero.
Y bueno, explicado el ejercicio, es hora de irse al turrón del asunto …
index.html
<html> <head> <title>Ejercicio 33</title> <meta charset="utf-8"> <script type="text/javascript"> //Función para limpiar el formulario cuando se carge la página function formReset() { document.getElementById("formulario").reset(); } </script> </head> <body onload="formReset();"> <center><h1>Introductor de Notas</h1> <h6>Antes de abrir el registro de datos hay que introducir algún dato mediante el formulario</h6> <form action="index.php" method="post" id="formulario"> DNI: <input type="text" name="DNI" maxlength="9" size="9"> <br> Nota: <select name="nota"> <option value="10">10</option> <option value="9">9</option> <option value="8">8</option> <option value="7">7</option> <option value="6">6</option> <option value="5">5</option> <option value="4">4</option> <option value="3">3</option> <option value="2">2</option> <option value="1">1</option> <option value="0">0</option> </select> <br> <input type="submit" value="Registrar"> </form> <br> <a href="datos.txt" title="Abrir archivo de registro" target="_blank">Abrir Registro de datos</a><br> <a href="BuscarNota.html" title="Buscar Nota">Buscar Nota por DNI</a></center> </body> </html>
index.php
<!DOCTYPE HTML> <html> <head> <title>Buscar nota ejercicio 33</title> <meta charset="UTF-8"> </head> <body> <center> <?php if (empty($_POST['DNI'])||empty($_POST['nota'])){ echo "Ninguno de los campos puede estar vacío"; echo "<br><a href='index.html' title='volver atrás'>Volver</a>"; }else{ @$lineas = file("datos.txt");//guardamos el archivo donde vamos a escribir en $lineas $dni=strtoupper($_POST["DNI"]); //el valor a buscar, transformamos la letra a mayúscula $encuentra=0; //el número de veces que se ha encontrado $patron='/[0-9]{8}[A-Z]$/'; //patrón para el DNI //Comprobamos la validez del dni mediante pregmatch y una expresión regular if (preg_match($patron, $dni)) { if ($_POST['nota']<0 || $_POST['nota']>10){ echo "ERROR. La nota tiene que estar entre 0 y 10"; echo "<br><a href='index.html' title='volver atrás'>Volver</a>"; }else{ if (file_exists("datos.txt")){ foreach(@$lineas as $linea){ //recorremos el archivo dónde buscarmos if (strstr($linea,$dni)){ //si en el archivo aparece el string que pasamos como dni $encuentra+=1; //añadimos uno al macador } } if ($encuentra==0){ //si no se ha encontrado ninguna coincidencia de DNI en el archivo $ar=fopen("datos.txt","a+") or die("Problemas en la creación!!"); fputs($ar,"DNI: "); fputs($ar,strtoupper($_REQUEST['DNI'])); fputs($ar," - "); fputs($ar,"Nota: "); fputs($ar,$_REQUEST['nota']); fputs($ar,"\n"); fputs($ar,"--------------------------------------------------------"); fputs($ar,"\n"); fclose($ar); echo "Los datos se guardaron correctamente."; echo "<br><a href='index.html' title='volver atrás'>Volver</a>"; }else{ //en caso de que se produzca alguna coincidencia echo "El DNI ". $dni." ya está agregado. Introduzca un DNI diferente. <a href='index.html'>Volver</a>"; } }else{ echo "El archivo datos.txt no existe y se creará.<br>"; $ar=fopen("datos.txt","a") or die("Problemas en la creación!!"); fputs($ar,"DNI: "); fputs($ar,strtoupper($_REQUEST['DNI'])); fputs($ar," - "); fputs($ar,"Nota: "); fputs($ar,$_REQUEST['nota']); fputs($ar,"\n"); fputs($ar,"--------------------------------------------------------"); fputs($ar,"\n"); fclose($ar); echo "Los datos se guardaron correctamente."; echo "<br><a href='index.html' title='volver atrás'>Volver</a>"; } } }else{ echo 'Escribe correctamente el DNI. El formato aceptado es de 8 números (<b>D</b>) y una letra (<b>L</b>) (sin espacios).<br>'; echo "<b>DDDDDDDDL</b>"; echo "<br><a href='index.html' title='volver atrás'>Volver</a>"; } } ?> </center> </body> </html>
BuscarNota.html
<html> <head> <title>Ejercicio 33</title> <script type="text/javascript"> function formReset() { document.getElementById("formulario").reset(); } </script> </head> <body onload="formReset();"> <center> <h1>Busca una nota asociada a un DNI</h1> <form action="busqueda.php" method="post" id="formulario"> DNI: <input type="text" name="DNI" maxlength="9" size="9"> <br> <input type="submit" value="Buscar Nota"> </form> <br> <a href="index.html" title="Ingresar las notas">Ingresar Nota</a> </center> </body> </html>
busqueda.php
<meta charset="UTF-8"> <!--el meta para los acentos y esas cosas --> <?php if (empty($_POST['DNI'])){ echo "El campo DNI no puede estar vacío."; echo "<br><a href='BuscarNota.html' title='Volver atrás'>Volver</a>"; }else{ //primero comprobamos que exista el archivo dónde vamos a buscar if (file_exists("datos.txt")){ $lineas = file("datos.txt"); //abrimos el archivo dónde vamos a buscar $dni=strtoupper($_POST["DNI"]);//pasamos a mayúsculas la letra del DNI $pos = 0; $encontrado=0; //contador por si no se encuentra el dni $patron='/[0-9]{8}[A-Z]$/'; //patrón para el DNI //Comprobamos la validez del dni mediante pregmatch y una expresión regular if (preg_match($patron, $dni)) { // Podemos mostrar / trabajar con todas las líneas: foreach($lineas as $linea){ if (strstr($linea,$dni)){ //buscamos el dni dentro de cada una de las líneas del archivo echo "El <b>$linea</b> es el registro número ".(($pos/2)+1)." de los datos guardados"; echo "<br><a href='BuscarNota.html' title='Volver atrás'>Volver</a>"; $encontrado++; } $pos++; } //Si encontrado es igual a 0 quiere decir que no se ha encontrado ningún DNI igual al introducido if($encontrado==0){ echo "El DNI ".$dni." todavía no tiene una nota asignada.<br>"; echo "<br><a href='BuscarNota.html' title='volver atrás'>Volver</a>"; } }else{ echo 'Escribe correctamente el DNI. El formato aceptado es de 8 números (<b>D</b>) y una letra (<b>L</b>)<br>'; echo "<b>DDDDDDDDL</b>"; echo "<br><a href='BuscarNota.html' title='volver atrás'>Volver</a>"; } }else{ echo "El archivo al que intentas acceder todavía no ha sido creado."; echo "<br><a href='BuscarNota.html' title='Volver atrás'>Volver</a>"; } } ?>
Con esto doy por finalizado el ejercicio de lectura de datos. Quién quiera ver el ejercicio funcionando, puede verlo en este enlace.