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?
Respuestas:
¿Funciona sin los índices explícitos? Tratar:
fuente
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:
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 :)fuente
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.
fuente
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
a
¡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 ...
fuente
No estoy seguro pero teniendo
etc. puede confundir php. Cambiaría los nombres de entrada a test_1, test_2 y vería qué sucede.
fuente
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).
fuente
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
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).
fuente
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
Lo siguiente NO debería ayudarte. Se opone a todo lo que sé de la configuración de PHP:
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_globals
y 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.
fuente
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 .
Y después de configurarlo como seleccionado, todo vuelve a la normalidad :-)
Espero que ayude a futuros lectores
fuente
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.
fuente