Verificare se il modulo è stato inviato - PHP


122

Qual è il modo migliore per verificare se un modulo è stato inviato o meno per determinare se devo passare le variabili del modulo alla mia classe di convalida?

Per prima cosa ho pensato che forse:

isset($_POST)

Ma ciò tornerà sempre vero poiché un superglobale è definito ovunque. Non voglio dover iterare attraverso ogni elemento del mio modulo con:

if(isset($_POST['element1']) || isset($_POST['element2']) || isset(...etc

Mentre scrivevo questa domanda ho pensato a una soluzione molto più semplice, aggiungere un campo nascosto per fungere da flag che posso controllare.

Esiste un modo più "pulito" per farlo piuttosto che aggiungere la mia bandiera?


4
Bene, potresti creare un pulsante di invio con un nome specifico, mi piace submitede quindi utilizzare php if(isset($_POST['submited']))o un input nascosto ...
Max Allan

2
È necessario aggiungere un nome per evitare attacchi di replay sul modulo.
hakre

Risposte:


191

Per un controllo generale se è stata POSTeseguita un'azione, utilizzare:

if (!empty($_POST))

MODIFICA : come indicato nei commenti, questo metodo non funzionerà in alcuni casi (ad esempio con caselle di controllo e pulsanti senza nome). Dovresti davvero usare:

if ($_SERVER['REQUEST_METHOD'] == 'POST')

168

Che ne dite di

if($_SERVER['REQUEST_METHOD'] == 'POST')

69

In realtà, il pulsante di invio esegue già questa funzione.

Prova nel FORM:

<form method="post">
<input type="submit" name="treasure" value="go!">
</form>

Quindi nel gestore PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}

6
Questa è la risposta corretta. Il semplice controllo di $ _POST non è abbastanza buono perché potrebbe essere stato generato da un numero di posti diversi ... non solo da un post del modulo. Grazie Tzshand.
Houston,

Idealmente ora dovresti usare if (null !== (filter_input(INPUT_POST, 'macaddress'))){che ti fa prendere l'abitudine di usare filter_input
depicus

2
Il POST può essere eseguito con Ajax, che non avrà alcun pulsante di invio, quindi questa non è una soluzione universale.
Muhammad bin Yusrat

È vero; può anche controllare qualsiasi variabile inserita da AJAX.
Tzshand

34

Uso

if(isset($_POST['submit'])) // name of your submit button

1
La soluzione più semplice. Tutti i moduli dovrebbero avere un pulsante di invio!
Anh Tran

1
Ma alcuni moduli possono avere più pulsanti.
Progrock

2
@rilwis a volte i moduli sono inviati da JavaScript e non hanno bisogno / hanno un pulsante di invio
Waqas Malik


14

Prova questo

 <form action="" method="POST" id="formaddtask">
      Add Task: <input type="text"name="newtaskname" />
      <input type="submit" value="Submit"/>
 </form>

    //Check if the form is submitted
    if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['newtaskname'])){

    }

2
Questo metodo è il più consigliato, poiché sembra essere riconosciuto come "best practice" dalla "coding academy".
Darkeden

1

In una nota diversa, è anche sempre una buona pratica aggiungere un token al modulo e verificarlo per controllare se i dati non sono stati inviati dall'esterno. Ecco i passaggi:

  1. Genera un token univoco (puoi usare hash) Es:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Assegna questo token a una variabile di sessione. Ex:

    $_SESSION['form_token'] = $token;
  3. Aggiungi un input nascosto per inviare il token. Ex:

    input type="hidden" name="token" value="{$token}"
  4. quindi, come parte della convalida, controlla se il token inviato corrisponde alla sessione var.

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....

0

Ho avuto lo stesso problema: assicurati anche di aggiungere name=""il pulsante di input. Bene, quella correzione ha funzionato per me.

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['add'])){
    echo "stuff is happening now";
}

<input type="submit" name="add" value="Submit">

-6

Puoi anche usare:

is_array($_POST)

4
is_array($_POST)dà sempre vero (sulla mia macchina). Secondo stackoverflow.com/questions/5594020/php-check-if-post-is-array : $_POST is a superglobal array which is always defined, unless somewhere in your code you either unset or overwrite $_POST somehow, così sembra da aspettarsi che questo restituisce sempre vero ..
GitaarLAB

is_array($_POST)non è sicuramente il modo per verificare se il modulo è stato inviato.
Lukas
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.