Verifique se $ _POST existe


100

Estou tentando verificar se um $ _POST existe e se existir, imprima-o dentro de outra string, se não, não imprima nada.

algo assim:

$fromPerson = '+from%3A'.$_POST['fromPerson'];

function fromPerson() {
    if !($_POST['fromPerson']) {
        print ''
    } else {
        print $fromPerson
    };
}

$newString = fromPerson();

Qualquer ajuda seria ótimo!

Respostas:


171
if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}

60

Simples. Você tem duas opções:

1. Verifique se há ALGUNS dados de postagem

//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
    // handle post data
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

(OU)

2. Verifique apenas se uma chave PARTICULAR está disponível nos dados de postagem

if (isset($_POST['fromPerson']) )
{
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

De acordo com o comentário de Shi sobre a resposta de Augusto Francis , nãoempty() é correto para a escolha # 1, porque em php, a string é equivalente a - e retorna para todos os valores equivalentes a false . Portanto , usando , o código pularia a impressão se o valor fosse . Se você quiser excluir a string vazia, veja a resposta de Augustus. '0'falseempty()trueempty'0'
Toolmaker Steve

33

Todo mundo está dizendo para usar isset () - que provavelmente funcionará para você.

No entanto, é importante que você entenda a diferença entre

$_POST['x'] = NULL; e $_POST['x'] = '';

isset($_POST['x'])retornará falseno primeiro exemplo, mas retornará trueno segundo, mesmo que se você tentasse imprimir qualquer um deles, ambos retornariam um valor em branco.

Se você $_POSTvier de um campo / formulário inserido pelo usuário e for deixado em branco, ACREDITO (não estou 100% certo disso) que o valor será "", mas NÃO NULO.

Mesmo que essa suposição esteja incorreta (alguém, por favor, me corrija se eu estiver errado!), O acima ainda é bom saber para uso futuro.


4
empty () verifica a existência de variável e um valor não vazio, então essa é a função a ser usada quando uma string vazia deve retornar falso.
Han Dijk

1
@HanDijk - de acordo com o comentário de Shi sobre a resposta de Augustus Francis , nãoempty() está correto aqui, porque em php, a string é equivalente a - e retorna para todos os valores equivalentes a false . Portanto , usando , o código pularia a impressão se o valor fosse . '0'falseempty()trueempty'0'
Toolmaker Steve

30

Surpreso por não ter sido mencionado

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){

2
Por quê? Se o método do servidor não for POST, a variável POST não será definida, portanto, a segunda metade é tudo o que é necessário. Estou errado?
ToolmakerSteve

@ToolmakerSteve sim na maioria dos casos isso é suficiente, mas nem sempre minha resposta foi mostrar outra maneira de fazer isso.
John Magnolia

Também funcionará se você tiver um formulário com caixas de seleção e enviar sem um nome.
John Magnolia

2
Descreva uma situação em que isset($_POST['fromPerson']é true, embora if($_SERVER['REQUEST_METHOD'] == 'POST'seja false. A menos que haja tal situação, tudo o que é necessário é a isset...parte.
Toolmaker Steve

É verdade, mas é o contrário. fromPersonpode não estar presente, mas POST ainda pode existir. A pergunta era: "Se $ _POST existir." e apenas em um exemplo, $ _POST ['fromPerson'] é usado. Em algumas situações, como @goat descreve aqui , mesmo se fromPersonfosse um nome de envio , ele pode não estar presente no POST.
papo


13

A maneira adequada de verificar se a chave de array existe é a função array_key_exists()

A diferença é que quando você tem $_POST['variable'] = nullisso significa que a chave existe e foi enviada, mas o valor era nulo

A outra opção é a isset()que irá verificar se a chave do array existe e se foi definida

A última opção é usar o empty()que irá verificar se a chave do array existe se está definida e se o valor não é considerado vazio.

Exemplos:

$arr = [
  'a' => null,
  'b' => '',
  'c' => 1
];

array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true


array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true


array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false

Quanto à sua pergunta

A maneira correta de verificar se o valor foi enviado é usar array_key_exists () com verificação do método de solicitação

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
{
   // logic
}

Mas há alguns casos que dependem de sua lógica isset()e empty()podem ser bons também.


Resposta fantástica, exceto pela sugestão de uso empty. De acordo com o comentário de Shi sobre a resposta de Augustus Francis , nãoempty() está correto como uma escolha alternativa, porque em php, a string é equivalente a - e retorna para todos os valores equivalentes a false . Portanto , usando , o código pularia a impressão se o valor fosse . Se você quiser excluir a string vazia, veja a resposta de Augustus. '0'falseempty()trueempty'0'
Toolmaker Steve

Melhor resposta +1.
Viktor Joras

9
  • Nesse caso, usar o método issetnão é apropriado.

De acordo com a documentação do PHP: http://php.net/manual/en/function.array-key-exists.php
(veja o Exemplo # 2 array_key_exists () vs isset () )
O método array_key_existsdestina-se a verificar a presença da chave no array.

Portanto, o código da pergunta pode ser alterado da seguinte forma:

function fromPerson() {
   if (array_key_exists('fromPerson', $_POST) == FALSE) {
        return '';
   } else {
        return '+from%3A'.$_POST['fromPerson'];
   };
}

$newString = fromPerson();


  • Verificar a presença do array $ _POST não é necessário porque é uma variável global do ambiente PHP desde a versão 4.1.0 (atualmente não encontramos versões anteriores do PHP).

Este código só difere da issetsolução em comportamento quando o campo de postagem é definido, mas contém NULL. Esta é uma boa alternativa , se você quiser permitir NULLno elseramo. No entanto , é um erro, se uma string for necessária; nessa situação issetfaz a coisa certa, mas este código não - ele vai passar o NULLvalor adiante. A resposta posterior de Robert demonstra a diferença.
ToolmakerSteve

6

Todos os métodos são desencorajados, é um aviso no Netbeans 7.4 e certamente é uma boa prática não acessar variáveis ​​superglobais diretamente, use um filtro em vez

$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);

1
Por outro lado, a LEITURA do código também é importante. IMHO, isseté muito mais legível do que uma expressão de filtro. Mas obrigado por apontar isso; é uma opção útil a se considerar.
Toolmaker Steve

bem, você pode escrever seu próprio método de wrapper myIsset / 2 que usa filtros, mas tem o comportamento de isset / 2
linuxatico

"Todos os métodos são desencorajados" - essa é uma afirmação forte (mesmo que o NetBeans marque como um aviso). Você tem um link para uma fonte autorizada , que desencoraja referências diretas a $ _POST? (Há muito sobre o php que é projetado para a conveniência de codificação ao invés do rigor - veja quantas pessoas nas respostas a esta pergunta usam incorretamente empty, atrapalhou-se com a digitação solta do php; é difícil imaginar que acessar $ _POST seria considerado ruim estilo.)
ToolmakerSteve

4

Experimentar

if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
    echo "Cool";
}

O comentário de Per Han Dijk sobre a resposta de Rafael empty($_POST['fromPerson'])faz esse teste combinado. Mais fácil de ler e digitar :)
ToolmakerSteve

@ToolmakerSteve: empty('0')retorna true. Portanto, não é o mesmo.
Shi

1
@Shi - sim, você está correto; o que eu disse está errado! Parece que não há solução mais simples do que o código mostrado aqui.
Toolmaker Steve


3
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
    echo 'blah' . $_POST['fromPerson'];
}

