Controlla se esiste $ _POST


101

Sto cercando di verificare se esiste un $ _POST e, in caso affermativo, stampalo all'interno di un'altra stringa, in caso contrario, non stampare affatto.

qualcosa come questo:

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

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

$newString = fromPerson();

Qualsiasi aiuto sarebbe grande!

Risposte:


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

60

Semplice. Hai due scelte:

1. Controlla se ci sono QUALSIASI dati di post

//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;
}

(O)

2. Controlla solo se una chiave PARTICOLARE è disponibile nei dati del post

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

Secondo il commento di Shi sulla risposta di Augustus Francis , nonempty() è corretto per la scelta n. 1, perché in php, la stringa è equivalente a - e restituisce per tutti i valori equivalenti a false . Quindi , utilizzando , il codice salterà la stampa se il valore fosse . Se vuoi escludere la stringa vuota, vedi la risposta di Augustus. '0'falseempty()trueempty'0'
ToolmakerSteve

33

Tutti dicono di usare isset (), che probabilmente funzionerà per te.

Tuttavia, è importante comprendere la differenza tra

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

isset($_POST['x'])tornerà falsesul primo esempio, ma tornerà truesul secondo anche se se provassi a stamparne uno, entrambi restituirebbero un valore vuoto.

Se $_POSTprovieni da un campo / modulo inserito dall'utente e viene lasciato vuoto, CREDO (non ne sono certo al 100%) che il valore sarà "" ma NON NULLO.

Anche se questa ipotesi non è corretta (qualcuno mi corregga se sbaglio!) Quanto sopra è comunque buono da sapere per un uso futuro.


4
empty () controlla l'esistenza di una variabile e un valore non vuoto, quindi questa è la funzione da usare quando una stringa vuota deve restituire false.
Han Dijk

1
@HanDijk - come da commento di Shi sulla risposta di Augustus Francis , nonempty() è corretto qui, perché in php, la stringa è equivalente a - e restituisce per tutti i valori equivalenti a false . Quindi , utilizzando , il codice salterà la stampa se il valore fosse . '0'falseempty()trueempty'0'
ToolmakerSteve

30

Sorpreso non è stato menzionato

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

2
Perché? Se il metodo del server non è POST, la variabile POST non verrà impostata, quindi la seconda metà è tutto ciò che è necessario. Ho sbagliato?
ToolmakerSteve

@ToolmakerSteve sì nella maggior parte dei casi è sufficiente, ma non sempre la mia risposta è stata quella di mostrare un altro modo in cui potrebbe essere fatto.
John Magnolia

Funzionerà anche se hai un modulo con caselle di controllo e lo invii senza un nome.
John Magnolia

