Tengo un CMS personalizado que he construido que funciona perfectamente en mi caja de desarrollo (Ubuntu / PHP5 + / MySQL5 +).
Acabo de moverlo al cuadro 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 realmente se están pasando usando file_get_contents('php://input');
y los datos se muestran bien allí: las matrices $_POST
/ $_REQUEST
siempre están vacías.
También verifiqué que los encabezados de tipo de contenido también son correctos a través de firebug ( application/x-www-form-urlencoded; charset=utf-8
).
Este problema ocurre independientemente de si un formulario se envía a través de AJAX o un formulario normal.
¡Cualquier ayuda es muy apreciada!
Respuestas:
Sé que esta pregunta era sobre POST a través de un formulario, pero vine aquí en busca de respuestas para un problema similar al publicar con el tipo de contenido JSON. Encontré la respuesta y quise compartirla ya que me costó mucho tiempo.
Cuando se usa 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:
¡Espero que esto ayude a alguien!
fuente
Content-Type
encabezado aapplication/x-www-form-urlencoded
y luego serializar sus datos con$.param(dataObject)
. Eso debería ayudar.title=something&body=anything
. Quiero obtener el valle de título y cuerpo. $ dataobject ["título"] devuelve vacío. En mi caso, $ _POST está vacío. Y la única forma de obtenerlo usando file_get_contents ("php: // input") ... excepto que no está codificado en json.Aquí hay otra posible causa: mi formulario se estaba enviando a dominio.com sin la WWW. y había configurado una redirección automática para agregar la "WWW". La matriz $ _POST se estaba vaciando en el proceso. Entonces, para solucionarlo, todo lo que tuve que hacer fue enviarlo a www.domain.com
fuente
htaccess
fue la causa de que los POST no funcionaran. Estaba agregando automáticamente una barra a todas las URL, pero en el código como ACCIÓN estaba usando una URL sin una barra. Su respuesta ayudó, ya que nunca pensé en verificar el .htaccess. +1.htaccess
archivo. Estaba quitando la.php
extensión de la URL y mi formulario sePOST
dirigía a la URL con la extensión.Tuve un problema similar. Resultó ser una solución simple. En la forma que tenía
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 diagonal al final.
Agregar la barra diagonal al final de mi acción funcionó:
¡Mi matriz $ _POST estaba llena de nuevo!
fuente
<form>
etiqueta no tenía unname
atributo, y solo en IE.Asegúrese de que, en php.ini:
track_vars
(solo está disponible en versiones muy antiguas de PHP) está configurado enOn
variables_order
contiene la letraP
post_max_size
se establece en un valor razonable (por ejemplo, 8 MB)suhosin.post.max_vars
ysuhosin.request.max_vars
son lo suficientemente grandes.Supongo que la segunda sugerencia mía resolverá tu problema.
fuente
Descubrí que al publicar de HTTP a HTTPS, el
$_POST
archivo viene vacío. Esto sucedió mientras probaba el formulario, pero me tomó un tiempo hasta que me di cuenta de eso.fuente
Me encontré con un problema similar pero ligeramente diferente y me tomó 2 días entender el problema.
En mi caso, la matriz POST también 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 confirmación para volver a enviar los datos del formulario si actualizo la página cargada después del envío POST. Fue una página directamente refrescante. Pero cuando cambié la URL del formulario a una diferente, estaba pasando 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 fallas con la URL, sin embargo, apuntaba a una carpeta sin index.php en la URL y estaba revisando POST en index.php.
Aquí dudé de que la redirección desde / hacia /index.php causa que los datos POST se pierdan y se pruebe la URL con la adición de index.php a la URL.
Eso funciono.
Publíquelo aquí para que alguien lo encuentre útil.
fuente
No tengo una solución elegante en este momento, pero quería compartir mis hallazgos para referencia futura de otras personas que encuentren este problema. La fuente del problema fueron 2 valores php anulados en un archivo .htaccess. Simplemente había agregado estos 2 valores para aumentar el límite de carga de archivos desde los 8 MB predeterminados a algo más grande; observé que simplemente tener estos 2 valores en el archivo htaccess, ya sea más grande o más pequeño que el predeterminado, causaba el problema .
Agregué variables adicionales para, con suerte, elevar los límites para todas las vars suhosin.post.xxx/suhosin.upload.xxx, pero desafortunadamente, estas no tuvieron ningún efecto con este problema.
En resumen, no puedo explicar realmente el "por qué" aquí, pero he identificado la causa raíz. Mi sensación es que este es, en última instancia, un problema de suhosin / htaccess, pero desafortunadamente uno que no pude resolver aparte de 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 resolviendo esto. Gracias a todos los que se tomaron el tiempo para ayudarme con esto (MrMage, Andrew)
fuente
Podría resolver el problema usando enctype = "application / x-www-form-urlencoded" ya que el valor predeterminado es "text / plain". Cuando marca $ DATA, el separador es un espacio para "texto / plano" y un carácter especial para "urlencoded".
Saludos cordiales Frank
fuente
Tener la
enable_post_data_reading
configuración deshabilitada causará esto. Según la documentación:fuente
Si está publicando en un archivo index.php en un directorio, por ejemplo /api/index.php, asegúrese de especificar en su formulario el directorio completo del archivo, por ejemplo
Esta
O
trabajos.
Pero esto falla
fuente
/my_uri
funcionaría pero no/my_uri/
.De acuerdo, esto fue estúpido y me avergonzaré en público, pero hice un pequeño script de prueba para algo en PHP y cuando mi
$_POST
matriz estaba vacía, StackOverflow es el primer lugar donde busqué y no encontré la respuesta que necesitaba. .Solo habia escrito
y olvidé especificar el método como
POST
!Estoy seguro de que alguien se reirá, pero si esto ayuda a alguien que hace lo mismo, ¡no me importa! ¡Todos lo hacemos de vez en cuando!
fuente
En mi caso, al publicar de HTTP a HTTPS, $ _POST viene vacío. El problema era que el formulario tenía una acción como esta //example.com Cuando arreglé la URL en https://example.com , el problema desapareció.
fuente
mismo problema aquí!
Estaba tratando de conectarme a mi código de servidor local a través de una solicitud de publicación en cartero, ¡y este problema me hizo perder mucho tiempo!
para cualquiera que use un proyecto local (por ejemplo, cartero): use su dirección IPv4 (escriba ipconfig en cmd) en lugar de la palabra clave "localhost". en mi caso:
antes de:
después:
fuente
REFERENCIA: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
Método POST
Vamos a realizar algunas modificaciones para que se utilice el método POST al enviar la solicitud ...
Algunos encabezados http deben configurarse junto con cualquier solicitud POST. Así que los ponemos en estas líneas ...
Con las líneas anteriores, básicamente estamos diciendo que el envío de datos tiene el formato de envío de un formulario. También damos la longitud de los parámetros que estamos enviando.
Establecimos un controlador para el evento de cambio de 'estado listo'. Este es el mismo controlador que usamos para el método GET. Puede usar http.responseText aquí: insértelo en un div usando innerHTML (AHAH), eval it (JSON) o cualquier otra cosa.
Finalmente, enviamos los parámetros con la solicitud. La URL proporcionada se carga solo después de llamar a esta línea. En el método GET, el parámetro será un valor nulo. Pero en el método POST, los datos a enviar se enviarán como argumento de la función de envío. La variable params se declaró en la segunda línea como
lorem=ipsum&name=binny
, por lo que enviamos dos parámetros, 'lorem' y 'name' con los valores 'ipsum' y 'binny' respectivamente.fuente
En mi caso, fue porque estaba usando jQuery para deshabilitar todas las entradas en la página justo antes de usar jQuery para enviar el formulario. Así que cambié mi "deshabilitar todas las entradas, incluso los tipos 'ocultos'":
para "deshabilitar solo las entradas de tipo 'botón'":
¡Esto fue para que el usuario no pudiera presionar accidentalmente el botón 'ir' dos veces y lavar nuestra base de datos! Parece que si coloca el atributo 'deshabilitado' en una entrada de formulario de tipo 'oculto', sus valores no se enviarán si se envía el formulario.
fuente
Para mí, .htaccess estaba redirigiendo cuando mod_rewrite no estaba instalado. Instale mod_rewite y todo está bien.
Específicamente:
estaba ejecutando.
fuente
Pasé horas para solucionar un problema similar. El problema en mi caso fue el
de forma predeterminada, en php.ini. Tenía un formulario realmente enorme sin cargas. php.ini está configurado para upload_max_filesize = "100M" y post_max_size = "108M" y seguramente no fue el problema en mi caso. El comportamiento de PHP es el mismo para max_input_vars cuando excede 1000 variables en el formulario. Devuelve una matriz _POST vacía. Ojalá hubiera podido encontrar eso hace una hora y horas.
fuente
Sé que esto es antiguo, pero quería compartir mi solución.
En mi caso, el problema estaba en mi .htaccess, ya que agregué variables para aumentar el límite máximo de carga de PHP. Mi código era así:
Más tarde, noté que los valores deberían ser xxM, no xxMB y cuando lo cambié a:
ahora mi $ _POST devolvió los datos como antes. Espero que esto ayude a alguien en el futuro.
fuente
Además de la publicación de MRMage:
Tuve que configurar esta variable para resolver el problema de que algunas
$_POST
variables (con una matriz grande> 1000 elementos) desaparecieron:"
request
", no "post
" fue la solución ...fuente
Quizás no sea la solución más conveniente, pero me di cuenta de que si configuro el
action
atributo de formulario en el dominio raíz, se puede acceder a index.php y se obtienen las variables publicadas. Sin embargo, si configuro una URL reescrita como acción, no funciona.fuente
Esto es algo similar a lo que dijo @icesar .
Pero estaba tratando de publicar cosas en mi api, ubicada en
site/api/index.php
, solo publicando en,site/api
ya que se pasa aindex.php
sí mismo. Sin embargo, esto aparentemente causó que algo se estropeara, ya que mi$_POST
se vació sobre la marcha. Simplemente publicandosite/api/index.php
directamente en su lugar lo resolvió.fuente
Mi problema fue que estaba usando la
<base>
etiqueta HTML para cambiar la URL base de mi sitio de prueba. Una vez que eliminé esa etiqueta del encabezado, los$_POST
datos volvieron.fuente
En mi caso (la página php en el servidor mutualisé de OVH)
enctype="text/plain"
no funciona ($_POST
y el correspondiente$_REQUEST
está vacío), los otros ejemplos a continuación funcionan. ''
Más aquí: method = "post" enctype = "text / plain" no son compatibles?
fuente
Recibí el siguiente error de Mod Security:
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 :)
fuente
Asegúrese de utilizar name = " your_variable_name " en la etiqueta de entrada.
Utilizo por error id = " your_variable_name ".
Pasé mucho tiempo para atrapar el error.
fuente
Asegúrese de que la
name
propiedad de cada campo esté definida.Esto te crea un POST vacío en PHP
Pero esto funcionará
fuente
De acuerdo, pensé que debería poner mi caso aquí ... Estaba obteniendo 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 enviar y no pasa nada ... Después de investigar un rato, descubrí que mi empresa de alojamiento tiene un módulo de seguridad que verifica las entradas de los usuarios y borra toda la matriz de publicaciones (no solo los datos maliciosos) si lo descubre. En mi ejemplo, un profesor de matemáticas intentaba introducir la ecuación: dy + dx + 0 = 0; y los datos se borraron por completo.
Para solucionar esto, solo le aconsejo que ingrese los datos en el área de texto como dy + dx + 0 = cero, y ahora funciona ... Esto puede ahorrarle a alguien algo de tiempo ...
fuente