ADSO · 2025 Manual de Tecnologías para Proyectos Full-Stack Teoría guiada — no resuelve el proyecto, te da las herramientas
01 · Estructura
HTML — el esqueleto de la página
HTML (HyperText Markup Language) no es un lenguaje de programación: es un lenguaje de marcado. Su trabajo es decir qué elementos existen en la página (un título, una tabla, un botón, un campo de texto) y cómo se organizan entre sí. No calcula nada, no decide nada — solo estructura.
01.1
¿Para qué sirve en tu proyecto?

En cualquiera de los 9 proyectos, HTML es la capa que el usuario ve y toca primero: el formulario donde escribe un dato, la tabla donde aparece la lista de resultados, el botón que dispara la acción. Todo lo que JS y PHP hacen "detrás" necesita un lugar en HTML donde mostrarse.

Piensa en HTML como los cajones vacíos de un mueble: tú defines cuántos cajones hay y de qué tamaño, pero lo que se guarda dentro (los datos) lo pone JS o PHP después.

01.2
Anatomía de un documento HTML
Todo documento HTML sigue la misma estructura base. Aquí está explicada línea por línea:
ejemplo · estructura-base.html9 líneas
1<!DOCTYPE html>
Le dice al navegador: "esto es HTML5". Siempre va en la primera línea, sin excepción.
2<html lang="es">
<html> envuelve todo el documento. lang="es" indica el idioma (ayuda a lectores de pantalla y buscadores).
3<head>
Zona de metadatos: cosas que el navegador necesita saber pero que el usuario no ve directamente (título de pestaña, enlaces a CSS, charset).
4  <meta charset="UTF-8">
Define la codificación de caracteres. Sin esto, las tildes y la ñ se pueden ver rotas.
5  <title>Mi Proyecto</title>
Texto que aparece en la pestaña del navegador. No es visible dentro de la página.
6</head>
Cierra la zona de metadatos.
7<body>
Aquí va todo lo visible: textos, formularios, tablas, botones, imágenes. Lo que el usuario realmente ve.
8  <h1>Hola</h1>
<h1> es un encabezado de nivel 1 (el más grande/importante). Existen h1 a h6.
9</body></html>
Se cierran body y html en orden inverso a como se abrieron.
Regla de oro: toda etiqueta que se abre (<tag>) se debe cerrar (</tag>), excepto las "vacías" como <input>, <img>, <br>.
01.3
Formularios — la pieza que más vas a usar
Casi todos los 9 proyectos necesitan que el usuario ingrese datos (una tarea, una nota, un gasto). Eso se hace con <form>.
ejemplo · formulario-generico.html5 líneas
1<form action="procesar.php" method="POST">
action = a qué archivo se envían los datos. method="POST" = los datos viajan ocultos en el cuerpo de la petición (no en la URL como GET).
2  <label for="nombre">Nombre</label>
<label> es el texto descriptivo del campo. for lo conecta con el id del input (mejora accesibilidad: al hacer clic en el texto, se enfoca el campo).
3  <input type="text" id="nombre" name="nombre" required>
type define el tipo de campo. name es la clave con la que PHP/JS van a leer ese valor ($_POST['nombre']). required obliga a llenarlo antes de enviar.
4  <button type="submit">Enviar</button>
type="submit" hace que al hacer clic se envíe todo el formulario al action indicado arriba.
5</form>
Cierra el formulario. Todo lo que esté entre <form> y </form> viaja junto al enviarse.
Importante: el atributo name es el que importa para recuperar datos en el backend — no el id. Es un error común confundirlos.
01.4
Tipos de input más útiles para tus proyectos
SintaxisPara qué sirveEjemplo de uso en tus proyectos
<input type="text">Texto libre cortoNombre de tarea, nombre de contacto
<input type="number">Solo números, con flechas +/-Nota de estudiante, cantidad de producto
<input type="email">Valida formato de correo automáticamenteCorreo en agenda de contactos
<input type="checkbox">Sí/No, marcado o no marcadoTarea completada, presente/ausente
<select><option>Lista desplegable de opciones fijasElegir candidato a votar, elegir categoría
<textarea>Texto libre largo, varias líneasDescripción de producto
<table><tr><td>Mostrar datos en filas y columnasListar todos los registros guardados
01.5
Checklist antes de pasar a JS/PHP
  • ¿Cada input tiene name? Sin name, ese dato no llega al servidor.
  • ¿El form tiene action y method? Si no los pones, se autoenvía a la misma página con GET.
  • ¿Hay un id único por elemento que JS necesite tocar? JS busca elementos por id, no por name.
  • ¿La tabla de resultados ya existe vacía en el HTML? JS o PHP la van a llenar después con datos reales.
