Vérifier si le formulaire a été soumis - PHP

122

Quelle est la meilleure façon de vérifier si un formulaire a été soumis ou non pour déterminer si je dois transmettre les variables du formulaire à ma classe de validation?

J'ai d'abord pensé peut-être:

isset($_POST)

Mais cela reviendra toujours vrai car un super-global est défini partout. Je ne veux pas avoir à parcourir chaque élément de mon formulaire avec:

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

En écrivant cette question, j'ai pensé à une solution beaucoup plus basique, ajouter un champ caché pour agir comme un drapeau que je peux vérifier.

Y a-t-il un moyen plus «plus propre» de le faire que d'ajouter mon propre drapeau?

Anonyme
la source
4
Eh bien, vous pouvez créer un bouton d'envoi qui a un nom spécifique, comme submitedpuis utiliser le php if(isset($_POST['submited']))ou une entrée cachée ...
Max Allan
2
Vous devez ajouter un nounce pour empêcher les attaques de relecture sur votre formulaire.
hakre

Réponses:

191

Pour vérifier en général s'il y a eu une POSTaction, utilisez:

if (!empty($_POST))

EDIT : Comme indiqué dans les commentaires, cette méthode ne fonctionnera pas dans certains cas (par exemple avec des cases à cocher et un bouton sans nom). Vous devriez vraiment utiliser:

if ($_SERVER['REQUEST_METHOD'] == 'POST')
matino
la source
168

Que diriez-vous

if($_SERVER['REQUEST_METHOD'] == 'POST')
Olaf
la source
69

En fait, le bouton d'envoi remplit déjà cette fonction.

Essayez dans le FORMULAIRE:

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

Puis dans le gestionnaire PHP:

if (isset($_POST['treasure'])){
echo "treasure will be set if the form has been submitted (to TRUE, I believe)";
}
Tzshand
la source
6
C'est la bonne réponse. La simple vérification de $ _POST n'est pas suffisante car elle aurait pu être générée à partir d'un certain nombre d'endroits différents ... pas seulement à partir d'un message de formulaire. Merci Tzshand.
Houston
Idéalement maintenant, vous devriez utiliser if (null !== (filter_input(INPUT_POST, 'macaddress'))){ce qui vous donne l'habitude d'utiliser filter_input
depicus
2
Le POST peut être fait avec Ajax, qui n'a pas de bouton d'envoi, ce n'est donc pas une solution universelle.
Muhammad bin Yusrat
C'est vrai; il peut également vérifier toute variable publiée par AJAX.
Tzshand
34

Utilisation

if(isset($_POST['submit'])) // name of your submit button
Rikesh
la source
1
La solution la plus simple. Tous les formulaires doivent avoir un bouton d'envoi!
Anh Tran
1
Mais certains formulaires peuvent avoir plusieurs boutons.
Progrock
2
@rilwis parfois les formulaires sont soumis par JavaScript et n'ont pas besoin / n'ont pas de bouton d'
envoi
28

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

CodeCaster
la source
14

Essaye ça

 <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'])){

    }
Rizon
la source
2
Cette méthode est la plus recommandée, car elle semble être reconnue comme "meilleure pratique" par la "coding academy".
Darkeden
1

Sur une note différente, il est également toujours recommandé d'ajouter un jeton à votre formulaire et de le vérifier pour vérifier si les données n'ont pas été envoyées de l'extérieur. Voici les étapes:

  1. Générez un jeton unique (vous pouvez utiliser le hachage) Ex:

    $token = hash (string $algo , string $data [, bool $raw_output = FALSE ] );
  2. Attribuez ce jeton à une variable de session. Ex:

    $_SESSION['form_token'] = $token;
  3. Ajoutez une entrée masquée pour soumettre le jeton. Ex:

    input type="hidden" name="token" value="{$token}"
  4. puis dans le cadre de votre validation, vérifiez si le jeton soumis correspond à la var de session.

    Ex: if ( $_POST['token'] === $_SESSION['form_token'] ) ....
Professeur
la source
0

J'ai eu le même problème - assurez-vous également d'ajouter name=""le bouton d'entrée. Eh bien, ce correctif a fonctionné pour moi.

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

<input type="submit" name="add" value="Submit">
Jen
la source
-6

Vous pouvez également utiliser:

is_array($_POST)
SW4
la source
4
is_array($_POST)donne toujours vrai (sur ma machine). Selon 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, il semble donc normal que cela retourne toujours vrai ..
GitaarLAB
is_array($_POST)n'est certainement pas le moyen de vérifier si le formulaire a été soumis.
Lukas