[RESOLU] Incrémenter et récupérer les données d'un formulaire

Eléphanteau du PHP | 25 Messages

31 oct. 2022, 10:23

Bonjour à toutes et tous,

Je débute en PHP et en programmation en général.
Pour assimiler les notions que j'apprends au fur et à mesure je me lance des exercices.
Je cherche beaucoup sur le net pour m'aider à comprendre mais là je tourne en rond.
Je ne comprends pas comment faire.

Voilà mon sujet :
- Par un formulaire je demande combien de notes il faut entrer -> j'y arrive
- j'afficher autant de ligne que de notes à entrer -> j'y arrive
- ensuite je veux calculer la moyenne des notes -> j'en suis pas encore là

Mon problème : je n'arrive pas à récupérer l'ensemble des notes, je ne récupère que la dernière note entrée.
Je me doute bien qu'il faudrait que mes notes aient un identifiant différent mais je ne vois pas comment faire :(

1er formulaire :
<!-- Je veux un formulaire pour entrer des notes
on va aussi demander de rentrer le nom et le prénom de l'élève (ça ne sert à rien pour l'instant) -->

<form action="remplissageNote.php" method="POST">
    <Fieldset>
    <legend>Identité de l'élève et nombre de notes du trimestre</legend>
    Nom de l'élève : <input type="text" id="nom" name="nom"></br>
    Prénom de l'élève : <input type="text" id="prenom" name="prenom"></br>

<!-- Je voudrai qu'on demande le nombre de note à saisir afin d'afficher
autant de case que de notes à saisir dans le fichier remplissageNote-->

    Nombre de note à saisir : <input type="number" id="nbnote" name="nbnote"></br>
    <input type="submit" name="Envoyer"></br>
    </Fieldset></form>

2ème formulaire :
<?php
//Je reprends la données nombre de note à saisir pour afficher autant de input que de notes

if (isset($_POST['Envoyer'])) {
    $nbNotes = $_POST['nbnote'];
    echo '</br>';
    echo "Le nombre de note à renseigner est : " . "<strong> $nbNotes </strong>" . "</br>";
    echo '</br>';
    echo '<form action ="#" method = "POST">';
    echo '<fieldset>';
    echo '<legend>Entrer les notes</legend>';
    if ($i <= $nbNotes) {
        for ($i = 1; $i <= $nbNotes; $i++) {

            echo 'Entrer la note ' . $i . ':  <input type="number" id="name" name="note" min="0" max="20"></br>';

        }
        echo '</br>';
        echo '<input type="submit" name="Calcul">';
        echo '</fieldset>';
    }
    echo '</form>';
}
//ici je veux récupérer toutes les notes saisies pour en faire la somme

if (isset($_POST['Calcul'])) {
    $notes = [$_POST['note']];

    foreach ($notes as $note) {
        print_r($note);
    }
}
// le problème c'est que je ne vois que la 2ème note saisie.


Qu'est ce que je ne comprends pas ?

Merci par avance de l'aide que vous m'apporterez. Je cherche avant tout à comprendre plutôt que faire afin que je puisse progresser.
Steph

Mammouth du PHP | 1967 Messages

31 oct. 2022, 12:31

Si tu regarde la source (ctrl + U) de ton 2eme formulaire, tu verra que tous les champs note on le même attribut name et id. donc en compilant les résultat du formulaire, les valeurs de ces champs sont écrasé au fur et à mesure.

tu as la bonne idée mais elle n'est pas mise en pratique,
e me doute bien qu'il faudrait que mes notes aient un identifiant différent mais je ne vois pas comment faire
tu peux utiliser la variable $i de ta boucle pour obtenir un id et un name unique pour chaque champs
echo 'Entrer la note ' . $i . ':  <input type="number" id="name' . $i . '" name="note' . $i . '" min="0" max="20"></br>';
dans la récupération de ton second formulaire tu pourras faire une boucle pour récupèrer chaque note, mais tu auras besoin de connaitre le nombre de note. cherche du coté des champs caché type="hidden" pour transfèrer des données d'un formulaire à l'autre sans afficher le champs.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Mammouth du PHP | 2703 Messages

31 oct. 2022, 13:06

echo 'Entrer la note ' . $i . ':  <input type="number" id="name' . $i . '" name="note' . $i . '" min="0" max="20"></br>';
mais tu auras besoin de connaitre le nombre de note. cherche du coté des champs caché type="hidden" pour transfèrer des données d'un formulaire à l'autre sans afficher le champs.
non, en parcourant tous les éléments du tableau $_POST et en ne prenant que les champs dont le name commence par note.

une autre manière de faire dans l'exemple 3 de :
https://www.php.net/manual/fr/language. ... ternal.php

Eléphanteau du PHP | 25 Messages

31 oct. 2022, 13:19

Merci @Spols pour ta réponse.

Effectivement je ne connais (pas encore) les champs HIDDEN.
Je commence à creuser le sujet même s'il me parait pas simple :

