Eu tenho um CMS personalizado que construí que funciona perfeitamente na minha dev box (Ubuntu / PHP5 + / MySQL5 +).
Acabei de movê-lo para a caixa de produção do meu cliente e agora todos os envios de formulários estão aparecendo como arrays $ _POST vazios.
Eu descobri um truque para verificar se os dados estão realmente sendo passados usando file_get_contents('php://input');
e os dados estão aparecendo bem ali - os $_POST
/ $_REQUEST
arrays estão sempre vazios.
Eu também verifiquei que os cabeçalhos de tipo de conteúdo estão corretos via firebug ( application/x-www-form-urlencoded; charset=utf-8
).
Esse problema está acontecendo independentemente de um formulário ser enviado via AJAX ou um envio de formulário normal.
Qualquer ajuda é muito apreciada!
Respostas:
Eu sei que esta pergunta era sobre o POST por meio de um formulário, mas vim aqui em busca de respostas para problemas semelhantes ao fazer o POST com o tipo de conteúdo JSON. Encontrei a resposta e queria compartilhá-la, pois me custou muito tempo.
Ao usar o tipo de conteúdo JSON, a matriz $ _POST não será preenchida (acredito que apenas com formulários de várias partes)
Aqui está o que funcionou para corrigir o problema:
espero que isso ajude alguém!
fonte
Content-Type
cabeçalho paraapplication/x-www-form-urlencoded
e serializar seus dados com$.param(dataObject)
. Isso deve ajudar.title=something&body=anything
. Eu quero obter o vale de título e corpo. $ dataobject ["title"] retorna vazio. No meu caso, $ _POST está vazio. E a única maneira de obtê-lo usando file_get_contents ("php: // input") ... exceto que não é codificado em json.Aqui está outra causa possível - meu formulário foi enviado para domain.com sem a WWW. e configurei um redirecionamento automático para adicionar o "WWW". O array $ _POST estava sendo esvaziado no processo. Então, para consertar tudo que eu tive que fazer foi enviar para www.domain.com
fonte
htaccess
foi a causa dos POSTs não funcionarem. Eu estava acrescentando barra automaticamente a todos os urls, mas no código como a AÇÃO estava usando um url sem barra. Sua resposta ajudou, pois nunca pensei em verificar o .htaccess. +1.htaccess
arquivo. Ele estava removendo a.php
extensão do URL e meu formulário estavaPOST
indo para o URL com a extensão.Eu tive um problema parecido. Acabou sendo uma solução simples. Na forma que eu tinha
onde diretório era o nome de ... o diretório. Minha matriz POST estava totalmente vazia. Quando olhei para o url em meu navegador, ele foi exibido com uma barra no final.
Adicionar a barra ao final da minha ação resolveu -
Meu array $ _POST estava cheio novamente!
fonte
<form>
tag não tivesse umname
atributo, e apenas no IE.Certifique-se de que, em php.ini:
track_vars
(está disponível apenas em versões de PHP muito antigas) está definido comoOn
variables_order
contém a cartaP
post_max_size
está definido para um valor razoável (por exemplo, 8 MB)suhosin.post.max_vars
esuhosin.request.max_vars
são grandes o suficiente.Suponho que a segunda sugestão minha resolverá seu problema.
fonte
Descobri que, ao postar de HTTP para HTTPS, o
$_POST
vem vazio. Isso aconteceu durante o teste do formulário, mas demorei um pouco até perceber isso.fonte
Eu me deparei com um problema semelhante, mas ligeiramente diferente, e demorei 2 dias para entender o problema.
No meu caso, também o array POST estava vazio.
Em seguida, verificado com file_get_contents ('php: // input'); e também estava vazio.
Mais tarde, descobri que o navegador não estava pedindo confirmação para reenviar os dados do formulário após Se eu atualizar a página carregada após o envio do POST. Foi uma página diretamente refrescante. Mas quando mudei o URL do formulário para um diferente, ele estava passando o POST corretamente e pedia para reenviar os dados ao tentar atualizar a página.
Então eu verifiquei o que há de errado com o URL real. Não houve falha com URL, no entanto, ele estava apontando para uma pasta sem index.php na URL e eu estava verificando o POST em index.php.
Aqui eu duvido que o redirecionamento de / para /index.php faça com que os dados do POST sejam perdidos e o URL testado com index.php anexado ao URL.
Isso funcionou.
Poste aqui para que alguém ache útil.
fonte
Não tenho uma solução elegante neste momento, mas gostaria de compartilhar minhas descobertas para referência futura de outras pessoas que encontrarem esse problema. A origem do problema eram 2 valores de php substituídos em um arquivo .htaccess. Eu simplesmente adicionei esses 2 valores para aumentar o limite de tamanho de arquivo para uploads de arquivo dos 8 MB padrão para algo maior - observei que simplesmente ter esses 2 valores no arquivo htaccess, seja maior ou menor do que o padrão, causava o problema .
Eu adicionei variáveis adicionais para aumentar os limites de todas as vars suhosin.post.xxx/suhosin.upload.xxx, mas infelizmente elas não tiveram nenhum efeito com esse problema.
Em resumo, não consigo explicar o "porquê" aqui, mas identifiquei a causa raiz. Meu sentimento é que este é, em última análise, um problema de suhosin / htaccess, mas infelizmente um que eu não fui capaz de resolver além de remover os 2 valores substituídos de php acima.
Espero que isso ajude alguém no futuro, já que matei um punhado de horas tentando descobrir isso. Obrigado a todos que despenderam tempo para me ajudar com isso (MrMage, Andrew)
fonte
Eu poderia resolver o problema usando enctype = "application / x-www-form-urlencoded" já que o padrão é "text / plain". Quando você faz check-in de $ DATA, o separador é um espaço para "text / plain" e um caractere especial para "urlencoded".
Atenciosamente Frank
fonte
Ter a
enable_post_data_reading
configuração desativada causará isso. De acordo com a documentação:fonte
Se você estiver postando em um arquivo index.php em um diretório, por exemplo /api/index.php, certifique-se de especificar em seu formulário o diretório completo do arquivo, por exemplo
este
OU
trabalho.
Mas isso falha
fonte
/my_uri
funcionaria, mas não/my_uri/
.Ok, isso foi estúpido e estarei me envergonhando em público, mas criei um pequeno script de teste para algo em PHP e quando meu
$_POST
array estava vazio, StackOverflow é o primeiro lugar que procurei e não encontrei a resposta que precisava .Eu só tinha escrito
e esquecido de especificar o método como sendo
POST
!Tenho certeza de que alguém vai rir, mas se isso ajudar alguém que faz a mesma coisa, então eu não me importo! Todos nós fazemos isso de vez em quando!
fonte
No meu caso, ao postar de HTTP para HTTPS, o $ _POST vem vazio. O problema era que o formulário tinha uma ação como //example.com. Quando corrigi o url de https://example.com , o problema desapareceu.
fonte
mesmo problema aqui!
Eu estava tentando me conectar ao código do meu servidor local via solicitação de postagem no carteiro, e esse problema me fez perder muito tempo!
para quem usa projeto local (por exemplo, carteiro): use seu endereço IPv4 (digite ipconfig em cmd) em vez da palavra-chave "localhost". No meu caso:
antes:
depois de:
fonte
REFERÊNCIA: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
Método POST
Faremos algumas modificações para que o método POST seja usado ao enviar a solicitação ...
Alguns cabeçalhos http devem ser configurados junto com qualquer solicitação POST. Então, nós os definimos nestas linhas ...
Com as linhas acima, estamos basicamente dizendo que o envio de dados está no formato de um envio de formulário. Também fornecemos o comprimento dos parâmetros que enviamos.
Definimos um manipulador para o evento de mudança de 'estado pronto'. Este é o mesmo manipulador que usamos para o método GET. Você pode usar o http.responseText aqui - insira em um div usando innerHTML (AHAH), eval it (JSON) ou qualquer outra coisa.
Por fim, enviamos os parâmetros com a solicitação. O url fornecido é carregado somente após esta linha ser chamada. No método GET, o parâmetro será um valor nulo. Já no método POST, os dados a serem enviados serão enviados como argumento da função send. A variável params foi declarada na segunda linha como
lorem=ipsum&name=binny
- então enviamos dois parâmetros - 'lorem' e 'nome' com os valores 'ipsum' e 'binny' respectivamente.fonte
No meu caso, era porque eu estava usando jQuery para desabilitar todas as entradas na página antes de usar jQuery para enviar o formulário. Então mudei meu "desabilitar todas as entradas, mesmo os tipos 'ocultos'":
para "desativar apenas as entradas do tipo 'botão'":
Isso acontecia para que o usuário não pudesse acidentalmente apertar o botão 'ir' duas vezes e encher nosso banco de dados! Parece que se você colocar o atributo 'disabled' em um formulário do tipo 'oculto', seus valores não serão enviados se o formulário for enviado!
fonte
Para mim, .htaccess estava redirecionando quando o mod_rewrite não estava instalado. Instale o mod_rewite e está tudo bem.
Especificamente:
estava executando.
fonte
Passei horas resolvendo um problema semelhante. O problema no meu caso era o
por padrão, no php.ini. Tive um formulário realmente enorme sem uploads. php.ini está definido como upload_max_filesize = "100M" e post_max_size = "108M" e certamente não foi o problema no meu caso. O comportamento do PHP é o mesmo para max_input_vars quando excede 1000 variáveis no formulário. Ele retorna uma matriz _POST vazia. Eu gostaria de ter encontrado isso uma hora, e horas atrás.
fonte
Eu sei que isso é antigo, mas queria compartilhar minha solução.
No meu caso, o problema estava no meu .htaccess, pois adicionei variáveis para aumentar o limite máximo de upload do meu PHP. Meu código era assim:
Mais tarde, noto que os valores devem ser xxM e não xxMB e quando mudei para:
agora meu $ _POST retornou os dados normalmente antes. Espero que isso ajude alguém no futuro.
fonte
Além da postagem do MRMage:
Tive que definir essa variável para resolver o problema de que algumas
$_POST
variáveis (com uma grande matriz> 1000 itens) desapareceram:"
request
", não "post
" era a solução ...fonte
Talvez não seja a solução mais conveniente, mas descobri que, se definir o
action
atributo form para o domínio raiz, index.php pode ser acessado e obter as variáveis postadas. No entanto, se eu definir um URL reescrito como ação, ele não funcionará.fonte
Isso é parecido com o que @icesar disse .
Mas eu estava tentando postar coisas na minha api, localizada em
site/api/index.php
, postando apenassite/api
porque é repassadaindex.php
sozinha. Isso, no entanto, aparentemente causou confusão em algo, pois o meu$_POST
foi esvaziado na hora. Basta postarsite/api/index.php
diretamente em vez de resolvê-lo.fonte
Meu problema era que eu estava usando a
<base>
tag HTML para alterar a URL base do meu site de teste. Assim que removi a tag do cabeçalho, os$_POST
dados voltaram.fonte
No meu caso (página php no servidor mutualisé da OVH)
enctype="text/plain"
não funciona ($_POST
e o correspondente$_REQUEST
está vazio), os outros exemplos abaixo funcionam. ``
Mais aqui: method = "post" enctype = "text / plain" não são compatíveis?
fonte
Eu estava recebendo o seguinte erro do Mod Security:
Depois de remover minha configuração de segurança do mod para testar, tudo funcionou conforme o esperado. Agora, só preciso modificar minhas regras para permanecer seguro, mas flexível o suficiente para minhas necessidades :)
fonte
Certifique-se de usar name = " your_variable_name " na tag de entrada.
Por engano, uso id = " your_variable_name ".
Passei muito tempo para pegar o bug.
fonte
Certifique-se de que a
name
propriedade de cada campo esteja definida.Isso cria um POST vazio no PHP
Mas isso vai funcionar
fonte
OK, achei que deveria colocar meu caso aqui .... Eu estava deixando o array post vazio em casos específicos .. O formulário funciona bem, mas às vezes os usuários reclamam que clicam no botão enviar e nada acontece .... Depois de pesquisar um pouco, descobri que minha empresa de hospedagem tem um módulo de segurança que verifica as entradas dos usuários e limpa todo o array de post (não apenas os dados maliciosos) se descobrir. No meu exemplo, um professor de matemática estava tentando inserir a equação: dy + dx + 0 = 0; e os dados foram apagados completamente.
Para corrigir isso, aconselho-o agora a inserir os dados na área de texto como dy + dx + 0 = zero, e agora funciona .... Isso pode economizar algum tempo de alguém ..
fonte