formulario ejemplo array php arrays forms post

ejemplo - php $_POST matriz vacía al enviar el formulario



ejemplo $_ session (21)

Además de la publicación de MRMage:

Tuve que configurar esta variable para resolver el problema de que algunas variables $_POST (con una matriz grande> 1000 elementos) desaparecieron:

suhosin.request.max_vars = 2500

" request ", no " post " fue la solución ...

Tengo un CMS personalizado que he construido que funciona perfectamente en mi cuadro de desarrollo (Ubuntu / PHP5 + / MySQL5 +).

Acabo de moverlo a la caja de producción para mi cliente y ahora todos los envíos de formularios se muestran como matrices $ _POST vacías.

Encontré un truco para verificar que los datos se pasan realmente usando file_get_contents(''php://input''); y los datos se muestran bien ahí: las matrices $_POST / $_REQUEST siempre están vacías.

También he verificado que los encabezados de tipo de contenido son correctos también a través de firebug ( application/x-www-form-urlencoded; charset=utf-8 ).

Este problema está sucediendo independientemente de si un formulario se envía a través de AJAX o de un envío de formulario regular.

¡Cualquier ayuda es muy apreciada!


Aquí hay otra posible causa: mi formulario se enviaba a domain.com sin la WWW. y yo había configurado una redirección automática para agregar el "WWW". La matriz $ _POST se vaciaba en el proceso. Entonces, para arreglarlo todo lo que tenía que hacer era enviarme a www.dominio.com


Asegúrese de hacerlo en php.ini:

  • track_vars (solo está disponible en versiones muy antiguas de PHP) está configurado en On
  • variables_order contiene la letra P
  • post_max_size se establece en un valor razonable (por ejemplo, 8 MB)
  • (si usa el parche suhosin) suhosin.post.max_vars y suhosin.request.max_vars son lo suficientemente grandes.

Supongo que la segunda sugerencia mía resolverá tu problema.


Descubrí que al publicar de HTTP a HTTPS, $_POST viene vacío. Esto sucedió mientras probaba el formulario, pero me tomó un tiempo hasta que me di cuenta de eso.


En mi caso (página php en el servidor de OVH mutualisé) enctype="text/plain" no funciona ( $_POST y el correspondiente $_REQUEST está vacío), los otros ejemplos a continuación funcionan. `

<form action="?" method="post"> <!-- in this case, my google chrome 45.0.2454.101 uses --> <!-- Content-Type:application/x-www-form-urlencoded --> <input name="say" value="Hi"> <button>Send my greetings</button> </form> <form action="?" method="post" enctype="application/x-www-form-urlencoded"> <input name="say" value="Hi"> <button>Send my application/x-www-form-urlencoded greetings</button> </form> <form action="?" method="post" enctype="multipart/form-data"> <input name="say" value="Hi"> <button>Send my multipart/form-data greetings</button> </form> <form action="?" method="post" enctype="text/plain"><!-- not working --> <input name="say" value="Hi"> <button>Send my text/plain greetings</button> </form>

`

Más aquí: method = "post" enctype = "text / plain" no son compatibles?


En mi caso, fue porque estaba usando jQuery para desactivar todas las entradas en la página justo antes de usar jQuery para enviar el formulario. Así que cambié mi "desactivar cada entrada incluso los tipos ''ocultos''":

$(":input").attr("disabled","disabled");

para "desactivar solo las entradas de tipo ''botón''":

$(''input[type=button]'').attr(''disabled'',true);

¡Esto fue para que el usuario no pudiera presionar accidentalmente el botón ''ir'' dos veces y manguera nuestra DB! Parece que si pone el atributo ''disabled'' en un formulario de entrada ''oculto'', ¡sus valores no se enviarán si se envía el formulario!


Esto es algo similar a lo que said @icesar.

Pero estaba tratando de publicar cosas en mi API, ubicada en el site/api/index.php , solo publicando en el site/api ya que se pasa a index.php por sí mismo. Esto sin embargo, aparentemente causa algo que se ensucie, ya que mi $_POST se vació sobre la marcha. Simplemente publicando en el site/api/index.php directamente en su lugar lo resolvió.


Me encontré con un problema similar aunque levemente diferente y me llevó 2 días entender el problema.

  • En mi caso, también la matriz POST estaba vacía.

  • Luego se verificó con file_get_contents (''php: // input''); y eso también estaba vacío.

Más tarde descubrí que el navegador no estaba solicitando la confirmación para volver a enviar los datos del formulario después de Si actualizo la página cargada después del envío de POST. Fue una página directamente refrescante. Pero cuando cambié la URL del formulario a una diferente, estaba aprobando POST correctamente y solicité volver a enviar los datos cuando intenté actualizar la página.

Luego verifiqué qué está mal con la URL real. No hubo errores en la URL, sin embargo, apuntaba a una carpeta sin index.php en la URL y estaba revisando POST en index.php.

Aquí dudaba que la redirección de / a /index.php cause la pérdida de los datos POST y la URL probada con la adición de index.php a la URL.

Eso funciono.

Lo publicó aquí para que alguien lo encuentre útil.


Mi problema era que estaba usando la etiqueta HTML <base> para cambiar la URL base de mi sitio de prueba. Una vez que eliminé esa etiqueta del encabezado, volvieron los datos de $_POST .


No tengo una solución elegante en este momento, pero quería compartir mis hallazgos para futuras referencias de otras personas que enfrentan este problema. La fuente del problema fue 2 valores php anulados en un archivo .htaccess. Simplemente agregué estos 2 valores para aumentar el límite del tamaño del archivo para las cargas de archivos de 8 MB por defecto a algo más grande. Observé que simplemente tener estos 2 valores en el archivo htaccess, ya sea mayor o menor que el predeterminado, causó el problema .

php_value post_max_size xxMB php_value upload_max_filesize xxMB

Agregué variables adicionales para elevar los límites de todos los suhosin.post.xxx/suhosin.upload.xxx vars, pero estos no tuvieron ningún efecto sobre este problema, lamentablemente.

En resumen, realmente no puedo explicar el "por qué" aquí, pero he identificado la causa raíz. Mi sensación es que, en última instancia, se trata de un problema suhosin / htaccess, pero desafortunadamente no pude resolverlo más que para eliminar los 2 valores anulados de php anteriores.

Espero que esto ayude a alguien en el futuro ya que maté un puñado de horas averiguando esto. Gracias a todos los que se tomaron el tiempo para ayudarme con esto (MrMage, Andrew)


OK, pensé que debería poner mi caso aquí ... Estaba sacando la matriz de publicaciones vacía en casos específicos. El formulario funciona bien, pero algunas veces los usuarios se quejan de que presionan el botón de enviar, y no pasa nada ... Después de excavar durante un tiempo, descubrí que mi empresa de hosting tiene un módulo de seguridad que comprueba las entradas de los usuarios y borra todo el conjunto de entradas (no solo los datos maliciosos) si lo descubre. En mi ejemplo, un profesor de matemáticas estaba tratando de ingresar a la ecuación: dy + dx + 0 = 0; y los datos se borraron por completo.

Para arreglar esto, solo le aconsejo que ingrese los datos en el área de texto como dy + dx + 0 = cero, y ahora funciona ... Esto puede salvar a alguien en algún momento ...


Para mí, .htaccess estaba redireccionando cuando mod_rewrite no estaba instalado. Instala mod_rewite y todo está bien.

Específicamente:

<IfModule !mod_rewrite.c> ErrorDocument 404 /index.php </Ifmodule>

estaba ejecutando.


Podría resolver el problema usando enctype = "application / x-www-form-urlencoded" ya que el valor predeterminado es "text / plain". Cuando ingresa $ DATA, el separador es un espacio para "texto / plano" y un carácter especial para "urlencoded".

Saludos cordiales Frank


Quizás no sea la solución más conveniente, pero me di cuenta de que si configuro el atributo de action formulario en el dominio raíz, se puede acceder a index.php y obtener las variables publicadas. Sin embargo, si configuro una URL reescrita como acción, no funciona.


REFERENCIA: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

Método POST

Vamos a hacer algunas modificaciones para que el método POST se use al enviar la solicitud ...

var url = "get_data.php"; var params = "lorem=ipsum&name=binny"; http.open("POST", url, true); //Send the proper header information along with the request http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "close"); http.onreadystatechange = function() {//Call a function when the state changes. if(http.readyState == 4 && http.status == 200) { alert(http.responseText); } } http.send(params);

Algunos encabezados http deben establecerse junto con cualquier solicitud POST. Entonces los configuramos en estas líneas ...

http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http.setRequestHeader("Content-length", params.length); http.setRequestHeader("Connection", "close");

Con las líneas anteriores, básicamente estamos diciendo que el envío de datos tiene el formato de un envío de formulario. También damos la longitud de los parámetros que estamos enviando.

http.onreadystatechange = function() {//Call a function when the state changes. if(http.readyState == 4 && http.status == 200) { alert(http.responseText); } }

Configuramos un controlador para el evento de cambio ''estado preparado''. Este es el mismo controlador que utilizamos para el método GET. Puedes usar http.responseText aquí - insertar en un div usando innerHTML (AHAH), evaluarlo (JSON) o cualquier otra cosa.

http.send(params);

Finalmente, enviamos los parámetros con la solicitud. La url dada se carga solo después de que se llame a esta línea. En el método GET, el parámetro será un valor nulo. Pero en el método POST, los datos que se enviarán se enviarán como el argumento de la función de envío. La variable params fue declarada en la segunda línea como lorem=ipsum&name=binny - entonces enviamos dos parámetros - ''lorem'' y ''name'' con los valores ''ipsum'' y ''binny'' respectivamente.


Sé que esta pregunta se refería a POST a través de un Formulario, pero vine aquí en busca de respuestas para un problema similar al realizar una POST con tipo de contenido JSON. Encontré la respuesta y quería compartirla, ya que me costó mucho tiempo.

Al usar el tipo de contenido JSON, la matriz $ _POST no se completará (creo que solo con formularios de varias partes)

Esto es lo que funcionó para corregir el problema:

$rest_json = file_get_contents("php://input"); $_POST = json_decode($rest_json, true);

¡Espero que esto ayude a alguien!


Sé que ha pasado un tiempo desde esta publicación, pero pensé que contribuiría con cuál fue el problema para mí.

Obtuve el siguiente error de Mod Security:

Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|/*| |/,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|/*| |/,]|UNION SELECT.*/'.*/'.*,[0-9].*INTO.*FROM)" at REQUEST_BODY. [file "/usr/local/apache/conf/modsec2.user.conf"] [line "345"] [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]

Una vez que eliminé la configuración de seguridad de mi mod para probar, todo funcionó como se esperaba. Ahora solo necesito modificar mis reglas para mantenerme seguro pero lo suficientemente flexible para mis necesidades :)

Luke


Si está publicando en un archivo index.php en un directorio, por ejemplo /api/index.php, asegúrese de que en su formulario especifique el directorio completo del archivo, por ejemplo:

Esta

<form method="post" action="/api/index.php"> </form>

O

<form method="post" action="/api/"> </form>

trabajos.

Pero esto falla

<form method="post" action="/api"> </form>


Tener la configuración enable_post_data_reading desactivada causará esto. De acuerdo con la documentación:

enable_post_data_reading

Desactivar esta opción hace que $ _POST y $ _FILES no se completen. La única forma de leer postdata será a través de la envoltura de flujo de entrada php: //. Esto puede ser útil para solicitudes de proxy o para procesar los datos de POST de una manera eficiente de la memoria.


Tuve un problema similar. Resultó ser una solución simple. En la forma que tenía

<form action = "directory" method = "post">

donde directorio era el nombre de ... el directorio. Mi matriz POST estaba totalmente vacía. Cuando miré la url en mi navegador, se mostró con una barra inclinada al final.

Agregando la barra inclinada hacia el final de mi acción hizo el truco -

<form action = "directory /" method = "post">

¡Mi array $ _POST estaba lleno otra vez!


<form action="test.php" method="post"> ^^^^^^^^^^^^^

Bien, esto fue estúpido y me avergonzaré en público, pero cambié un pequeño guión de prueba por algo en PHP y cuando mi matriz $_POST estaba vacía, es el primer lugar donde miré y no encontré la respuesta. Lo necesitaba.

Solo había escrito

<form action="test.php">

y olvidado especificar el método como POST !

Estoy seguro de que alguien se burlará, pero si esto ayuda a alguien más que hace lo mismo, ¡entonces no me importa! ¡Todos lo hacemos de vez en cuando!