Matriz $ _POST misteriosamente vazia

21

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?

rael_kid
fonte
4
Suhosin pode ser.
Coronel Shrapnel
Ya, suhosin soa como um candidato provável #
SeanJA 30/03
Você poderia dar mais informações? Suhosin está instalado no servidor, devo desligá-lo? Devo alterar as configurações?
31410 Rael_kid
3
Tente isso, ele registrará se for um problema de sihosin. hardened-php.net/suhosin/configuration.html#suhosin.simulation
Tentei ativar o modo de simulação. A matriz ainda está vazia. Eu não consigo encontrar os arquivos de log no entanto ...
rael_kid

Respostas:

2

Funciona sem os índices explícitos? Experimentar:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>
Matthew Groves
fonte
Não, também não funciona.
31410 Rael_kid
Não defina os índices para a matriz de teste - eles estragar a detecção variável POST
adam
2
Ok, eu posso deixá-los de fora. Mas isso não resolve o meu problema.
30910 rael_kid
2

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:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

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 :)

user1360528
fonte
1

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.

joschi
fonte
Esses bugs são semelhantes, mas não são os mesmos que os meus. Tentei definir o tipo de conteúdo (como você pode ver no snippet de código na minha resposta original). Se eu não definir nenhum tipo de conteúdo em tudo isso também não funciona ...
rael_kid
1

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

$Configuration['BASE_URL'] = 'http://my_site.com'

para

$Configuration['BASE_URL'] = 'http://www.my_site.com'

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 ...

Barmaley
fonte
Droga. O redirecionamento também foi meu problema!
Aman Alam
0

Não tenho certeza, mas tendo

name="test[1]"

etc. podem confundir php. Eu mudaria os nomes de entrada para test_1, test_2 e veria o que acontece.


fonte
7
@haavee: Não, o PHP anuncia esse uso: php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn
Eu tentei isso, dessa maneira as variáveis ​​funcionam, mas elas não estão em uma matriz.
30510 Rael_kid
@haavee: Nah, a notação não confunde o PHP, é o uso padrão de formulários PHP +. Veja o link de Boldewyn. :)
ok thx! aprendi algo novo hoje.
1
@ Adam: "Também é possível atribuir chaves específicas às suas matrizes".
0

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.)

Zed
fonte
Meu post_max_size é 8M, acho que seria o suficiente. Meu php.ini não contém nenhuma entrada com suhosin, portanto isso pode ser um problema ... A suhosin possui seus próprios arquivos de configuração?
rael_kid
Não por padrão, mas as configurações de qualquer módulo PHP podem ser definidas por qualquer arquivo em /etc/php5/conf.d em um sistema Debian, e, portanto, presumo também um sistema Ubuntu. Como eu disse, isso foi um tiro no escuro. Ainda assim, começaria diferindo cada arquivo de configuração em um sistema em funcionamento.
quer
0

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
0

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).

gravyface
fonte
0

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
0

O seguinte NÃO deve ajudá-lo. Está contra tudo o que sei da configuração do PHP:

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

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_globalse 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.

ritmo
fonte
0

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.insira a descrição da imagem aqui

E depois de configurá-lo para selecionado - tudo volta ao normal :-)

insira a descrição da imagem aqui

Espero que ajude os futuros leitores

Nikita Kurtin
fonte
0

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.

Chris L.
fonte