Tarea: Sistema de Frases con Login

Ejercicio de práctica

1. Fichero de usuarios (accesos.txt)

Base de datos en texto plano. Formato usuario:contraseña.

usuario1:123456
usuario2:123456

2. Formulario de Acceso (login.php)

Script que muestra el formulario y gestiona los mensajes de error visuales.

<?php
if(isset($_GET['error']) && $_GET['error'] == "1"){
    echo "No se ha podido iniciar sesión, inténtelo de nuevo";
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulario</title>
</head>
<body>
    <form action="chequear_login.php" method="POST">
        <label for="usuario">Usuario:</label><br>
        <input type="text" name="usuario"><br>
        <label for="password">Contraseña:</label><br>
        <input type="password" name="password">
        <button type="submit">Enviar</button>
    </form>
</body>
</html>

3. Lógica de Autenticación (chequear_login.php)

Verifica las credenciales y crea la sesión si los datos son correctos.

<?php
session_start();
$usuario = $_POST['usuario'];
$password = $_POST['password'];
$fichero = "accesos.txt";
$login_exitoso = false;

if (file_exists($fichero)) {
    // Leemos el archivo quitando saltos de lineas y lineas vacías
    $lineas = file($fichero, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    foreach ($lineas as $linea) {
        list($u, $p) = explode(":", $linea);
        if($u == $usuario && $p == $password){
            $login_exitoso = true;
            break;
        }
    }
}
if($login_exitoso){
    $_SESSION['usuario'] = $usuario;
    header("location: frases.php");
    exit();
}else{
    header("location:login.php?error=1");
}
}else{
    echo "Error: no se encuentra el archivo de usuarios";
}
?>

4. Gestión de Frases (frases.php)

Este archivo contiene tanto la lógica de manejo de ficheros como la vista HTML para el usuario.

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
session_start();
//SI no hay usuario logueado, lo mandamos fuera
if (!isset($_SESSION['usuario'])) {
    header("location: login.php");
    exit();
}

//Se define el fichero según el usuario:
$fichero_usuario = "frases_" . $_SESSION['usuario'] . ".txt";

//SI no existe el fichero lo creamos vacío

if (!file_exists($fichero_usuario)) {
    touch($fichero_usuario);
}
//Añadir la frase

if ($_POST && !empty($_POST['nueva_frase'])) {
    //abrimos el fichero en modo append
    //Ponemos el cursor al final para no borrar lo anterior
    $archivo = fopen($fichero_usuario, "a");
    //escribimos la frase y un salto de línea
    fwrite($archivo, $_POST['nueva_frase'] . PHP_EOL);
    //cerramos el archivo
    fclose($archivo);
}

//Leemos las frases para mostrarlas en la lista
$lista_frases = file($fichero_usuario, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
?>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mis frases</title>
</head>

<body>
    <h1>Bienvenido, <?php echo $_SESSION['usuario'] ?></h1>
    <h3>Tus frases:</h3>
    <ul>
        <?php
        //recorremos el array y pintamos cada frase
        foreach ($lista_frases as $frase) {
            echo "<li>" . htmlspecialchars($frase) . "</li>";
        }
        ?>
    </ul>
    <hr>

    <form action="frases.php" method="POST">
        <label for="nueva_frase">Nueva Frase:</label>
        <input type="text" name="nueva_frase">
        <button type="submit">Guardar</button>
    </form>
    <br>
    <a href="logout.php">Cerrar sesión</a>
</body>

</html>