En esta ocasión os traigo otro asunto que me trae de cabeza. Seguimos con ejercicios de gestión de ficheros con PHP, concretamente nos toca realizar otro clásico, el formulario de Log in. Hasta la fecha he ido corrigiendo los errores que me iban surgiendo consultando diversas fuentes y a través del ensayo-error, pero la cosa se complica y tampoco puedo dedicarle tanto tiempo sólo a esta asignatura, así que me toca consultar a gente experta para no perder más tiempo.
PROBLEMA
Al pulsar el botón "Iniciar sesión" del formulario, aunque los campos estén vacíos me da el Log in por válido, por lo que no puedo proceder con la siguiente parte del ejercicio, que es redireccionar a los usuarios que se validaron con éxito a su correspondiente página, ya que, cualquiera que pulsase el botón sin introducir nada en los campos, podría acceder a la página.
Este es el formulario:
Código HTML:
<form action="u4_ej_04_portal.php" method="post" name="formulario_acceso"> <br /> <table border="2" cellpadding="10"> <tr> <td colspan="2"><h2 class="en_cursiva">Foro</h2></td> </tr> <tr> <td><input name="nickname" type="text" size="30" placeholder="Introduzca su usuario" /></td> </tr> <tr> <td><input name="pass" type="password" size="30" placeholder="Introduzca su contraseña" /></td> </tr> <tr>' <td colspan="2"><input name="enviar" type="submit" value="Iniciar sesión" class="boton negro redondo"/></td> </tr> </table> </form>
Y este el el código PHP que estoy completando:
Código PHP:
<?php
// Declaramos el directorio de ficheros (partiendo del directorio en el que estamos) y lo establecemos como actual
// Comprobamos que se ha fijado como actual
if (chdir("ficheros")) {
//echo '<br /><p class="control_ruta_fichero">El directorio
// "C:\xampp\htdocs\phpws\u4_ej_04-05\ficheros"
// existe y ha quedado fijado como actual.</p><br />';
}
else {
echo '<br /><br /><p class="control_ruta_fichero">El directorio
"C:\xampp\htdocs\phpws\u4_ej_04-05\ficheros"
no existe y no se ha podido fijar como actual.</p><br />';
}
// -------------------------------------------------------------------------------------------------------------------------------------------
// Declaramos las variables $nick y $pwd haciendo referencia a sus input correspondientes
if (!isset($_POST["nickname"])) $nick = null; // Si el campo de texto "nickname" está vacío, la variable $nick vale null.
else $nick = $_POST["nickname"]; // Si el campo de texto "nickname" tiene contenido, la variable $nick vale el contenido introducido en el campo de texto "nickname".
if (!isset($_POST["pass"])) $pwd = null; // Si el campo de texto "pass" está vacío, la variable $pwd vale null.
else $pwd = $_POST["pass"]; // Si el campo de texto "pass" tiene contenido, la variable $pwd vale el contenido introducido en el campo de texto "pass".
// Declaramos la variable $fich_datos con el nombre del fichero .txt que vamos a usar
$fich_datos = "pass.txt";
// CONDICIONES DE INICIO DE SESIÓN
if (isset($nick) && isset($pwd)) {
$id_puntero = @fopen($fich_datos, "r") // Abrimos el fichero en modo lectura
or die('<p class="control_ruta_fichero">El fichero "pass.txt" no se ha podido abrir.</p><br />');
//echo '<p class="control_ruta_fichero">El fichero "pass.txt" existe y está abierto en modo añadir ("r").</p><br />';
$verificacion = false; // Declaramos la variable $verificacion como false por defecto
while (!feof($id_puntero)) {
$linea = fgets($id_puntero);
$array = explode(";",trim($linea)); // Convertimos cada línea en un array cuyos componentes son los elementos seccionados por la función explode usando el delimitador ";" trim elimina los espacios en blanco de principio y final de la línea.
if (@$array[3]==$nick && @$array[4]==$pwd) { // Introduje el operador de control de errores (@) para omitir los undefined porque el código funcionaba correctamente pero me notificaba array con valores indefinidos).
$verificacion = true;
break;
}
}
if ($verificacion) {
echo '<br /><p class="control_ruta_fichero">Bienvenido.</p>'; // Si $verificacion es true
}
else {
echo '<br /><p class="control_ruta_fichero">Imposible acceder. Usuario o contraseña incorrectos. Revisa los datos introducidos e inténtalo de nuevo.</p>'; // Si $verificacion es false
}
fclose($id_puntero);
} // Llave de cierre del if con isset nick...
else {
echo '<br /><p class="control_ruta_fichero">Los campos del formulario están vacíos. Introduce tu usuario y contraseña.</p>';
}
?>
P. S. El Log in funciona perfectamente, es decir, encuentra al usuario si existe y notifica si no es así. Pero, como decía, el problema está en que si pulso el botón sin escribir nada en los campos nickname y pass, da por válido el login.
¿Qué debo modificar para que esto no suceda?
Un saludo y gracias por vuestra atención.