Matriz $ _POST misteriosamente vacía

21

Tengo la siguiente página HTML / PHP:

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

Como puede ver, el formulario se enviará y la salida esperada es una matriz POST con una matriz que contiene los valores completados y una entrada "acción" con el valor "Ir" (el botón). Sin embargo, no importa qué valores ingrese en los campos; el resultado es siempre:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

De alguna manera, la matriz llamada prueba se vacía, la variable "acción" lo logra.

He usado la extensión Live HTTP Headers para Firefox para verificar si los campos POST se envían, y lo hacen. La información relevante de los Encabezados HTTP en vivo (con a, byc rellenados como valores en los cuadros de texto):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

¿Alguien tiene alguna idea de por qué sucede esto? Me estoy volviendo loco con esto, ya me ha costado mucho tiempo ...

Actualizar:

Hemos intentado esto en diferentes servidores, en los cuadros de Windows funciona, en el servidor Ubuntu con PHP versión 5.2.4 (con Suhosin), no funciona. Incluso funciona en un servidor diferente, también con Ubuntu y la misma versión de PHP, también con Suhosin instalado.

He diferenciado los dos archivos, esta es la salida ( diff php.ini phps.ini):

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

En este phps.ini es el del servidor en el que funciona y php.ini es el actual. Parece que no hay problemas aquí, ¿verdad?

rael_kid
fuente
44
Suhosin puede ser.
Col. Metralla
Sí, suhosin suena como un candidato probable
SeanJA
¿Podrías darme más información? Suhosin está instalado en el servidor, ¿debería apagarlo? ¿Debo cambiar la configuración?
rael_kid
3
Pruebe esto, registrará si es un problema de sihosin. hardened-php.net/suhosin/configuration.html#suhosin.simulation
Intenté activar el modo de simulación. La matriz todavía está vacía. Sin embargo, parece que no puedo encontrar los archivos de registro ...
rael_kid

Respuestas:

2

¿Funciona sin los índices explícitos? Tratar:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>
Matthew Groves
fuente
No, tampoco funciona.
rael_kid
No establezca los índices para la matriz de prueba: estropean la detección de variables POST
Adam
2
De acuerdo, puedo dejarlos fuera. Pero no resuelve mi problema.
rael_kid
2

Hay una serie de posibles razones por las cuales la matriz de publicaciones podría estar vacía; es probable que se deba a un error humano / desarrollador. Experimenté este problema exacto cuando actualicé de PHP 5.2 a 5.4, fue simple pero me llevó horas solucionar problemas para encontrar el error. En nuestro archivo config.php teníamos la siguiente declaración para procesar matrices $ _POST:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

Las comillas mágicas se activaron una vez, y en las versiones de PHP hasta 5.2, lo anterior funcionó bien, pero cualquier cosa por encima de la versión 5.2 no se procesará y se devolverá una matriz vacía.

Si no ha error_reporting()activado, le sugiero que lo haga y estoy seguro de que podrá solucionar el problema.

También debe verificar las características del sistema en desuso, como " magic_quotes" ya que su uso simplemente no devuelve resultados. Espero que esto ayude. La mejor de las suertes. JCS :)

usuario1360528
fuente
1

Hay informes de errores sobre este u otros problemas similares en el rastreador de errores de PHP:

Lamentablemente, no menciona una solución, pero podría intentar establecer otro CONTENT_TYPE o ningún tipo de contenido.

joschi
fuente
Estos errores son similares, pero no iguales a los míos. Intenté configurar el tipo de contenido (como puede ver en el fragmento de código en mi respuesta original). Si no configuro ningún tipo de contenido, tampoco funciona ...
rael_kid
1

Tuve un problema bastante similar. Bueno, antes que nada me llevó bastante tiempo llegar a esta publicación. Para averiguar el nombre de mi problema, tuve que instalar la consola PHP, averiguar cómo usarla. Depure el código del que no sabía nada. Llegue a la raíz del problema y aún se desconcierte.

La solución fue bastante simple en realidad. En Chrome, presione F12 para acceder a las herramientas de desarrollador, seleccione Red, intente publicar su formulario. Seguimiento de la solicitud de publicación, mire el estado. Si es 301 (o cualquier otra cosa que no sea 200), ¡tiene el mismo problema exacto que yo tenía hasta hace poco!

Mi nuevo proveedor de host estaba redirigiendo http://my_site.com a http://www.my_site.com , todo lo que tenía que hacer era cambiar algunas configuraciones como parte de mi CMS (la suya podría ser diferente pero similar en cierta forma) de

$Configuration['BASE_URL'] = 'http://my_site.com'

a

$Configuration['BASE_URL'] = 'http://www.my_site.com'

¡Y voila, la magia y los arcoiris y los unicornios y mi sitio finalmente está funcionando!

PS Messing con su configuración de alojamiento también podría resolver su problema ... Si su problema es similar al mío, por supuesto ...

Barmaley
fuente
Maldición. ¡La redirección también fue mi problema!
Aman Alam
0

No estoy seguro pero teniendo

name="test[1]"

etc. puede confundir php. Cambiaría los nombres de entrada a test_1, test_2 y vería qué sucede.


