Easier to read with cream paper, a tint, more contrast or larger text? Choose your colours and text, once, for every page.

Vista previa

Mini proyecto: libro de visitas

Esta es la primera página de la lección. Léela y prueba las actividades. El resto está en el curso completo.

45 minutos

Tu primera web con memoria

El torneo del instituto ha terminado. Quieres que la gente deje un mensaje en una página, y que los mensajes sigan ahí mañana.

Eso es un libro de visitas. Tiene formulario, base de datos y una lista.

Ya sabes hacer cada trozo. Hoy los juntas.

Palabras clave

PalabraQué significaEjemplo
Libro de visitasUna página donde cada visitante deja un mensaje que se guarda.index.php
EntradaUn mensaje del libro. Es una fila de la tabla.Ana: Gran torneo
RedirecciónDecir al navegador que vaya a otra página, con la cabecera Location.header("Location: index.php")
Servidor de pruebasUn servidor pequeño en tu ordenador para probar tu página antes de publicarla.php -S localhost:8000
Plan de pruebasUna lista de casos que vas a probar y lo que esperas ver.Nombre vacío: error

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Pruébalo: las últimas entradas

Código: sql
-- Las tres entradas más nuevas: el id mayor va primero.
SELECT name, message FROM guestbook ORDER BY id DESC LIMIT 3;

-- Cambia el 3 por un 2 y ejecuta otra vez.

Ejemplo resuelto: qué lección usa cada trozo

Trozo del proyectoLo aprendiste enLo que usas
Recibir el formularioRecibir un formulario$_POST con ??
Comprobar los datosNo te fíes del usuariotrim y strlen
Guardar la entradaConsultas segurasprepare y execute
Leer las entradasPHP y base de datosquery y fetchAll
Escribirlas en la páginaRecibir un formulariohtmlspecialchars

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Primera parte: guardar

Código: php
<?php
// index.php, primera parte: guardar una entrada nueva.
require "db.php";         // crea la conexión $pdo
require "functions.php";  // trae validateEntry

$errors = [];
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $name = trim($_POST["name"] ?? "");
    $message = trim($_POST["message"] ?? "");
    $errors = validateEntry($name, $message);

    if (count($errors) === 0) {
        $sql = "INSERT INTO guestbook (name, message) VALUES (?, ?)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$name, $message]);
        header("Location: index.php");  // evita que recargar repita el envío
        exit;
    }
}

Pruébalo: validar y escapar

Código: php
<?php
// Las dos funciones que no necesitan base de datos.
function validateEntry(string $name, string $message): array {
    $errors = [];
    if (trim($name) === "") {
        $errors[] = "Escribe tu nombre.";
    }
    if (trim($message) === "") {
        $errors[] = "Escribe un mensaje.";
    } elseif (strlen(trim($message)) > 500) {
        $errors[] = "El mensaje es demasiado largo.";
    }
    return $errors;
}

function renderEntry(string $name, string $message): string {
    return "<p><strong>" . htmlspecialchars($name) . "</strong>: " . htmlspecialchars($message) . "</p>";
}

echo count(validateEntry("Ana", "Qué bien lo pasamos")) . " errores\n";
echo renderEntry("Ana", "<b>Hola</b>") . "\n";
echo implode(" ", validateEntry("  ", "")) . "\n";

Repaso rápido: guardar una entrada

Inténtalo

Repaso rápido: guardar una entrada

3 preguntas
Pruébalo: tus respuestas se corrigen aquí y después se olvidan. Inicia sesión si quieres que se guarde tu puntuación y continuar donde lo dejaste.Iniciar sesión para guardar tu puntuación

Tus respuestas se corrigen aquí y no se guardan. Una cuenta guarda tus resultados.

Por qué se redirige tras guardar

Si tras guardar escribes la página sin más, el navegador recuerda el envío. Si la recargas, lo repite.

Y la entrada se guarda dos veces.

Con header("Location: ...") y exit, el navegador pide la página de nuevo, sin datos. Recargar ya no repite nada.

La lección continúa

10 partes más de esta lección están en el curso completo, con los ejercicios y la comprobación final. Una cuenta te da todo.