Categoría: Aplicaciones Web con PHP

  • [Reto] – Miniaplicación web con PHP, MySQLi y JavaScript (Sin POO)

    [Reto] – Miniaplicación web con PHP, MySQLi y JavaScript (Sin POO)

    Importante
    Esta práctica está pensada para comprobar que el alumno tiene una base real en desarrollo web con PHP.
    No se busca una aplicación compleja. Se busca una aplicación simple, funcional, bien organizada y bien explicada.


    ¿Qué vais a hacer?

    En esta práctica vais a desarrollar una pequeña aplicación web con:

    • una portada
    • una página con formulario
    • una página de listado
    • una base de datos MySQL
    • conexión con PHP usando mysqli
    • validación del formulario con JavaScript

    Además del código, tendréis que entregar una documentación paso a paso explicando todo el proceso.


    Objetivo de la práctica

    El objetivo es construir una miniaplicación que permita registrar alumnos en una base de datos.

    Cada registro deberá incluir como mínimo:

    • nombre
    • apellidos
    • email
    • curso
    • edad

    La aplicación deberá permitir:

    1. entrar en una portada,
    2. acceder a un formulario,
    3. validar los datos antes de enviarlos,
    4. guardar esos datos en MySQL,
    5. mostrar un listado con todos los registros guardados.

    Qué debe tener la aplicación

    Parte obligatoria

    La aplicación debe incluir obligatoriamente:

    • una portada (index.php)
    • una página con formulario (formulario.php)
    • una página que procese el guardado (guardar.php)
    • una página de listado (listar.php)
    • una conexión a base de datos (conexion.php)
    • una validación con JavaScript (script.js)
    • una base de datos MySQL con una tabla
    • un archivo SQL con la creación de la base de datos y la tabla

    Mejoras opcionales

    Se valorará positivamente si añadís:

    • programación orientada a objetos
    • validación también en PHP
    • sesiones
    • login con contraseña
    • uso de password_hash()
    • consultas preparadas
    • edición de registros
    • borrado de registros
    • mejor diseño con CSS

    Guía paso a paso


    Paso 1. Crear la carpeta del proyecto

    Cread una carpeta para guardar todos los archivos de la práctica.

    Estructura recomendada

    practica_php_recuperacion/

    ├── index.php
    ├── formulario.php
    ├── guardar.php
    ├── listar.php
    ├── conexion.php
    ├── script.js
    ├── estilos.css
    ├── bbdd.sql
    └── README.md

    Importante
    Aunque el proyecto sea pequeño, debéis mantener una estructura clara.
    Un proyecto desordenado suele dar problemas y también dificulta explicar el trabajo.


    Paso 2. Crear la base de datos

    Antes de empezar con PHP, debéis crear la base de datos y la tabla donde se guardarán los datos.

    Script SQL de ejemplo

    CREATE DATABASE practica_php;
    USE practica_php;CREATE TABLE alumnos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(50) NOT NULL,
    apellidos VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL,
    curso VARCHAR(50) NOT NULL,
    edad INT NOT NULL
    );

    Qué hace este script

    • crea una base de datos llamada practica_php
    • selecciona esa base de datos
    • crea una tabla llamada alumnos
    • define un campo id autoincremental
    • añade los campos del formulario

    Qué debéis hacer vosotros

    • ejecutar el script
    • comprobar que la base de datos existe
    • comprobar que la tabla se ha creado correctamente
    • hacer una captura de pantalla

    Ejemplo de explicación para la entrega

    Primero he creado una base de datos llamada practica_php. Después he creado una tabla llamada alumnos, que servirá para almacenar los datos enviados desde el formulario. La tabla tiene un campo id como clave primaria y varios campos de texto y numéricos para guardar la información.


    Paso 3. Crear la portada

    La portada será la página inicial de la aplicación.

    Debe incluir

    • un título
    • una breve descripción
    • un enlace al formulario
    • un enlace al listado

    Ejemplo de index.php

    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Miniaplicación PHP</title>
        <link rel="stylesheet" href="estilos.css">
    </head>
    <body>
        <h1>Miniaplicación de registro de alumnos</h1>
        <p>Esta aplicación permite guardar alumnos en una base de datos y mostrar su listado.</p>
    
        <ul>
            <li><a href="formulario.php">Ir al formulario</a></li>
            <li><a href="listar.php">Ver listado</a></li>
        </ul>
    </body>
    </html>

    Qué debéis comprobar

    • la página carga sin errores
    • los enlaces funcionan
    • el texto se ve correctamente

    Ejemplo de explicación para la entrega

    He creado una portada en el archivo index.php para que la aplicación tenga una página inicial. En ella he añadido un título, una descripción breve y dos enlaces: uno al formulario y otro al listado.


    Paso 4. Crear el formulario

    Ahora debéis crear la página que permitirá introducir los datos.

    Campos obligatorios

    El formulario debe incluir como mínimo:

    • nombre
    • apellidos
    • email
    • curso
    • edad

    Ejemplo de formulario.php

    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Formulario de alumnos</title>
        <link rel="stylesheet" href="estilos.css">
        <script src="script.js" defer></script>
    </head>
    <body>
        <h1>Formulario de alumnos</h1>
    
        <form action="guardar.php" method="post" id="formAlumno">
            <label for="nombre">Nombre:</label>
            <input type="text" name="nombre" id="nombre">
    
            <label for="apellidos">Apellidos:</label>
            <input type="text" name="apellidos" id="apellidos">
    
            <label for="email">Email:</label>
            <input type="text" name="email" id="email">
    
            <label for="curso">Curso:</label>
            <input type="text" name="curso" id="curso">
    
            <label for="edad">Edad:</label>
            <input type="number" name="edad" id="edad">
    
            <button type="submit">Guardar</button>
        </form>
    
        <p><a href="index.php">Volver a la portada</a></p>
    </body>
    </html>

    Fijaos en esto

    • action="guardar.php" indica a qué archivo se enviarán los datos
    • method="post" indica que los datos viajarán mediante POST
    • cada campo tiene name e id
    • el formulario tiene un id para poder validarlo con JavaScript

    Importante
    Si un name está mal escrito, PHP no recibirá bien ese dato.
    Este es uno de los errores más comunes en este tipo de práctica.

    Ejemplo de explicación para la entrega

    En el archivo formulario.php he creado un formulario HTML con cinco campos. He usado el método POST para enviar los datos al archivo guardar.php, que será el encargado de procesarlos en PHP.


    Paso 5. Validar el formulario con JavaScript

    Antes de guardar los datos, debéis comprobar en el navegador que lo que el usuario ha escrito tiene sentido.

    Debéis validar al menos

    • que no haya campos vacíos
    • que el email tenga formato válido
    • que la edad sea correcta

    Ejemplo de script.js

    document.addEventListener("DOMContentLoaded", function () {
        const formulario = document.getElementById("formAlumno");
    
        formulario.addEventListener("submit", function (e) {
            const nombre = document.getElementById("nombre").value.trim();
            const apellidos = document.getElementById("apellidos").value.trim();
            const email = document.getElementById("email").value.trim();
            const curso = document.getElementById("curso").value.trim();
            const edad = document.getElementById("edad").value.trim();
    
            if (nombre === "" || apellidos === "" || email === "" || curso === "" || edad === "") {
                alert("Todos los campos son obligatorios.");
                e.preventDefault();
                return;
            }
    
            const patronEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
            if (!patronEmail.test(email)) {
                alert("El email no tiene un formato válido.");
                e.preventDefault();
                return;
            }
    
            if (isNaN(edad) || edad < 1 || edad > 120) {
                alert("La edad no es válida.");
                e.preventDefault();
            }
        });
    });

    Qué debéis probar

    • dejar todos los campos vacíos
    • escribir un email incorrecto
    • escribir una edad no válida
    • rellenar todo correctamente

    Ejemplo de explicación para la entrega

    He creado un archivo script.js para validar el formulario antes del envío. Primero compruebo que no haya campos vacíos. Después reviso el formato del email mediante una expresión regular y, por último, valido que la edad sea numérica y esté en un rango lógico.

    Importante
    La validación en JavaScript mejora la experiencia del usuario, pero no sustituye a la validación en servidor.
    Como mejora opcional, podéis validar también en PHP.


    Paso 6. Crear la conexión a la base de datos

    Ahora debéis preparar el archivo que conectará PHP con MySQL.

    Ejemplo de conexion.php

    <?php
    $servidor = "localhost";
    $usuario = "root";
    $contrasena = "";
    $basedatos = "practica_php";
    
    $conexion = new mysqli($servidor, $usuario, $contrasena, $basedatos);
    
    if ($conexion->connect_error) {
        die("Error de conexión: " . $conexion->connect_error);
    }
    ?>

    Qué debéis comprobar

    • el archivo conecta correctamente
    • la base de datos indicada existe
    • no hay errores de usuario, contraseña o nombre de base de datos

    Ejemplo de explicación para la entrega

    En conexion.php he definido las variables necesarias para conectarme a MySQL: servidor, usuario, contraseña y nombre de la base de datos. Después he usado new mysqli(...) para abrir la conexión y he añadido una comprobación para detectar errores.


    Paso 7. Guardar los datos enviados

    Aquí debéis recoger los datos del formulario y guardarlos en la tabla.

    Ejemplo de guardar.php

    <?php
    include("conexion.php");
    
    $nombre = $_POST["nombre"];
    $apellidos = $_POST["apellidos"];
    $email = $_POST["email"];
    $curso = $_POST["curso"];
    $edad = $_POST["edad"];
    
    $sql = "INSERT INTO alumnos (nombre, apellidos, email, curso, edad)
    VALUES ('$nombre', '$apellidos', '$email', '$curso', '$edad')";
    
    if ($conexion->query($sql) === TRUE) {
        echo "<h1>Registro guardado correctamente</h1>";
        echo "<p><a href='formulario.php'>Volver al formulario</a></p>";
        echo "<p><a href='listar.php'>Ver listado</a></p>";
    } else {
        echo "Error: " . $conexion->error;
    }
    
    $conexion->close();
    ?>

    Qué debéis entender aquí

    • $_POST recoge los datos enviados por el formulario
    • INSERT INTO añade una fila nueva a la tabla
    • query() ejecuta la consulta SQL
    • si todo va bien, se muestra un mensaje de éxito

    Ejemplo de explicación para la entrega

    En guardar.php he recogido los valores enviados desde el formulario con $_POST. Después he creado una consulta INSERT para guardar esos datos en la tabla alumnos. Finalmente he ejecutado la consulta y he mostrado un mensaje de éxito si el guardado se ha realizado correctamente.

    Importante
    Este ejemplo está hecho de forma simple para trabajar los fundamentos.
    Como mejora opcional, se valorará el uso de consultas preparadas.


    Paso 8. Mostrar el listado de registros

    Ahora debéis recuperar los datos de la tabla y mostrarlos en pantalla.

    Ejemplo de listar.php

    <?php
    include("conexion.php");
    
    $sql = "SELECT * FROM alumnos";
    $resultado = $conexion->query($sql);
    ?>
    
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Listado de alumnos</title>
        <link rel="stylesheet" href="estilos.css">
    </head>
    <body>
        <h1>Listado de alumnos</h1>
    
        <table border="1">
            <tr>
                <th>ID</th>
                <th>Nombre</th>
                <th>Apellidos</th>
                <th>Email</th>
                <th>Curso</th>
                <th>Edad</th>
            </tr>
    
            <?php while($fila = $resultado->fetch_assoc()) { ?>
                <tr>
                    <td><?php echo $fila["id"]; ?></td>
                    <td><?php echo $fila["nombre"]; ?></td>
                    <td><?php echo $fila["apellidos"]; ?></td>
                    <td><?php echo $fila["email"]; ?></td>
                    <td><?php echo $fila["curso"]; ?></td>
                    <td><?php echo $fila["edad"]; ?></td>
                </tr>
            <?php } ?>
        </table>
    
        <p><a href="index.php">Volver a la portada</a></p>
    </body>
    </html>
    
    <?php
    $conexion->close();
    ?>

    Qué debéis entender aquí

    • SELECT * FROM alumnos recupera todos los registros
    • query() ejecuta la consulta
    • fetch_assoc() devuelve una fila asociativa
    • el while recorre todas las filas

    Ejemplo de explicación para la entrega

    En listar.php he realizado una consulta SELECT para obtener todos los registros de la tabla alumnos. Después he usado un bucle while junto con fetch_assoc() para recorrer el resultado y mostrar cada alumno dentro de una tabla HTML.


    Paso 9. Añadir un estilo básico

    La parte visual no es lo principal, pero sí conviene que la aplicación tenga una presentación limpia.

    Ejemplo de estilos.css

    body {
        font-family: Arial, sans-serif;
        margin: 30px;
        background-color: #f4f4f4;
    }
    
    h1 {
        color: #333;
    }
    
    form {
        background: white;
        padding: 20px;
        width: 350px;
        border: 1px solid #ccc;
    }
    
    label {
        display: block;
        margin-top: 10px;
    }
    
    input {
        width: 100%;
        padding: 8px;
        margin-top: 5px;
    }
    
    button {
        margin-top: 15px;
        padding: 10px 15px;
    }

    Ejemplo de explicación para la entrega

    He creado un archivo estilos.css para dar una presentación básica al proyecto. He aplicado una tipografía sencilla, un fondo claro y un estilo mínimo al formulario y a los campos de entrada.


    Comprobaciones finales

    Antes de entregar, revisad todo esto:

    • la portada carga correctamente
    • el formulario se muestra bien
    • la validación bloquea errores
    • los datos correctos se guardan
    • el listado muestra los registros
    • no hay enlaces rotos
    • la base de datos coincide con el código PHP

    Qué debéis entregar

    Debéis entregar un archivo comprimido .zip con esta estructura:

    apellido_nombre_recuperacion_php.zip

    ├── proyecto/
    │ ├── index.php
    │ ├── formulario.php
    │ ├── guardar.php
    │ ├── listar.php
    │ ├── conexion.php
    │ ├── script.js
    │ ├── estilos.css
    │ └── bbdd.sql

    └── documentacion/
    └── memoria_practica.pdf

    Tabla de evaluación

    ApartadoQué se valora
    Estructura del proyectoQue los archivos estén organizados y tengan sentido
    PortadaQue exista, funcione y permita navegar
    FormularioQue tenga los campos pedidos y funcione
    Validación JSQue detecte errores básicos correctamente
    Conexión con MySQLQue use mysqli y funcione
    Inserción de datosQue los datos se guarden correctamente
    ListadoQue se muestren todos los registros
    Claridad del códigoQue el código sea simple, comprensible y ordenado
    DocumentaciónQue explique el proceso paso a paso
    Mejoras opcionalesPOO, sesiones, seguridad, edición, borrado, etc.

    Plantilla completa de memoria para rellenar

    A continuación tenéis una plantilla orientativa. Podéis seguir esta estructura para redactar vuestra memoria.


    1. Portada

    Título de la práctica:
    Miniaplicación web con PHP, MySQLi y JavaScript

    Nombre y apellidos del alumno:
    [Escribir aquí]

    Módulo:
    [Escribir aquí]

    Fecha:
    [Escribir aquí]


    2. Objetivo de la práctica

    Ejemplo de redacción

    El objetivo de esta práctica ha sido desarrollar una miniaplicación web en PHP conectada a una base de datos MySQL. La aplicación permite introducir datos de alumnos mediante un formulario, validarlos con JavaScript, guardarlos en la base de datos y mostrar posteriormente el listado de registros almacenados.


    3. Descripción general del proyecto

    Explicad qué archivos habéis creado y para qué sirve cada uno.

    Ejemplo de redacción

    El proyecto está compuesto por varios archivos. index.php actúa como portada. formulario.php contiene el formulario de entrada de datos. guardar.php procesa la información enviada y la guarda en la base de datos. listar.php muestra los registros. conexion.php establece la conexión con MySQL. script.js valida el formulario y estilos.css da formato básico a la aplicación.


    4. Desarrollo paso a paso

    4.1 Creación de la base de datos

    Explicad:

    • el nombre de la base de datos
    • el nombre de la tabla
    • los campos creados
    • el script SQL utilizado

    Ejemplo

    Primero he creado una base de datos llamada practica_php. Después he creado una tabla llamada alumnos con un campo id autoincremental y cinco campos adicionales para almacenar nombre, apellidos, email, curso y edad.


    4.2 Creación de la portada

    Explicad:

    • qué contiene
    • por qué la habéis diseñado así
    • qué enlaces tiene

    Ejemplo

    He creado una página principal llamada index.php para que el usuario tenga un punto de entrada a la aplicación. En esta página he colocado un título, una breve descripción y enlaces al formulario y al listado.


    4.3 Creación del formulario

    Explicad:

    • qué campos tiene
    • qué tipo de datos se introducen
    • por qué habéis usado POST

    Ejemplo

    En formulario.php he añadido cinco campos: nombre, apellidos, email, curso y edad. He usado el método POST porque permite enviar los datos al servidor sin mostrarlos en la URL.


    4.4 Validación con JavaScript

    Explicad:

    • qué validaciones habéis hecho
    • qué errores queríais evitar

    Ejemplo

    He validado que los campos no estén vacíos, que el email tenga un formato correcto y que la edad sea un número válido. De este modo evito que lleguen a PHP datos claramente incorrectos.


    4.5 Conexión con la base de datos

    Explicad:

    • cómo funciona mysqli
    • qué datos necesita la conexión
    • cómo comprobáis errores

    Ejemplo

    Para conectar PHP con MySQL he usado mysqli. He indicado el servidor, el usuario, la contraseña y el nombre de la base de datos. Después he comprobado si la conexión producía algún error.


    4.6 Guardado de datos

    Explicad:

    • cómo llegan los datos a PHP
    • qué hace $_POST
    • qué consulta SQL habéis usado

    Ejemplo

    En guardar.php he recogido los datos enviados por el formulario con $_POST. Después he creado una consulta INSERT para guardar la información en la tabla alumnos.


    4.7 Listado de registros

    Explicad:

    • qué consulta habéis hecho
    • cómo se recorre el resultado
    • cómo se muestra en HTML

    Ejemplo

    En listar.php he usado una consulta SELECT * FROM alumnos para obtener todos los registros. Después he recorrido el resultado con fetch_assoc() dentro de un bucle while para mostrar cada alumno en una tabla HTML.


    5. Capturas de pantalla

    Debéis incluir capturas de:

    • base de datos creada
    • formulario en pantalla
    • error de validación
    • inserción correcta
    • listado funcionando

    Ejemplo de cómo presentarlo

    Captura 1. Creación de la base de datos
    [Insertar captura]

    Captura 2. Formulario visible
    [Insertar captura]

    Captura 3. Validación de campos vacíos
    [Insertar captura]

    Captura 4. Registro guardado correctamente
    [Insertar captura]

    Captura 5. Listado de alumnos
    [Insertar captura]


    6. Pruebas realizadas

    Aquí debéis explicar las pruebas que habéis hecho.

    Ejemplo de redacción

    He realizado varias pruebas para comprobar el funcionamiento de la aplicación.
    Primero he intentado enviar el formulario dejando campos vacíos, y la validación ha impedido el envío.
    Después he escrito un email incorrecto y también se ha bloqueado el formulario.
    Más tarde he introducido todos los datos correctamente y el registro se ha guardado en la base de datos.
    Finalmente he accedido a la página de listado y he comprobado que el alumno aparecía correctamente.


    7. Problemas encontrados y soluciones

    Esta parte es muy importante. No pongáis solo “ninguno” salvo que sea verdad de forma muy clara.

    Ejemplo 1

    Uno de los errores que encontré fue que PHP no recibía correctamente el valor del email. Revisando el formulario vi que el atributo name del campo no coincidía con la clave usada en $_POST. Después de corregirlo, el dato llegó correctamente.

    Ejemplo 2

    Al principio no se mostraban los registros en la tabla. El problema era que el nombre de la base de datos en conexion.php no coincidía con el creado en MySQL. Lo corregí y el listado empezó a funcionar.


    8. Conclusión personal

    Explicad qué habéis aprendido y qué os ha costado más.

    Ejemplo de redacción

    Con esta práctica he aprendido mejor cómo se conecta una aplicación PHP con una base de datos MySQL y cómo se relacionan el formulario, $_POST, el INSERT y el SELECT. La parte que más me costó fue comprender el flujo completo de datos desde el formulario hasta el listado, pero después de hacer varias pruebas lo entendí mejor.


    Recomendaciones finales

    Importante
    No intentéis hacer una aplicación enorme sin dominar primero lo básico.
    Es preferible una práctica sencilla, clara, funcionando bien y bien explicada, que una práctica más grande pero confusa.

    Orden recomendado de trabajo

    1. crear la base de datos
    2. hacer la portada
    3. hacer el formulario
    4. validar con JavaScript
    5. crear la conexión
    6. guardar los datos
    7. mostrar el listado
    8. hacer capturas
    9. redactar la memoria

    Mejoras opcionales para subir nota

    Si termináis la parte obligatoria, podéis añadir:

    • validación en servidor
    • clases en PHP
    • login
    • sesiones
    • consultas preparadas
    • edición de registros
    • borrado de registros
    • diseño visual mejorado

    El objetivo real de esta práctica es que comprendáis el circuito básico de una aplicación web:

    formulario → validación → envío → PHP → SQL → listado

    Ese pequeño mecanismo es la base de muchísimas aplicaciones web. Si domináis esto, ya tenéis una base muy útil para seguir creciendo.

  • App Web Full-Stack (PHP/MySQL + HTML/JS)

    App Web Full-Stack (PHP/MySQL + HTML/JS)

    Desarrollar una aplicación web con frontend (HTML/JS) separado de un backend (PHP en POO + MySQL) expuesto como Web Service (API REST). La app debe incluir sistema de sesión con login y al menos un CRUD completo. El proyecto se versionará en GitHub con un README detallado y aplicará medidas mínimas de seguridad.

    1) Alcance funcional mínimo

    Elige una entidad (ej.: biblioteca, inventario, reservas, incidencias, tareas, alumnos/cursos).
    Debe incluir, como mínimo:

    • 1 entidad principal con CRUD completo: Crear, Leer (lista + detalle), Actualizar, Eliminar.
    • Autenticación de usuarios con login/logout y sesión (no solo “mock”).
    • Autorización básica: acciones protegidas solo para usuarios autenticados.
    • Listado con búsqueda y/o filtrado en el frontend.
    • Validaciones en front y back.

    Sugerencia de entidades: users (para login) + una entidad de negocio como itemscoursesticketsbookings, etc.

    2) Requisitos técnicos

    • Backend
      • Lenguaje: PHP (>=7.4; recomendable 8.x).
      • Estilo: POO (clases para modelos, controladores, servicios/repositorios).
      • Acceso a datos: MySQL con prepared statements (PDO o MySQLi).
      • Rutas tipo REST: /api/... que devuelvan JSON.
      • Gestión de sesión  (PHP session) 
    • Frontend
      • HTML + CSS + JS (vanilla).
      • Consume la API vía fetch.
    • Separación front/back
      • epositorio con carpetas: /frontend y /backend.
    • Base de datos
      • Script db/schema.sql + db/seed.sql (opcional) para poblar datos de prueba.
    • GitHub
      • Uso de commits frecuentes, ramas (opcional) y README completo.
    • Documentación
      • README.md en raíz con: descripción, arquitectura, requisitos, instalación, variables de entorno, comandos, endpoints, roles, capturas/GIF, autores.

    3) Seguridad (mínimos obligatorios)

    • Passwords: almacenar con password_hash() / password_verify().
    • SQL InjectionPDO + prepared statements SIEMPRE.
    • Sesiones:
      • session.cookie_httponly = 1session.cookie_secure = 1 (si HTTPS), SameSite=Lax.
      • Regenerar ID de sesión tras login.
      • Tiempo de inactividad y expiración configurados.
    • Reglas de BD: usuario MySQL con mínimos privilegios (solo la base usada).
    • Errores: no exponer trazas en producción; logs internos.
    • Validación: back valida todo; front valida para UX, pero back es la autoridad
    • Backups: script/nota de backup de la BD (aunque sea manual).

     4) Entregables

    1. URL del repositorio GitHub (público o acceso concedido si privado).
    2. README.md completo.
    3. Script SQL (db/schema.sql + seed.sql opcional).
    4. Capturas o GIF corto del flujo principal (login + CRUD).
    5. Colección de Postman/Thunder Client (opcional, suma).
    6. Checklist de seguridad marcada (ver abajo).

    5) Plantilla de README.md (copiar/pegar)

    # Nombre del Proyecto

    Descripción corta del dominio elegido y objetivo de la app.

    ## Arquitectura
    – Frontend (HTML/JS) en `/frontend` consumiendo API REST JSON.
    – Backend (PHP OOP + MySQL) en `/backend` exponiendo `/api/…`.

    ## Requisitos
    – PHP 8.x, MySQL 5.7/8.x, servidor web (Apache/Nginx), Node (opcional).
    – Copiar `.env.example` a `.env` y completar valores.

    ## Instalación
    1. Clonar repo.
    2. Importar `db/schema.sql` (y `db/seed.sql` opcional).
    3. Configurar VirtualHost/servir `/backend/public` como raíz del back.
    4. Configurar `FRONT_ORIGIN` en `.env` y CORS.
    5. Abrir `/frontend/index.html` (o servir con dev server).

    ## Scripts útiles
    – (Opcional) `composer install`, `php -S localhost:8000 -t backend/public`, etc.

    ## Endpoints (resumen)
    – `POST /api/auth/login` — login (JSON body: email, password)
    – `POST /api/auth/logout` — logout
    – `GET /api/auth/me` — usuario autenticado
    – CRUD entidad principal: `/api/items`…

    ## Seguridad aplicada
    – Hashing, prepared statements, CSRF/SameSite, cabeceras, etc. (Checklist abajo)

    ## Capturas
    (Insertar imágenes o GIF)

    ## Checklist de Seguridad
    – [ ] …