02 · Comportamiento
JavaScript — la lógica que corre en el navegador
JavaScript (JS) es el lenguaje que hace que la página reaccione sin tener que recargarse: validar un campo antes de enviarlo, calcular un total al instante, mostrar u ocultar algo, recorrer una lista y pintarla en pantalla. Corre en el navegador del usuario, no en el servidor.
02.1
¿Para qué sirve en tu proyecto?

JS es ideal para todo lo que debe sentirse inmediato: validar que un campo de nota esté entre 0 y 5 antes de enviarlo, sumar el total del carrito mientras el usuario agrega productos, recorrer un array y construir filas de tabla dinámicamente.

Diferencia clave con PHP: si cierras el navegador, todo lo que hizo JS se pierde. JS no guarda nada de forma permanente por sí solo — para eso existe PHP + base de datos.

02.2
Variables y tipos de datos
ejemplo · variables.js5 líneas
1let nombre = "Ana";
let declara una variable que puede cambiar de valor después. "Ana" es un string (texto), siempre entre comillas.
2const IVA = 0.19;
const declara una variable constante — su valor nunca cambia. Se usa para valores fijos como tasas o límites.
3let edad = 20;
number: números enteros o decimales, sin comillas.
4let activo = true;
boolean: solo puede ser true o false. Ideal para "completado / no completado", "presente / ausente".
5let tareas = ["Lavar", "Estudiar"];
array: una lista ordenada de valores entre corchetes [], separados por comas. Vas a usarlo en los 9 proyectos.
02.3
Seleccionar y modificar el HTML (DOM)
El DOM (Document Object Model) es la representación en memoria de tu HTML que JS puede leer y modificar. Así conectas JS con lo que el usuario ve.
ejemplo · dom-basico.js4 líneas
1const input = document.getElementById("nombre");
document es la página completa. getElementById busca el elemento HTML cuyo id="nombre" y lo guarda en la variable.
2const valor = input.value;
.value obtiene lo que el usuario escribió dentro de ese input.
3const salida = document.getElementById("resultado");
Busca otro elemento, esta vez uno donde vamos a mostrar algo (ej. un <p id="resultado"></p> vacío en el HTML).
4salida.innerHTML = "Hola " + valor;
innerHTML reemplaza el contenido de ese elemento con el texto/código que le asignes. Así "pintas" resultados en pantalla.
02.4
Eventos — reaccionar a clics
ejemplo · evento-click.js4 líneas
1const boton = document.getElementById("btnCalcular");
Se ubica el botón sobre el cual queremos detectar el clic.
2boton.addEventListener("click", function() {
addEventListener = "escucha este tipo de evento". "click" es el evento. La función que sigue se ejecuta cada vez que ocurre el clic.
3  alert("Botón presionado");
Código que se ejecuta en respuesta. Aquí, una ventana emergente simple.
4});
Se cierra la función y los paréntesis de addEventListener.
Tip: también puedes usar onclick="miFuncion()" directamente en el HTML del botón. Es más simple para empezar, aunque addEventListener es más recomendado a mediano plazo.
02.5
Condicionales — tomar decisiones
ejemplo · condicional.js5 líneas
1let nota = 3.2;
Una variable de ejemplo a evaluar.
2if (nota >= 3.0) {
if evalúa una condición. Si es verdadera (true), entra al bloque { }. >= significa "mayor o igual que".
3  console.log("Aprobado");
Se ejecuta solo si la condición de arriba fue verdadera. console.log imprime en la consola del navegador (F12).
4} else {
else = "si la condición de arriba fue falsa, haz esto en su lugar".
5  console.log("Reprobado"); }
Caso alternativo, y se cierra el bloque else.
OperadorSignificado
===Igual a (compara valor Y tipo — siempre prefiere este sobre ==)
!==Diferente de
> / <Mayor que / Menor que
>= / <=Mayor o igual / Menor o igual
&& Y lógico — ambas condiciones deben ser verdaderas
||O lógico — basta con que una sea verdadera
02.6
Bucles — recorrer arrays
Como tus proyectos manejan listas (tareas, gastos, contactos), vas a necesitar recorrerlas para sumar, contar, buscar o mostrar cada elemento.
ejemplo · bucle-for.js5 líneas
1let numeros = [4, 8, 2];
Un array de ejemplo con 3 números.
2let suma = 0;
Variable "acumuladora" que empieza en 0 y va guardando el total mientras recorremos el array.
3for (let i = 0; i < numeros.length; i++) {
i = 0: empieza en la posición 0. i < numeros.length: continúa mientras i sea menor que el tamaño del array. i++: suma 1 a i en cada vuelta.
4  suma = suma + numeros[i];
numeros[i] accede al elemento en la posición i. Se va sumando a la variable acumuladora.
5}
Cierra el bucle. Al terminar, suma contiene el total de los 3 números.
Alternativa moderna: numeros.forEach(n => suma += n) hace lo mismo en una línea, pero entender el for clásico primero te ayuda a entender qué pasa "por debajo".
02.7
Comunicación con PHP: fetch()
Cuando JS necesita enviar o pedir datos al servidor sin recargar la página, se usa fetch(). Esto es opcional para proyectos básicos (un <form> normal también funciona), pero es bueno conocerlo.
ejemplo · fetch-basico.js5 líneas
1fetch("guardar.php", {
fetch hace una petición a otro archivo (aquí, un PHP) sin recargar la página actual.
2  method: "POST",
Indica que se van a enviar datos (no solo pedirlos, como haría GET).
3  body: JSON.stringify({nombre: "Ana"})
JSON.stringify convierte un objeto JS en texto plano (formato JSON) para poder enviarlo.
4})
Cierra el objeto de configuración de la petición.
5 .then(respuesta => console.log(respuesta));
.then() se ejecuta cuando la respuesta del servidor llega. Aquí solo la imprime en consola.
03 · Servidor
PHP — la lógica que corre en el servidor
PHP corre en el servidor, no en el navegador del usuario. Recibe datos (de un formulario, por ejemplo), los procesa, puede guardarlos en una base de datos, y devuelve HTML como resultado. El usuario nunca ve el código PHP — solo el HTML que PHP genera.
03.1
¿Para qué sirve en tu proyecto?