fuente
77
@haavee: No, PHP anuncia este uso: php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn
He intentado esto, de esa manera las variables funcionan, pero no están en una matriz.
rael_kid
@haavee: No, la notación no confunde PHP, es el uso estándar de los formularios PHP +. Ver el enlace de Boldewyn. :)
¡OK gracias! Aprendí algo nuevo hoy.
1
@adam: "También es posible asignar claves específicas a sus matrices".
0

En PHP base, puedo pensar en una sola opción de configuración que podría romper esto, que es post_max_size, así que verifique su php.ini y los archivos relacionados para asegurarse de que este valor sea correcto y no esté establecido en cero o un valor no válido como un carácter alfabético .

Suhosin hace posible bloquear las variables de publicación en una variedad de condiciones, incluidas cosas como la longitud de la matriz y la longitud del nombre de la variable. Seleccione los archivos php.ini para 'suhosin' para ver si hay alguna configuración, particularmente cualquier cosa que comience con 'suhosin.post'. (Consulte http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth para obtener más detalles sobre los parámetros en los que estoy pensando).

Desafortunadamente, salvo un error importante en la configuración que establece algún valor en uno o cero, su código (y variables) son lo suficientemente cortos como para que sea una posibilidad remota. Si eso queda en blanco, mi próxima sugerencia sería hacer una copia de seguridad de sus configuraciones de Apache y PHP, destruir sus directorios, purgar los paquetes, reinstalar y comenzar a volver a colocar los fragmentos de configuración en su lugar hasta que el código deje de funcionar nuevamente (alternativamente, comience a actualizar ese servidor eso funciona con configuraciones del servidor que no funciona hasta que ambas estén rotas). Dado que tiene el mismo servidor PHP con el mismo sistema operativo funcionando correctamente, es casi seguro que se trata de un error de configuración en el servidor que funciona mal en alguna parte, pero es un pajar bastante grande para buscar.

Se recomienda encarecidamente el control de versiones de / etc antes de comenzar esto: consulte el paquete etckeeper. (En realidad, recomiendo su uso, punto. Gran protector de la cordura, particularmente en una máquina donde más de una persona tiene acceso a la raíz).

Zed
fuente
Mi post_max_size es de 8M, creo que sería suficiente. Mi php.ini no contiene ninguna entrada con suhosin, por lo que puede ser un problema ... ¿tiene suhosin sus propios archivos de conf?
rael_kid
No de forma predeterminada, pero la configuración de cualquier módulo PHP puede establecerse mediante cualquier archivo en /etc/php5/conf.d en un sistema Debian, y por lo tanto supongo que también es un sistema Ubuntu. Como dije, esto era una posibilidad remota. Aún así, comenzaría por diferenciar cada archivo de configuración con un sistema en funcionamiento.
Zed
0

Tengo errores de envío de formularios por todas partes desde que actualicé a Debian "testing" desde "stable". Parece que apache2 o php5 no maneja varios elementos en el envío con el mismo nombre. Por ejemplo; su formulario tiene dos entradas nombre "mo". En el pasado, solo uno de los valores para "mo" lograba pasar. Ahora el formulario parece descartar todos los datos después de la primera aparición de una clave duplicada. No estoy seguro todavía. Aún tratando de averiguarlo.


fuente
0

Intente copiar el php.ini del servidor que funciona en este (sin embargo, primero haga una copia de seguridad del php.ini del servidor que no funciona). Si lo hace, es algo allí (tal vez las variables_order, o posiblemente la memoria, aunque es poco probable).

salsa
fuente
0

Intente renombrar su botón de enviar a algo que no sea acción. He tenido algunos problemas con esto en el pasado. Tener una entrada llamada 'acción' parece ser el problema.


fuente
0

Lo siguiente NO debería ayudarte. Se opone a todo lo que sé de la configuración de PHP:

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

Este saltó sobre mí. Sus superglobales se están registrando en diferentes órdenes. Esto no debería ser un problema porque, dado que no está utilizando register_globalsy no confía en ellos, no debería ser un problema cambiar el orden en que se procesan las variables de orden.

Pero definitivamente deberías intentarlo y cambiar el orden de las variables.

pausado
fuente
0

Incluso ese OP es bastante antiguo, pero hoy me encontré con un problema similar.

Después de pasar algunas horas revisando millones de cosas diferentes una y otra vez, finalmente descubrí que después de la última actualización de la versión PHP 5.6.17 en nuestro cPanel en la configuración predeterminada de PHP, no se seleccionó http .ingrese la descripción de la imagen aquí

Y después de configurarlo como seleccionado, todo vuelve a la normalidad :-)

ingrese la descripción de la imagen aquí

Espero que ayude a futuros lectores

Nikita Kurtin
fuente
0

Si esto puede ayudar a alguien más ... Acabo de pasar horas para solucionar un problema similar y el problema era el límite max_input_vars = "1000" de php.ini. Asegúrese de verificar los valores de php.ini de upload_max_filesize, post_max_size y max_input_vars. Superar uno dará como resultado una matriz vacía $ _POST.

Chris L.
fuente