> Faqs > El extraño caso de la matriz POST desaparecida en PHP

El extraño caso de la matriz POST desaparecida en PHP

En toda mi trayectoria como investigador informático nunca encontré nada tan misterioso como lo que me dispongo a contar. Era en principio algo trivial, un formulario que se autopasa (por el método POST) los datos de un formulario, que recogía para su posterior tratamiento. Esta es la cabecera de definición del formulario:

<form action="visitas.html” method="post">
    ...
</form>

¡Un momento! ¿HTML? En realidad no es así. Se trata de "visitas.php", pero está redireccionado por medio de .htaccess, camuflando la verdadera extensión del archivo.

Esa redirección funciona perfectamente en otras páginas del sitio, y en esta página del formulario también. Sin embargo, cuando se rellenaban las casillas del formulario y se pulsa el botón de enviar, la página se comporta como si no se hubiera enviado nada.

Respuestas

Me atorespondo esta pregunta, pues ya he resuelto el problema.

Odio las labores de seguimiento, aunque con esta profesión a menudo son inevitables. Coloqué al principio del script un print_r($_POST), para ver qué estaba pasando.

Resultado:

array() 

Es decir, los datos no llegaban a su destino. La matriz con los datos del formulario desaparecía por el camino. ¿Cómo era posible? En principio no supe dónde buscar. Estaba todo ahí, en ese simple fichero. Todo era correcto, se enviaban los datos, pero no se recibían.

Tras una ardua investigación descubrí que el formulario enviaba realmente los datos a http://example.com/visitas.html, y sin embargo se intentaban recibir en http://www.example.com/visitas.html (la extensión html o php aquí no tiene trascendencia).

Es decir, había otro redireccionamiento, aparte del especificado en .htaccess, cuyo objetivo era añadir la triple w, y era en ese proceso donde desaparecía la matriz de datos $_POST.

En algún sitio leí que alguien pensaba que era un bug de PHP, algo que no me importó, pues lo que yo necesitaba no era echarle la culpa a alguien, sino encontrar una solución. Una vez localizado el problema, el resto fue sencillo: eliminé el indeseado redireccionamiento.

Sustituí la definición del formulario por:

<form action="http://www.example.com/visitas.html” method="post"> 

De esa manera, al especificar las www en el dominio, como por arte de magia, los datos aparecieron donde debían estar. Para analizar los redireccionamientos que están produciéndose en el acceso a una web, recomiendo el complemento de Firefox Live HTTP Headers

Rafael Muñoz Polonio

Muy bien explicado tu caso... no hay que pensar que sea un bug de PHP y quedarse tan tranquilo.

Efectivamente, cuando hay cosas muy raras podemos contar con el estudio de las cabeceras del HTTP. Actualmente se pueden ver en cualquier navegador con las herramientas de desarrollo.

Lo que yo miraría también es la configuración del dominio, porque si hace redirecciones no tiene sentido que la página original (donde aparece el formulario) tenga las "www" y la página donde lo envías no las tenga. La redirección se debería haber procesado ya en la carga de la primera página (la que presenta el formulario).

Aquí es importante también no usar rutas absolutas para el action del formulario, que incluyan el nombre del dominio, para evitar estos casos. pero tú en el formulario original no las tenías, no sé como se producía ese cambio de subdominio, si es que el servidor estaba correctamente configurado.

Victor
302 8 21 17