PHP es lo que hace que tus datos sobrevivan después de cerrar el navegador. Si quieres que tu lista de tareas siga existiendo cuando vuelvas a abrir la página, PHP (guardando en un array de sesión o en MySQL) es indispensable.

Flujo típico: el usuario llena un <form> en HTML → lo envía → PHP recibe los datos → los procesa/guarda → PHP responde con HTML actualizado.

03.2
Sintaxis básica y cómo se mezcla con HTML
ejemplo · saludo.php5 líneas
1<?php
Abre un bloque de código PHP. Todo el código PHP debe ir entre <?php y ?>.
2  $nombre = "Ana";
En PHP, todas las variables empiezan con $. No se declara tipo: PHP lo detecta solo.
3?>
Cierra el bloque PHP. A partir de aquí, todo es HTML normal otra vez.
4<h1>Hola <?php echo $nombre; ?></h1>
PHP y HTML pueden mezclarse libremente. echo imprime un valor directamente en el HTML de salida.
5// resultado final enviado al navegador: <h1>Hola Ana</h1>
El navegador nunca ve el código PHP, solo el HTML resultante después de que el servidor lo procesó.
Extensión obligatoria: un archivo con código PHP debe terminar en .php, no en .html — si no, el servidor no lo ejecuta, solo lo muestra como texto.
03.3
Recibir datos de un formulario
Cuando un <form method="POST"> se envía, PHP recibe los valores en la variable superglobal $_POST.
ejemplo · recibir.php4 líneas
1<?php
Abre el bloque PHP.
2if (isset($_POST['nombre'])) {
isset() verifica que ese campo realmente venga en la petición (evita errores si llegan al archivo sin enviar el formulario).
3  $nombre = $_POST['nombre'];
$_POST['nombre'] — el texto 'nombre' debe coincidir exactamente con el name="nombre" del input en el HTML.
4} ?>
Cierra el if y el bloque PHP.
VariableCuándo se usa
$_POSTDatos enviados con method="POST" (lo más usado en tus proyectos)
$_GETDatos enviados por la URL (ej: pagina.php?id=3)
$_SESSIONDatos que persisten mientras el usuario navega (requiere session_start())
03.4
Arrays en PHP
Igual que en JS, en tus proyectos vas a necesitar listas: de tareas, de productos, de notas.
ejemplo · arrays.php5 líneas
1$frutas = ["manzana", "pera", "uva"];
Array indexado: cada elemento tiene una posición numérica empezando en 0.
2echo $frutas[0]; // manzana
Accede al primer elemento con su índice entre corchetes.
3$estudiante = ["nombre" => "Ana", "nota" => 4.5];
Array asociativo: en vez de números, usa claves de texto ("nombre", "nota") — ideal para representar un registro con varios campos.
4echo $estudiante["nombre"]; // Ana
Se accede con la clave de texto en vez de un número.
5foreach ($frutas as $f) { echo $f; }
foreach recorre cada elemento del array sin necesitar un índice manual — es la forma más usada en PHP para listas.
03.5
Conexión a base de datos (MySQLi)
Cuando quieras que los datos persistan de forma real (no solo mientras el navegador está abierto), se conecta PHP a MySQL. Hay dos formas: MySQLi (más simple, específica de MySQL) y PDO (más flexible, funciona con varias bases de datos). Aquí el ejemplo con MySQLi por ser más directo para empezar.
ejemplo · conexion.php6 líneas
1$host = "localhost";
Dirección del servidor de base de datos. "localhost" significa "el mismo servidor donde corre el PHP".
2$usuario = "root"; $clave = "";
Credenciales de acceso a MySQL. En Hostinger normalmente las da el panel de control, no son "root" vacío.
3$bd = "mi_basededatos";
Nombre de la base de datos específica a la que te quieres conectar.
4$conexion = new mysqli($host, $usuario, $clave, $bd);
new mysqli(...) crea la conexión usando los 4 datos anteriores en ese orden exacto.
5if ($conexion->connect_error) {
-> accede a una propiedad/método de un objeto (aquí, el objeto conexión). connect_error contiene el mensaje de error si algo falló.
6  die("Error: " . $conexion->connect_error); }
die() detiene la ejecución y muestra el mensaje. El punto . en PHP concatena texto (equivalente al + de JS para strings).
03.6
Consultas SQL básicas desde PHP
ejemplo · consulta-segura.php4 líneas
1$stmt = $conexion->prepare("INSERT INTO tareas (titulo) VALUES (?)");
prepare() crea una consulta con un placeholder ? en vez de escribir el valor directo — esto previene inyección SQL (un ataque común).
2$stmt->bind_param("s", $titulo);
bind_param conecta el valor real a ese ?. "s" indica el tipo: s=string, i=integer, d=decimal.
3$stmt->execute();
Ejecuta finalmente la consulta contra la base de datos.
4$stmt->close();
Cierra la consulta preparada, liberando recursos del servidor.
Nunca escribas "INSERT INTO tareas VALUES ('" . $titulo . "')" directo con el dato del usuario metido en el texto — eso es inyección SQL, una vulnerabilidad grave. Siempre usa prepare() + bind_param().
03.7
Sintaxis de referencia rápida
strlen($texto)Cuenta cuántos caracteres tiene un string
count($array)Cuenta cuántos elementos tiene un array
array_sum($array)Suma todos los valores numéricos de un array
number_format($n, 2)Formatea un número con 2 decimales y separadores
trim($texto)Elimina espacios en blanco al inicio/final
empty($var)Verdadero si la variable está vacía o no existe
04 · El plus
C# + ASP.NET — la misma lógica, otro lenguaje
C# es el lenguaje de Microsoft, más estricto que PHP/JS (exige declarar tipos). ASP.NET es el framework que permite usar C# para construir páginas web (el equivalente a "PHP para C#"). Aquí verás C# básico en consola y luego cómo se traduce a un formulario web simple.
04.1
¿Para qué sirve este "plus"?