1
O is_array ($ _ POST) verifica se há algum valor no POST? No meu aplicativo estou tentando determinar se houve uma postagem ou não antes de fazer qualquer outra coisa.
Jeff LaFay

1
Veja minha edição. is_array()verifica se é um array, a segunda parte verifica se há um item com a chave 'fromPerson'.
jezmck de

2

if( isset($_POST['fromPerson']) ) está certo.

Você pode usar uma função e retornar, melhor do que direcionar o eco.


2
Essa resposta não acrescenta nada à discussão, que já não foi dito em outras respostas, anos antes.
Toolmaker Steve

1

Gosto de verificar se está configurado e se está vazio em um operador ternário.

// POST variable check
$userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
$line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
$message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
$source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
$version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
$release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;

5
empty('0')é true. Então é melhor não ter version 0, ou userID 0, etc.
Shi

0

Eu gostaria de adicionar minha resposta, embora este tópico tenha anos e tenha uma boa classificação no Google para mim.

Meu melhor método é tentar:

if(sizeof($_POST) !== 0){
// Code...
}

Como $_POSTé um array, se o script carregar e nenhum dado estiver presente na $_POSTvariável, ele terá um comprimento de array de 0. Isso pode ser usado em uma instrução IF.

Você também pode estar se perguntando se isso gera um erro de "índice indefinido", visto que estamos verificando se $_POSTestá definido ... Na verdade, $_POSTsempre existe, o erro "índice indefinido" só aparecerá se você tentar pesquisar por $ _POST valor da matriz que não existe.

$_POSTsempre existe em si mesmo sendo vazio ou tem valores de matriz. $_POST['value']pode não existir, gerando assim um erro de "índice indefinido".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.