Matriz $ _POST misteriosamente vazia

20

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 "action" com o valor "Go" (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, o array chamado test é esvaziado, a variável "action" é transmitida.

Eu usei a extensão Live HTTP Headers para o Firefox para verificar se os campos POST são enviados e o que eles fazem. As informações relevantes dos cabeçalhos HTTP ao vivo (com a, b e c 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 pirando com isso, já me custou tanto tempo ...

Atualização:

Nós tentamos isso em servidores diferentes, nas caixas do Windows ele funciona, no servidor Ubuntu com a versão 5.2.4 do PHP (com Suhosin), não funciona. Ele ainda funciona em um servidor diferente, também com o Ubuntu e a mesma versão do PHP, também com o Suhosin instalado.

Eu diferenciei os dois arquivos, essa é 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 phps.ini é aquele do servidor em que funciona e php.ini é o atual. Parece que não há problemas aqui, né?

    
por rael_kid 30.03.2010 / 13:19

12 respostas

2

Funciona sem os índices explícitos? Experimente:

<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>
    
por 30.03.2010 / 13:51
2

Existem várias razões possíveis pelas quais o array de post pode estar vazio - há chances de que ele volte ao erro de desenvolvedor / humano. Eu experimentei esse problema exato ao atualizar do PHP 5.2 para o 5.4, foi simples, mas levou horas de solução de problemas para encontrar o bug. Em nosso arquivo config.php, tivemos a declaração abaixo para processar as matrizes $ _POST:

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

As citações mágicas já foram feitas, e nas versões do 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 tiver o error_reporting() ativado, sugiro que o faça e tenho certeza de que conseguirá resolver o problema.

Você também deve verificar os recursos preteridos do sistema, como " magic_quotes ", pois usá-los simplesmente não retorna os resultados. Eu espero que isso ajude. Boa sorte. JCS:)

    
por 06.05.2013 / 10:01
1

Existem relatos de erros sobre este ou outros problemas semelhantes no bugtracker do PHP:

Infelizmente, não menciona uma solução, mas você poderia tentar definir outro CONTENT_TYPE ou nenhum tipo de conteúdo.

    
por 31.03.2010 / 08:16
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, eu 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 foi bem simples na verdade. No Chrome, pressione F12 para acessar as ferramentas do desenvolvedor, selecione Rede e tente postar seu formulário. Rastrear solicitação de postagem, observe o status. Se o seu 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 hospedagem estava redirecionando o link para o link , tudo o que eu tive que fazer é alterar algumas configurações como parte do meu CMS (o seu pode ser diferente, mas similar de alguma forma) de

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

para

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

E voila, a mágica e os arco-íris e os unicórnios e meu site estão finalmente trabalhando!

P.S. Mexer com suas configurações de hospedagem também pode resolver o seu problema ... Se o seu problema é semelhante ao meu, é claro ...

    
por 15.11.2015 / 23:16
0

Não tenho certeza, mas tenho

name="test[1]"

pode confundir php. Eu mudaria os nomes de entrada para test_1, test_2 e ver o que acontece.

    
por 30.03.2010 / 13:23
0

No PHP base, eu posso pensar em apenas uma opção de configuração que poderia quebrar isso, que é post_max_size , então verifique seu php.ini e arquivos relacionados para ter certeza de que esse valor é são e não configurado para 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 coisas como comprimento de array e comprimento de nome de variável. Grep seus arquivos php.ini para 'suhosin' para ver se há configurações presentes, especialmente qualquer coisa começando com 'suhosin.post'. (Veja link para mais detalhes sobre os parâmetros que estou pensando.)

Infelizmente, salvo uma grande falha na configuração que definiu algum valor para um ou zero, seu código (e variáveis) são curtos o suficiente para que isso seja um pouco difícil. Se isso vier em branco, minha próxima sugestão seria fazer backup de suas configurações do Apache e PHP, atacar seus diretórios, limpar os pacotes, reinstalar e começar a colocar pedaços de configuração de volta no lugar até que o código pare de funcionar novamente (alternativamente, comece a atualizar esse servidor que está trabalhando com configurações do servidor não funcionante até que ambos estejam quebrados). Como você tem o mesmo servidor OS-PHP funcionando corretamente, isso é quase certamente um erro de configuração no servidor com defeito em algum lugar, mas esse é um palheiro bastante grande para pesquisar.

O controle de versão de / etc é altamente recomendado antes de você começar isto - olhe no pacote etckeeper. (Na verdade, eu recomendo o seu uso, ponto. Grande protetor de sanidade, especialmente em uma máquina onde mais de uma pessoa tem acesso root.)

    
por 02.04.2010 / 16:46
0

Estou tendo falhas de submissão de formulário em todo o lugar desde que eu atualizei para o Debian "testing" de "stable". Parece que o apache2 ou php5 não está manipulando vários itens no envio com o mesmo nome. Por exemplo; seu formulário tem duas entradas, o nome "mo". No passado, apenas um dos valores para "mo" iria passar. Agora o formulário parece eliminar todos os dados após a primeira ocorrência de uma chave duplicada. Ainda não tenho certeza. Ainda tentando descobrir isso.

    
por 09.04.2010 / 19:26
0

Tente copiar o php.ini do servidor que funciona para este (backup do php.ini do servidor que não funciona primeiro). Se isso acontecer, é algo lá (talvez o variables_order, ou possivelmente a memória, ambos improváveis).

    
por 09.04.2010 / 19:39
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 'ação' parece ser o problema.

    
por 16.09.2010 / 18:08
0

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

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

Este pulou em cima de mim. Seus superglobais estão sendo registrados em diferentes pedidos. Isso 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ê deve definitivamente tentar e mudar a ordem das variáveis.

    
por 01.12.2010 / 10:43
0

Mesmo esse OP é bem antigo, mas hoje encontrei um problema parecido.

Depois de passar algumas horas checando milhões de coisas diferentes repetidas vezes, eventualmente descobri que após a última atualização da versão PHP 5.6.17 em nosso cPanel nas configurações padrão do PHP o link não foi selecionado.

Edepoisdeconfigurá-loparaselecionado-tudodevoltaaonormal:-)

Espero que ajude os futuros leitores

    
por 17.02.2016 / 17:52
0

Se isso puder ajudar qualquer outra pessoa ... eu passei horas apenas para corrigir um problema semelhante e o problema era o limite max_input_vars="1000" do arquivo php.ini. Certifique-se de verificar os valores do arquivo php.ini de upload_max_filesize, post_max_size e max_input_vars. Exceder um resultará com um array $ _POST vazio.

    
por 22.08.2018 / 04:24

Tags