La idea no es que reemplaces tu proyecto PHP — es ver la misma lógica (sumar un array, validar una condición, mostrar resultados) resuelta en un lenguaje tipado. Esto te prepara para Laravel/.NET más adelante y te hace notar qué partes de la lógica son universales (los if, los bucles) y cuáles son específicas de cada lenguaje (la sintaxis).

04.2
C# en consola — sintaxis base
La diferencia más grande frente a PHP/JS: en C# siempre declaras el tipo de cada variable (o usas var para que el compilador lo infiera).
ejemplo · ConsolaBasica.cs9 líneas
1using System;
using importa una librería. System trae funciones básicas como Console.
2class Programa {
En C#, todo el código vive dentro de una class (clase). No existe código "suelto" como en PHP.
3  static void Main() {
Main() es el punto de entrada: lo primero que se ejecuta al correr el programa. void indica que no devuelve ningún valor.
4    string nombre = "Ana";
Se declara el tipo explícitamente: string = texto. A diferencia de JS, esto no puede luego guardar un número.
5    int edad = 20;
int = número entero. Otros tipos comunes: double (decimales), bool (true/false).
6    Console.WriteLine($"Hola {nombre}");
Console.WriteLine imprime en pantalla (equivalente a echo en PHP). El $"..." permite insertar variables directamente con {} — se llama interpolación de strings.
7  }
Cierra el método Main.
8}
Cierra la clase Programa.
04.3
Arrays, listas y bucles en C#
ejemplo · ListaYBucle.cs6 líneas
1List<int> notas = new List<int>{4, 3, 5};
List<int> es una lista que solo puede contener enteros (el tipo va entre <>). Es el equivalente al array de PHP/JS pero con tipo fijo.
2int suma = 0;
Variable acumuladora, igual concepto que en JS.
3foreach (int n in notas) {
foreach recorre cada elemento. Nota: en C# se usa in, mientras en PHP es as — mismo concepto, distinta palabra clave.
4  suma += n;
+= es un atajo para suma = suma + n. También existe en JS y PHP.
5}
Cierra el foreach.
6double promedio = (double)suma / notas.Count;
(double) es un cast: convierte el entero a decimal antes de dividir, para no perder los decimales. .Count es el tamaño de la lista (equivalente a .length en JS).
04.4
De consola a web: ASP.NET (Web Forms / Razor Pages básico)
ASP.NET toma la misma lógica de C# y la conecta con HTML. La forma más simple para empezar es Razor Pages: páginas .cshtml que mezclan HTML con C#, de forma parecida a como PHP mezcla HTML con su propio código.
ejemplo · Saludo.cshtml6 líneas
1@page
@page es obligatorio al inicio: le dice a ASP.NET que este archivo es una página Razor accesible por URL.
2@model SaludoModel
Conecta esta vista con su clase C# asociada (el "code-behind"), donde está la lógica.
3<form method="post">
Un formulario normal de HTML — la sintaxis del formulario en sí no cambia respecto a lo que ya viste en HTML.
4  <input asp-for="Nombre" />
asp-for es un atributo especial de ASP.NET que conecta este input directamente con una propiedad Nombre de la clase C#.
5  <button type="submit">Enviar</button>
Botón normal de envío, igual que en HTML puro.
6</form>
Cierra el formulario.
ejemplo · Saludo.cshtml.cs (code-behind)5 líneas
1public class SaludoModel : PageModel {
La clase hereda de PageModel, lo que le da las capacidades necesarias para responder a peticiones web.
2  [BindProperty]
[BindProperty] es un atributo que conecta automáticamente esta propiedad con el input del formulario que tenga el mismo asp-for.
3  public string Nombre { get; set; }
{ get; set; } convierte esto en una propiedad (se puede leer y escribir desde fuera de la clase).
4  public void OnPost() {
OnPost() se ejecuta automáticamente cuando el formulario se envía con method="post". Es el equivalente al bloque que procesa $_POST en PHP.
5    // aquí ya tienes "Nombre" disponible, listo para usar } }
Dentro de OnPost, la propiedad Nombre ya tiene el valor que el usuario escribió — sin necesidad de leer un array como $_POST manualmente.
Comparación mental con PHP: $_POST['nombre'] en PHP ≈ propiedad con [BindProperty] + asp-for en ASP.NET. La diferencia es que ASP.NET conecta automáticamente el campo con la propiedad, mientras en PHP tú accedes manualmente al array.
04.5
Tabla comparativa rápida: PHP vs C#
ConceptoPHPC#
Variable$nombre = "Ana";string nombre = "Ana";
Imprimirecho $nombre;Console.WriteLine(nombre);
Concatenar texto"Hola " . $nombre$"Hola {nombre}"
Array/Lista$arr = [1,2,3];List<int> arr = new List<int>{1,2,3};
Recorrer listaforeach ($arr as $x)foreach (int x in arr)
Recibir datos de form$_POST['campo'][BindProperty] + asp-for
TipadoDinámico (no se declara tipo)Estático (tipo obligatorio)
05 · El panorama completo
Cómo se conecta todo
Esta es la parte que más cuesta entender al principio: cada tecnología vive en un lugar distinto y se comunican entre sí en un orden específico. Aquí está el mapa completo.
05.1
El recorrido de un dato, paso a paso
Ejemplo genérico: el usuario llena un campo y presiona un botón. Esto es lo que pasa, en orden:
HTML
usuario escribe en el form
JS
valida / calcula en vivo
PHP
recibe y procesa
MySQL
guarda permanente
MySQL
responde con datos
PHP
genera HTML actualizado
HTML
el usuario ve el resultado
Idea clave: HTML y JS corren en el navegador del usuario (cliente). PHP y MySQL corren en el servidor. Por eso PHP puede guardar datos permanentemente y JS no.
Ahora el mismo recorrido, pero con código real. Son 2 archivos genéricos que trabajan juntos: el usuario escribe un nombre y un número, y el HTML+PHP lo guarda en un archivo de texto (en vez de base de datos, para mantenerlo simple) y lo vuelve a mostrar.
archivo 1 de 2 · formulario.html7 líneas
1<form action="guardar.php" method="POST">
El formulario apunta a guardar.php — ese es el archivo que va a recibir estos datos cuando se envíe.
2  <input type="text" name="nombre" id="nombre">
El name="nombre" es la clave que PHP usará para leer este valor. El id es para que JS lo pueda ubicar si hace falta validar algo antes de enviar.
3  <input type="number" name="edad" id="edad">
Segundo campo, esta vez numérico. Mismo principio: name="edad" es la clave que usará PHP.
4  <button type="submit" onclick="return validar()">Guardar</button>
onclick="return validar()" ejecuta una función JS antes de enviar. Si esa función devuelve false, el envío se cancela y nunca llega a PHP.
5</form>
Cierra el formulario. Hasta aquí, todo es HTML puro — nada se ha enviado todavía.
6<script>
Se abre un bloque de JS dentro del mismo archivo HTML — así es como JS y HTML conviven en un solo archivo.
7function validar() { return document.getElementById("edad").value > 0; }</script>
La función que el botón llama: si edad es mayor a 0, devuelve true (se envía el formulario). Si no, false (se bloquea el envío). Aquí termina el trabajo de HTML+JS en este recorrido.
archivo 2 de 2 · guardar.php6 líneas
1<?php
Este archivo es el destino del action="guardar.php" del formulario de arriba. Todo lo que está aquí corre en el servidor, no en el navegador.
2$nombre = $_POST['nombre'];
Aquí "llega" el dato. 'nombre' coincide exactamente con el name="nombre" del input en el HTML — así es como PHP sabe cuál valor leer.
3$edad = $_POST['edad'];
Mismo principio para el segundo campo. Esto ya pasó la validación de JS, pero igual es buena práctica revisar de nuevo en PHP (JS se puede desactivar en el navegador).
4file_put_contents("datos.txt", $nombre . " - " . $edad, FILE_APPEND);
Esto es lo que hace que el dato sobreviva: se escribe en un archivo de texto en el servidor. FILE_APPEND agrega la línea sin borrar lo anterior. (En un proyecto real, esto sería un INSERT a MySQL en vez de un archivo de texto.)
5echo "<h2>Guardado: " . $nombre . "</h2>";
PHP genera HTML nuevo como respuesta. Esto es lo único que el navegador recibe y muestra — el usuario nunca ve las líneas 1 a 4.
6?>
Se cierra el bloque PHP. El recorrido completo terminó: HTML capturó → JS validó → PHP guardó y respondió → el navegador muestra el resultado.
05.3
¿Dónde corre cada cosa?
Tecnología¿Dónde corre?¿Qué tan permanente es lo que hace?
HTMLNavegador (cliente)Se pierde al recargar — solo estructura
JavaScriptNavegador (cliente)Se pierde al cerrar/recargar la pestaña
PHPServidorPuede persistir si guarda en archivo o BD
MySQLServidor (motor de base de datos)Permanente hasta que algo lo borre explícitamente
C# / ASP.NETServidor (equivalente directo a PHP)Igual que PHP: permanente si se conecta a una BD
05.4
Dos caminos posibles para tu proyecto
El ejemplo de arriba (05.1) ya es el Camino A completo. Aquí está el mismo problema resuelto con el Camino B (fetch, sin recargar), para que compares directamente el código de ambos.
A
Camino simple — form tradicional
El <form> envía y la página recarga completa mostrando el HTML que PHP genera. Es el código que ya viste completo en 05.1. Más fácil de depurar al inicio.
B
Camino dinámico — fetch() sin recargar
JS intercepta el envío, lo manda con fetch(), y pinta la respuesta sin recargar nada. Más moderno, una capa más de código. Código abajo.
Camino B · mismo formulario, ahora sin recargar (HTML + JS)9 líneas
1<form id="miForm">
Esta vez el <form> no lleva action ni method — JS va a tomar control total del envío, así que esos atributos ya no se necesitan.
2  <input type="text" id="nombre">
Ya no necesitamos name porque PHP no va a leer $_POST directo de un form enviado — JS va a leer este valor con .value y armarlo él mismo.
3  <button type="button" id="btnGuardar">Guardar</button>
type="button" en vez de "submit" — así el botón no intenta enviar el formulario de la forma tradicional; todo el control queda en manos de JS.
4  <p id="resultado"></p>
Un elemento vacío que existe solo para que JS lo llene después con la respuesta, sin recargar la página.
5</form>
Cierra el formulario.
6document.getElementById("btnGuardar").addEventListener("click", () => {
Se escucha el clic del botón. Todo lo que sigue ocurre en el navegador, sin tocar el servidor todavía.
7  const nombre = document.getElementById("nombre").value;
Se lee el valor escrito, igual que en cualquier otro caso de JS.
8  fetch("guardar_ajax.php?nombre=" + nombre)
Se envía el dato pegado en la URL (estilo GET, simple de leer) hacia un PHP distinto, diseñado para responder solo a JS — no a un form normal.
9    .then(r => r.text()).then(txt => { document.getElementById("resultado").innerHTML = txt; });
.text() lee la respuesta como texto plano. El segundo .then() toma ese texto y lo coloca dentro de <p id="resultado">la página nunca se recargó.
Camino B · guardar_ajax.php (responde solo a JS)3 líneas
1<?php
Igual que cualquier PHP, corre en el servidor.
2$nombre = $_GET['nombre'];
Esta vez se usa $_GET porque el dato llegó pegado en la URL (como armó el fetch de arriba), no por $_POST.
3echo "Hola " . $nombre; ?>
Nota la diferencia clave con 05.1: aquí se devuelve solo un fragmento de texto/HTML, no una página completa — porque JS solo va a insertar esto dentro de un elemento, no a reemplazar toda la pantalla.
Diferencia que se nota en el código: en el Camino A, PHP responde con una página HTML completa porque el navegador la va a mostrar entera. En el Camino B, PHP responde con solo el fragmento necesario, porque JS decide en qué parte exacta de la pantalla insertarlo.
05.6
Preguntas que debes poder responder antes de programar
  • ¿Qué datos necesito capturar? → Eso define los <input> de tu HTML.
  • ¿Necesito validar algo antes de enviarlo? (ej: que la nota esté entre 0-5) → Eso es trabajo de JS.
  • ¿Ese dato debe sobrevivir después de cerrar el navegador? → Si sí, necesitas PHP + MySQL. Si no, JS solo puede bastar.
  • ¿Qué cálculo se repite por cada elemento de mi lista? → Ahí necesitas un bucle (for/foreach), ya sea en JS o PHP.
  • ¿En qué momento decido algo distinto según una condición? (aprobado/reprobado, stock bajo/normal) → Ahí va un if.
05.7
Recordatorio importante
Este manual no resuelve ninguno de los 9 proyectos. Te da las piezas (sintaxis, conceptos, para qué sirve cada cosa) para que tú decidas cómo combinarlas según el problema específico que te toque. Los ejemplos de código de esta sección son genéricos (nombre/edad) — ningún proyecto real usa exactamente estos campos. Si te quedas atascado, vuelve a la sección 05.6 y responde esas preguntas para tu proyecto en concreto.