web-dev-qa-db-fra.com

Comment accéder à la variable 'nom' du formulaire à partir de PHP

J'essaie de créer une calculatrice d'IMC. Cela devrait permettre aux gens d'utiliser des mesures métriques ou impériales.

Je me rends compte que je pourrais utiliser des balises cachées pour résoudre mon problème, mais cela m'ayant déjà posé problème auparavant, je me suis dit: je peux utiliser $_POST['variableName'] pour trouver la valeur de champ variableNameName soumise; mais ... je ne sais pas ou je ne vois pas comment vérifier quel formulaire était utilisé pour soumettre les variables.

Mon code est ci-dessous (même si je ne suis pas sûr que ce soit strictement pertinent pour la question):

<?php
    $bmiSubmitted     = $_POST['bmiSubmitted'];

    if (isset($bmiSubmitted)) {
        $height        = $_POST['height'];
        $weight        = $_POST['weight'];
        $bmi        = floor($weight/($height*$height));

        ?>
            <ul id="bmi">
            <li>Weight (in kilograms) is: <span><?php echo "$weight"; ?></span></li>

            <li>Height (in metres) is: <span><?php echo "$height"; ?></span></li>

            <li>Body mass index (BMI) is: <span><?php echo "$bmi"; ?></span></li>

            </ul>
        <?php
    }

    else {
    ?>

    <div id="formSelector">

    <ul>
        <li><a href="#metric">Metric</a></li>
        <li><a href="#imperial">Imperial</a></li>
    </ul>

        <form name="met" id="metric" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="form/multipart">

            <fieldset>
                <label for="weight">Weight (<abbr title="Kilograms">kg</abbr>):</label>
                    <input type="text" name="weight" id="weight" />

                <label for="height">Height (<abbr title="metres">m</abbr>):</label>
                    <input type="text" name="height" id="height" />

                <input type="hidden" name="bmiSubmitted" id="bmiSubmitted" value="1" />
            </fieldset>

            <fieldset>
                <input type="reset" id="reset" value="Clear" />

                <input type="submit" id="submit" value="Submit" />
            </fieldset>
        </form>

        <form name="imp" id="imperial" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="form/multipart">

            <fieldset>

            <label for="weight">Weight (<abbr title="Pounds">lbs</abbr>):</label>
                <input type="text" name="weight" id="weight" />

            <label for="height">Height (Inches):</label>
                <input type="text" name="height" id="height" /
            <input type="hidden" name="bmiSubmitted" id="bmiSubmitted" value="1" />
            </fieldset>

            <fieldset>
                <input type="reset" id="reset" value="Clear" />
                <input type="submit" id="submit" value="Submit" />
            </fieldset>
        </form>

    <?php
    }
?>

J'ai vérifié que cela fonctionnait (bien que sans validation pour le moment - je ne voulais pas trop encombrer ma question) avec métrique; J'ai ajouté le formulaire mais pas le traitement pour l'impériale pour le moment.

22
David Thomas

Pour identifier le formulaire soumis, vous pouvez utiliser:

  • Un champ de saisie caché.
  • Le nom ou la valeur du bouton d'envoi.

Le nom du formulaire n'est pas envoyé au serveur avec les données POST.

Vous pouvez utiliser le code comme suit

<form name="myform" method="post" action="" enctype="multipart/form-data">
    <input type="hidden" name="frmname" value=""/>
</form>
84
Ayman Hourieh

Vous pouvez le faire comme ça:

<input type="text" name="myform[login]">
<input type="password" name="myform[password]">

Vérifier les valeurs affichées

if (isset($_POST['myform'])) {
    $values = $_POST['myform'];

    // $login = $values['login'];
    // ...
}
14
Seb

Le nom du formulaire n'est pas soumis. Vous devez simplement ajouter un champ caché à chaque formulaire et l'appeler un jour.

13
Paolo Bergantino

Dans le bouton d'envoi de formulaire (la méthode id de formulaire est post):

<input type="submit" value="save" name="commentData">

Dans le fichier PHP:

if (isset($_POST['commentData'])){
    // Code
}
8
Ruwantha

Pour une raison quelconque, le nom du bouton d'envoi n'est pas transmis au super-global $_POST lorsqu'il est soumis avec Ajax/jQuery.

Juste au cas où ça aiderait quelqu'un ...

5
albator

Vous pouvez utiliser GET dans le paramètre d'action du formulaire, que j'utilise chaque fois que je crée une page combinée connexion/enregistrement.

Par exemple: action="loginregister.php?whichform=loginform"

J'espère que cela t'aides!

2
Elttob

Comme le souligne petervandijck.com , ce code peut être sujet à des attaques XSS s'il est caché derrière un système de connexion ou s'il est intégré à un autre code. 

Pour empêcher une attaque XSS, où vous avez écrit:

<?php echo "$weight"; ?>

Vous devriez écrire à la place:

<?php echo htmlentities($weight); ?>

Ce qui pourrait même être mieux écrit comme:

<?=htmlentities($weight); ?>
2
Lachlan McD.

Utilisez une valeur unique sur le bouton d'envoi pour chaque formulaire, comme ceci

index.html

<form method="post" action="bat/email.php">
    <input type="text" name="firstName" placeholder="First name" required>
    <input type="text" name="lastName" placeholder="Last name" required>
    <button name="submit" type="submit" value="contact">Send Message</button>
</form>

<form method="post" action="bat/email.php">
    <input type="text" name="firstName" placeholder="First name" required>
    <input type="text" name="lastName" placeholder="Last name" required>
    <button name="submit" type="submit" value="support">Send Message</button>
</form>

email.php

<?php
    if (isset($_POST["submit"])) {
      switch ($_POST["submit"]) {
          case "contact":
              break;
          case "support":
              break;
          default:
              break;
      }
    }
?>
1
xinthose

Vous pouvez simplement donner un nom au bouton d'envoi et faire ce qui doit être fait en fonction de cela. J'ai plusieurs formulaires sur une page et je ne fais que cela. Transmettez le nom du bouton, puis si nom-bouton = nom du bouton faites quelque chose.

0
Adrian Fischer

Seuls les noms des champs de formulaire sont soumis, le nom du formulaire lui-même ne l’est pas. Mais vous pouvez définir un champ caché avec son nom.

0
Gumbo

Vous réalisez cela avec echo $ height; vous ouvrez une faille de sécurité très grave dans votre application, n'est-ce pas?

0
PeterV