2
Descrivi una situazione in cui isset($_POST['fromPerson']è true, anche se if($_SERVER['REQUEST_METHOD'] == 'POST'è false. A meno che non ci sia una situazione del genere, tutto ciò che serve è la isset...parte.
ToolmakerSteve

Vero, ma è il contrario. fromPersonpotrebbe non essere presente, ma POST potrebbe ancora esistere. La domanda era: "Se $ _POST esiste". e solo in un esempio, viene utilizzato $ _POST ['fromPerson']. In alcune situazioni, come @goat descrive qui , anche se fromPersonfosse un nome di invio , potrebbe non essere presente in POST.
papo


13

Il modo corretto per verificare se esiste la chiave dell'array è la funzione array_key_exists()

La differenza è che quando ce l'hai $_POST['variable'] = nullsignifica che la chiave esiste ed è stata inviata ma il valore era nullo

L'altra opzione è quella isset()che controllerà se la chiave dell'array esiste e se è stata impostata

L'ultima opzione è usare empty()che controllerà se la chiave dell'array esiste se è impostata e se il valore non è considerato vuoto.

Esempi:

$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

Per quanto riguarda la tua domanda

Il modo corretto per verificare se il valore è stato inviato è utilizzare array_key_exists () con il metodo di controllo della richiesta

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

Ma ci sono alcuni casi che dipendono dalla tua logica isset()e empty()possono essere buoni.


Risposta fantastica, tranne che per il suggerimento da utilizzare empty. Come da commento di Shi alla risposta di Augustus Francis , nonempty() è corretta come scelta alternativa, perché in php la stringa è equivalente a - e restituisce per tutti i valori equivalenti a false . Quindi , utilizzando , il codice salterà la stampa se il valore fosse . Se vuoi escludere la stringa vuota, vedi la risposta di Augustus. '0'falseempty()trueempty'0'
ToolmakerSteve

Migliore risposta +1.
Viktor Joras

9
  • In tal caso, l'utilizzo del metodo issetnon è appropriato.

Secondo la documentazione PHP: http://php.net/manual/en/function.array-key-exists.php
(vedi Esempio # 2 array_key_exists () vs isset () )
Il metodo array_key_existsè inteso per controllare la presenza della chiave nell'array.

Quindi il codice nella domanda potrebbe essere modificato come segue:

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

$newString = fromPerson();


  • La verifica della presenza dell'array $ _POST non è necessaria perché è una variabile globale d'ambiente PHP dalla versione 4.1.0 (al giorno d'oggi non si incontrano versioni precedenti di PHP).

Questo codice differisce solo nel comportamento dalla issetsoluzione quando il campo del post è impostato ma contiene NULL. Questa è una buona alternativa , se vuoi consentire NULLnel elseramo. Tuttavia , è un errore se è necessaria una stringa; in quella situazione issetfa la cosa giusta, ma questo codice no - trasmetterà il NULLvalore. La risposta successiva di Robert dimostra la differenza.
ToolmakerSteve

6

Tutti i metodi sono effettivamente scoraggiati, è un avvertimento in Netbeans 7.4 ed è sicuramente una buona pratica non accedere direttamente alle variabili superglobali, utilizzare invece un filtro

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

1
D'altra parte, anche la LEGGIBILITÀ del codice è importante. IMHO, issetè molto più leggibile di un'espressione di filtro. Ma grazie per averlo fatto notare; è un'opzione utile da considerare.
ToolmakerSteve

beh, puoi scrivere il tuo metodo wrapper myIsset / 2 che usa filtri ma ha il comportamento di isset / 2
linuxatico

"Tutti i metodi sono effettivamente scoraggiati" - questa è un'affermazione forte (anche se NetBeans lo contrassegna come avvertimento). Hai un link a una fonte autorevole , che scoraggia i riferimenti diretti a $ _POST? (C'è molto di php progettato per la comodità di codifica piuttosto che per il rigore: guarda quante persone nelle risposte a questa domanda usano in modo errato empty, inciampate dalla digitazione libera di php; è difficile immaginare che l'accesso a $ _POST sarebbe considerato scadente style.)
ToolmakerSteve

4

Provare

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

Il commento di Han Dijk sulla risposta di Rafael, empty($_POST['fromPerson'])fa questo test combinato. Più facile da leggere e da digitare :)
ToolmakerSteve

@ToolmakerSteve: empty('0')ritorna true. Quindi non è la stessa cosa.
Shi

1
@ Shi - sì, hai ragione; quello che ho detto è sbagliato! Sembra che non ci sia una soluzione più semplice del codice mostrato qui.
ToolmakerSteve


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

1
Is_array ($ _ POST) controlla se ci sono valori in POST? Nella mia app sto cercando di determinare se c'era un post o meno prima di fare qualsiasi altra cosa.
Jeff LaFay

1
Vedi la mia modifica. is_array()controlla se è un array, la seconda parte controlla se ha un elemento con la chiave 'fromPerson'.
jezmck

2

if( isset($_POST['fromPerson']) ) è giusto.

Puoi usare una funzione e tornare, meglio che dirigere l'eco.


2
Questa risposta non aggiunge nulla alla discussione, che non era già stata detta in altre risposte, anni prima.
ToolmakerSteve

1

Mi piace controllare se è impostato e se è vuoto in un operatore ternario.

// 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. Quindi meglio non avere version 0, o userID 0, ecc.
Shi

0

Vorrei aggiungere la mia risposta anche se questo thread è vecchio di anni e per me si è classificato in alto in Google.

Il mio metodo migliore è provare:

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

Poiché $_POSTè un array, se lo script viene caricato e non sono presenti dati nella $_POSTvariabile, avrà una lunghezza di array pari a 0. Può essere utilizzato in un'istruzione IF.

Potresti anche chiederti se questo genera un errore di "indice non definito" visto che stiamo controllando se $_POSTè impostato ... In effetti $_POSTesiste sempre, l'errore "indice non definito" apparirà solo se provi a cercare un $ _POST valore dell'array che non esiste.

$_POSTesiste sempre di per sé essendo vuoto o ha valori di matrice. $_POST['value']potrebbe non esistere, generando così un errore di "indice non definito".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.