Je pense ajouter une ligne avant le button submit comme cela :
<?php
//Je reprends la données nombre de note à saisir pour afficher autant de input que de notes

if (isset($_POST['Envoyer'])) {
    $nbNotes = $_POST['nbnote'];
    echo '</br>';
    echo "Le nombre de note à renseigner est : " . "<strong> $nbNotes </strong>" . "</br>";
    echo '</br>';
    echo '<form action ="#" method = "POST">';
    echo '<fieldset>';
    echo '<legend>Entrer les notes</legend>';
    if ($i <= $nbNotes) {
        for ($i = 1; $i <= $nbNotes; $i++) {

            echo 'Entrer la note ' . $i . ':  <input type="number" id="name ' . $i . ' " name="note ' . $i . ' " min="0" max="20"></br>';

        }
        echo '</br>';
        echo '<input id="nbNote" name="nbNote" type="hidden" value="' . $nbNotes . ' >';
        echo '<input type="submit" name="Calcul">';
        echo '</fieldset>';
    }
    echo '</form>';
}
Après je ne vois pas comment je peux boucler dessus ? c'est pas clair pour moi :(

Eléphanteau du PHP | 25 Messages

31 oct. 2022, 13:54

"non, en parcourant tous les éléments du tableau $_POST et en ne prenant que les champs dont le name commence par note"

Oups ... alors là j'ai rien compris :(
Je suis allé voir le lien que tu m'as donné mais je ne vois pas comment faire les choses ?

C'est un truc dans ce genre là ?
if ($_POST['note' . $i]) {
    echo '<pre>';
    echo htmlspecialchars(print_r($_POST['note' . $i], true));
    echo '</pre>';
}
Je ne comprends pas ce que cela fait :(

Eléphanteau du PHP | 25 Messages

31 oct. 2022, 14:54

J'ai réussi !

Merci pour votre aide :)
Je mets ici mon code final si ça peut aider pour le futur :
<?php
//Je reprends la données nombre de note à saisir pour afficher autant de input que de notes

if (isset($_POST['Envoyer'])) {
    $nbNotes = $_POST['nbnote'];
    echo '</br>';
    echo "Le nombre de note à renseigner est : " . "<strong> $nbNotes </strong>" . "</br>";
    echo '</br>';
    echo '<form action ="#" method = "POST">';
    echo '<fieldset>';
    echo '<legend>Entrer les notes</legend>';
    if ($i <= $nbNotes) {
        for ($i = 1; $i <= $nbNotes; $i++) {
// je place les notes reçues dans un tableau
            echo 'Entrer la note : ' . $i . ' ' . '<input type="number" id="name" name="note[]" min="0" max="20"></br>';

        }
        echo '</br>';

        echo '<input type="submit" name="Calcul">';

        // je récupère la donnée nbnote du premier formulaire que je stocke ici
        echo '<input id="nbnote" name="nbnote" type="hidden" value=" ' . $_POST['nbnote'] . '">';
        echo '</fieldset>';
    }
    echo '</form>';
}

if (isset($_POST['Calcul'])) {
    //je boucle sur le tableau

    foreach ($_POST['note'] as $note) {
        $sommeDesNotes += $note;

    }

    // je fais le calcul de la moyenne
    echo 'Votre moyenne est de : ' . $sommeDesNotes / $_POST['nbnote'] . '</br>';
}
Je vais pouvoir maintenant m'amuser avec l'HIDDEN pour récupérer le prénom et le nom de l'élève du premier formulaire.

Encore merci pour l'aide :)

Mammouth du PHP | 2703 Messages

31 oct. 2022, 18:53

un id doit être unique. un champ de formulaire n'a pas forcément besoin d'avoir un id.

sizeof($_POST['note']) donne le nombre de notes donc pas besoin d'un champ caché, dont on peut s'amuser à changer la valeur pour changer la moyenne.

pour quelqu'un qui cherche à se perfectionner, ce serait bien de faire la même chose avec l'idée première :
echo 'Entrer la note ' . $i . ': <input type="number" id="name' . $i . '" name="note' . $i . '" min="0" max="20"></br>';
en mettant le nombre de notes en champ caché, et sans le mettre.

Eléphanteau du PHP | 25 Messages

01 nov. 2022, 00:02

Si je comprends bien j’ai donc fait un mix des solutions…
Je pars en vacances demain, à mon retour je me penche sur cela pour aller plus loin.

Merci pour ton aide,

Mammouth du PHP | 2703 Messages

01 nov. 2022, 00:16

Si je comprends bien j’ai donc fait un mix des solutions…
non
le code final :
echo 'Entrer la note : ' . $i . ' ' . '<input type="number" id="name" name="note[]" min="0" max="20"></br>';

ce n'est plus :
echo 'Entrer la note ' . $i . ': <input type="number" id="name' . $i . '" name="note' . $i . '" min="0" max="20"></br>';

[] est prévu alors c'est la meilleure solution, celle qui demande le moins de code. mais savoir gérer la manière manuelle de traiter le problème est utile pour l’apprentissage d'un débutant.