
¿Por qué mi <input type="hidden"> no se envía por POST en HTML?
Cuando trabajamos con formularios en HTML, muchas veces necesitamos enviar información oculta al servidor usando campos <input type="hidden">. Esto funciona sin problemas en la mayoría de los casos, pero puede surgir una confusión común: “¿Por qué mi input hidden no llega en el POST cuando lo pongo dentro de una tabla?”
La respuesta no es que las tablas bloqueen los campos ocultos, sino que normalmente se trata de detalles en la estructura del formulario.
El campo debe estar dentro del <form>
Los navegadores solo envían los campos que están dentro de un formulario válido.
Si el <form> abre antes de la tabla y cierra después, no habrá problema. Pero si intentas abrir el <form> dentro de un <tr> y cerrarlo en otro, el navegador puede reorganizar el HTML y dejar tu input “fuera” del formulario.
Solución: envuelve toda la tabla con el <form>.
Ejemplo correcto:
<form action="procesa.php" method="post">
<table>
<tr>
<td>Usuario:</td>
<td><input type="text" name="usuario"></td>
</tr>
<tr>
<td colspan="2">
<input type="hidden" name="variable" value="valor">
<button type="submit">Enviar</button>
</td>
</tr>
</table>
</form>
El atributo name es obligatorio
Un error común es pensar que con id basta, pero no:
Solo los campos con name se incluyen en el POST.
✔ Correcto:
<input type="hidden" name="variable" value="valor">
✘ Incorrecto:
<input type="hidden" id="variable" value="valor">
Campos deshabilitados no viajan
Si el input tiene disabled o está dentro de un <fieldset disabled>, el navegador lo ignorará en el envío.
Cuidado con los botones
Si usas un <button type="submit" formmethod="get">, ese botón puede forzar el método GET aunque el formulario esté declarado con method="post".
Inputs fuera del formulario: usar form="id"
Cuando por diseño no puedes colocar el input dentro del formulario (por ejemplo, la tabla ya está maquetada en otra parte del HTML), puedes usar el atributo form:
<form id="f1" action="procesa.php" method="post"></form>
<table>
<tr>
<td>
<input type="hidden" name="variable" value="valor" form="f1">
<button type="submit" form="f1">Enviar</button>
</td>
</tr>
</table>
Cómo verificar si llega el valor
En el servidor, imprime el contenido del POST para confirmar:
var_dump($_POST);
Deberías ver algo como:
array(1) {
["variable"]=>
string(5) "valor"
}
Conclusión
El problema no es la tabla, sino la estructura del formulario. Mientras el input esté dentro del form, tenga un name válido y no esté deshabilitado, el valor siempre viajará en el POST.
👉 Este detalle es especialmente importante en aplicaciones donde necesitas enviar identificadores, tokens de seguridad o datos que no deben mostrarse al usuario, pero sí procesarse en el backend.
