Eu tenho a seguinte 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 você pode ver, o formulário será enviado e a saída esperada é uma matriz POST com uma matriz contendo os valores preenchidos e uma entrada "ação" com o valor "Ir" (o botão). No entanto, não importa quais valores eu insiro nos campos; o resultado é sempre:
array(2) {
["test"]=>
string(0) ""
["action"]=>
string(2) "Go"
}
string(16) "test=&action=Go&"
De alguma forma, a matriz denominada test é esvaziada, a variável "action" faz isso.
Usei a extensão Live HTTP Headers do Firefox para verificar se os campos POST são enviados e o fazem. As informações relevantes dos cabeçalhos HTTP ativos (com a, bec preenchidos como valores nas caixas 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
Alguém tem alguma idéia de por que isso está acontecendo? Estou enlouquecendo com isso, já me custou muito tempo ...
Atualizar:
Nós tentamos isso em diferentes servidores, nas caixas do Windows que funcionam, no servidor Ubuntu com PHP versão 5.2.4 (com Suhosin), não. Até funciona em um servidor diferente, também com o Ubuntu e a mesma versão PHP, também com o Suhosin instalado.
Eu diferenciei os dois arquivos, esta é a saída ( 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
>
Neste, o phps.ini é o servidor em que trabalha e o php.ini é o atual. Parece que não há problemas aqui, certo?
Respostas:
Funciona sem os índices explícitos? Experimentar:
fonte
Há várias razões possíveis pelas quais a matriz de postagem pode estar vazia - é provável que ela volte ao erro humano / desenvolvedor. Eu experimentei esse problema exato ao atualizar do PHP 5.2 para 5.4, era simples, mas levamos horas para solucionar o problema. Em nosso arquivo config.php, tínhamos a instrução abaixo para processar matrizes $ _POST:
As aspas mágicas estavam ativadas uma vez e, nas versões PHP até 5.2, o acima funcionou bem, mas qualquer coisa acima da versão 5.2 não será processada e uma matriz vazia será retornada.
Se você não
error_reporting()
ativou, sugiro que sim, e tenho certeza de que poderá solucionar o problema.Você também deve verificar os recursos obsoletos do sistema, como "
magic_quotes
", pois o uso deles simplesmente falha ao retornar resultados. Eu espero que isso ajude. Boa sorte. JCS :)fonte
Existem relatórios de erros sobre este ou outros problemas semelhantes no bugtracker do PHP:
Infelizmente, ele não menciona uma solução, mas você pode tentar definir outro CONTENT_TYPE ou nenhum tipo de conteúdo.
fonte
Teve um problema bastante semelhante. Bem, antes de tudo, levei um bom tempo para chegar a este post. Para descobrir o nome do meu problema, tive que instalar o console do PHP, descobrir como usá-lo. Depure o código que eu não sabia nada. Chegue à raiz do problema e ainda fique intrigado.
A solução era bem simples, na verdade. No Chrome, pressione F12 para acessar as ferramentas do desenvolvedor, selecione Rede, tente postar seu formulário. Rastreie a solicitação de postagem, veja o status. Se for 301 (ou qualquer outra coisa que não seja 200) - você está tendo o mesmo problema exato que eu estava tendo até recentemente!
Meu novo provedor de host estava redirecionando http://my_site.com para http://www.my_site.com . Tudo o que eu precisava fazer era alterar algumas configurações como parte do meu CMS (o seu pode ser diferente, mas de certa forma) de
para
E pronto, a mágica e os arco-íris e os unicórnios e meu site finalmente está funcionando!
PS Mexer nas configurações de hospedagem também pode resolver o seu problema ... Se o seu problema é semelhante ao meu, é claro ...
fonte
Não tenho certeza, mas tendo
etc. podem confundir php. Eu mudaria os nomes de entrada para test_1, test_2 e veria o que acontece.
fonte
No PHP base, posso pensar em apenas uma opção de configuração que poderia quebrar isso, que é
post_max_size
, portanto, verifique o php.ini e os arquivos relacionados para garantir que esse valor seja sensato e não definido como zero ou um valor inválido como um caractere alfabético .Suhosin torna possível bloquear variáveis de postagem em uma variedade de condições, incluindo itens como comprimento da matriz e comprimento do nome da variável. Cumprimente seus arquivos php.ini por 'suhosin' para ver se há alguma configuração presente, particularmente qualquer coisa que comece com 'suhosin.post'. (Consulte http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth para obter mais detalhes sobre os parâmetros em que estou pensando.)
Infelizmente, com exceção de uma grande falha na configuração que define algum valor como um ou zero, seu código (e variáveis) são curtos o suficiente para que isso seja um tiro no escuro. Se isso ficar em branco, minha próxima sugestão seria fazer backup das configurações do Apache e PHP, remover os diretórios, remover os pacotes, reinstalar e começar a colocar os pedaços de configuração no lugar até que o código pare de funcionar novamente (alternativamente, comece a atualizar o servidor que está trabalhando com configurações do servidor que não funciona até que ambos estejam quebrados). Como você tem um servidor com o mesmo sistema operacional e PHP funcionando corretamente, isso quase certamente é um erro de configuração no servidor com defeito em algum lugar, mas é um palheiro muito grande para pesquisar.
O controle de versão do / etc é altamente recomendado antes de você começar isso - consulte o pacote etckeeper. (Na verdade, eu recomendo seu uso, ponto final. Grande economia de sanidade, principalmente em uma máquina em que mais de uma pessoa tem acesso root.)
fonte
Estou tendo falhas de envio de formulários em todo o lugar desde que atualizei para o Debian "testing" de "stable". Parece que o apache2 ou php5 não está lidando com vários itens no envio com o mesmo nome. Por exemplo; seu formulário possui duas entradas, nome "mo". No passado, apenas um dos valores para "mo" passava. Agora, o formulário parece descartar todos os dados após a primeira ocorrência de uma chave duplicada. Ainda não tenho certeza. Ainda tentando descobrir.
fonte
Tente copiar o php.ini do servidor que funciona para este (faça backup do php.ini do servidor que não está funcionando primeiro). Se isso acontecer, existe alguma coisa lá (talvez a ordem das variáveis, ou possivelmente a memória, ambas improváveis).
fonte
Tente renomear seu botão de envio para algo diferente de ação. Eu tive alguns problemas com isso no passado. Ter uma entrada chamada 'action' parece ser o problema.
fonte
O seguinte NÃO deve ajudá-lo. Está contra tudo o que sei da configuração do PHP:
Este pulou em mim. Seus superglobais estão sendo registrados em diferentes ordens. Isso simplesmente não deve ser um problema, porque como você não está usando
register_globals
e não depende deles, não deve ser um problema alterar a ordem na qual as variáveis de ordem estão sendo processadas.Mas você definitivamente deve tentar e alterar a ordem das variáveis.
fonte
Até esse OP é bem antigo, mas hoje encontrei um problema semelhante.
Depois de passar algumas horas verificando milhões de coisas diferentes várias vezes, finalmente descobrimos que, após a última atualização da versão do PHP 5.6.17 em nosso cPanel nas configurações de padrões do PHP, o http não foi selecionado.
E depois de configurá-lo para selecionado - tudo volta ao normal :-)
Espero que ajude os futuros leitores
fonte
Se isso puder ajudar alguém ... Passei horas para corrigir um problema semelhante e o problema era o limite max_input_vars = "1000" do php.ini. Certifique-se de verificar os valores php.ini de upload_max_filesize, post_max_size e max_input_vars. Exceder um resultará em uma matriz $ _POST vazia.
fonte