un formulaire dans un formulaire

a marqué ce sujet comme résolu.

Salut,

j'ai voulu faire un formulaire dans autres formulaire pour avoir un seul bouton pour la validation de toutes mes colonnes car si je fais qu'un formulaire j'aurais un bouton pas colonne et c'est pas du tout pratique. j'ai vu que en php il est pas possible de faire ça. donc comme je pourrais procéder ?

cordialement,

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
<?php

  try
{
    $bdd = new PDO('mysql:host=localhost;dbname=emak;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}
        $reponse = $bdd->query('SELECT * FROM   tableau_journalier  order by id ');
        while ($donnees = $reponse->fetch())
         {
      ?>



<!--détail des lignes!--> 
<form method="post" action="info2.php">

<tr>

  <td bgcolor ="white" align="center" width ="10%"  class ="tx4" >  <?php echo $donnees ['CD_NOM'                   ] ; ?>  </td>
    <td bgcolor ="white" align="center" width ="10%"  class ="tx4" >  <?php echo $donnees ['CD_PRENOM'               ] ; ?>  </td>





    <td bgcolor ="white" align="center" width ="10%"  class ="tx4" >  
    <form >

    <p>
       <input type="radio" name="appel" value='P' id="P"  checked="checked" /> <label for="P">Présent</label>
       <input type="radio" name="appel" value='A'  id="A" /> <label for="A">Absent</label><br />
       <input type="hidden" name="id" value="<?php echo $donnees['ID']; ?>" /> 
    </p>

    </form>

    </td>

    <?php   

    try
{
    $bdd = new PDO('mysql:host=localhost;dbname=emak;charset=utf8', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}


    if(isset($_POST['hd'])) {

    $hd = $_POST['hd'];
    $hf = $_POST['hf'];
    $dat = $_POST['annee'].'-'.$_POST['mois'].'-'.$_POST['jour'] ;


    $req = $bdd->prepare('UPDATE tableau_journalier SET db_cours = :hd, fn_cours = :hf, date_cours = :dat');
$req->execute(array(

            'hd' => $hd,
            'hf' => $hf,
            'dat' => $dat,

                ));


if($req->execute()) { // execute() répond true/false
   echo " La requête fonctionne ! ";
} else {
    $error = $req->errorInfo();
   echo "Echec lors de l'exécution de la multi-requête : (" . $error[2] . " ) " ;

}

} 

    elseif(isset($_POST['hd'])){

    echo 'Vous n\'avez rien selectionné ';

}



    ?>
    <td bgcolor ="white" align="center" width ="10%"  class ="tx4" >  <?php echo $dat ; ?> </td>

    <td bgcolor ="white" align="center" width ="10%"  class ="tx4" >   <?php echo $hd ; ?>  </td>

    <td bgcolor ="white" align="center" width ="10%"  class ="tx4" >   <?php echo $hf ; ?>  </td>

 </tr>


      <?php
       }
      ?>


</table>

<input type="submit" name="submit" value="Envoyer" />

    </form>

screen formulaire dans un formulaire : http://hpics.li/95ca844

screen un seul formulaire : http://hpics.li/4e2ef

Salut !

Un formulaire dans un formulaire, c'est pas parce que tu utilises PHP que c'est pas possible, c'est une règle de conception HTML.

Petit rappel : un formulaire par ligne, si on est dans un tableau, ce n'est pas possible : <form>…</form> ne peut pas être à l'intérieur de <table>…</table> ou de ses enfants, sauf <td>…</td>. Il faut donc soit mettre la balise de formulaire dans une seule et même cellule, soit autour du tableau directement.

Si je prends la dernière proposition, tu peux du coup avoir un tableau avec un seul formulaire pour tous tes éléments journaliers. Il faudrait juste modifier un peu les noms des champs, et pour ça, je vais juste repasser sur les tableaux en PHP.

$_POST, du côté traitement d'un formulaire, est un tableau. Ainsi, si on a un bref formulaire comme celui-ci  :

1
2
3
4
<form method="post">
<input name="nom" />
<input name="prenom" />
</form>

Un formulaire volontairement simplifié pour l'exemple

… on recevra, au traitement, des valeurs dans $_POST['prenom'] et $_POST['nom']. Autrement dit, $_POST peut être représenté ainsi : array('prenom' => 'le prénom saisi dans le formulaire', 'nom' => 'le nom saisi dans le formulaire'). Les plus affûtés esprits remarqueront qu'il suffit de prendre les attributs name des champs du formulaire (et quels que soient ces champs – <select>, <textarea>, <input>), et de les placer entre crochets et guillemets après $_POST quand on souhaite récupérer les valeurs envoyées. C'est certes très simplifié, mais pas totalement faux.  ;)
Maintenant, on sait qu'on peut avoir des tableaux à "plusieurs dimensions". Pour en créer, on a plusieurs manières :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
// La première, la plus courante
$array = array(
    array(
        'prenom' => 'un prénom saisi dans le formulaire',
        'nom' => 'un nom saisi dans le formulaire',
    ),
    array(
        'prenom' => 'un autre prénom saisi dans le formulaire',
        'nom' => 'un autre nom saisi dans le formulaire',
    ),
);

// On pourrait aussi le faire "en plusieurs fois"
$array[0] = array(
    'prenom' => 'un prénom saisi dans le formulaire',
    'nom' => 'un nom saisi dans le formulaire',
);
$array[1] = array(
    'prenom' => 'un autre prénom saisi dans le formulaire',
    'nom' => 'un autre nom saisi dans le formulaire',
);

// Et même encode plus détaillé
$array[0]['prenom'] = 'un prénom saisi dans le formulaire';
$array[0]['nom'] = 'un nom saisi dans le formulaire';
$array[1]['prenom'] = 'un autre prénom saisi dans le formulaire';
$array[1]['nom'] = 'un autre nom saisi dans le formulaire';

// Avec les trois méthodes, si je souhaite accéder là où il y a "un autre prénom saisi dans le formulaire", je vais faire ainsi
echo $array[1]['prenom'];

Un bref rappel sur les tableaux multidimensionnels

On pourrait très bien imaginer que, à la place de $array dans mon exemple, on ait $_POST. Avoir une structure à "plusieurs dimensions" serait intéressant dans notre cas, non ?
Si on repart de l'observation effectuée avant l'exemple ci-dessus, on pourrait se dire qu'il suffirait de compléter l'attribut name pour qu'on puisse continuer à venir le mettre entre $_POST[ et ]. Cependant, ce n'est pas exactement comme cela que ça fonctionne.  ^^

En fait, si on souhaite avoir "plusieurs niveaux" dans $_POST – ce qui est possible, oui ! –, il faut mettre tout ce que vous mettriez après $_POST dans l'attribut name de vos champs, et cela inclut les crochets autour.
Afin de mieux comprendre, je vous propose le même genre de formulaire simplifié, adapté pour reconstruire la structure de mon dernier exemple.

1
2
3
4
5
6
<form method="post">
<input name="[0][nom]" />
<input name="[0][prenom]" />
<input name="[1][nom]" />
<input name="[1][prenom]" />
</form>

Un formulaire simplifié qui fait que $_POST a la même structure que dans l'exemple précédent

Voilà. Maintenant, quand vous construisez votre formulaire, vous allez répéter les champs un certain nombre de fois. Vous aurez donc probablement une boucle pour savoir combien de fois c'est nécessaire. Donc vous pouvez avoir un compteur… Vous voyez où je veux en venir ?

1
2
3
4
5
6
<form method="post">
<?php for ($i = 0; $i < 2; $i++): ?>
<input name="[<?php echo $i: ?>][nom]" />
<input name="[<?php echo $i; ?>][prenom]" />
<?php endfor; ?>
</form>

Un formulaire généré avec du PHP, qui permet d'avoir un tableau multidimensionnel, avec autant d'éléments que désiré

Maintenant, avec tout ça, vous pouvez aisément faire un formulaire pour éditer plusieurs éléments similaires à la fois. Au traitement, vous avez toutes les informations sur le premier élément dans $_POST[0], pour le second, c'est dans $_POST[1], etc. Il ne vous reste plus qu'à adapter au HTML que vous voulez utiliser. :)

+0 -0

Merci d'avoir pris le temp de me repondre, mais excuse moi de te contredire mais si dans le deuxième screen que je t'ai montré les balises <form> </form> sont bien à l'intérieur de mes balises <table> </table et <td> </td> au contraire j'ai juste enlever les balises <form> </form> qui sont à l'extérieur. Tu me parle de formulaire mais alors que moi le nom et prenom je le récupère sur ma BDD (tu ne pouvais pas le savoir je ne l'avais pas précisais ;) ) et donc la methode que tu m'as passer ne conviens pas dans mon cas je crois. ce que je veux faire enfete c'est comme sur ceux screen http://hpics.li/4e2ef sauf qu'au leiu d'avoir le boutton envoyer autant de fois que le nombre d'élève je le voudrais une seul fois car là c'est un test il y a que 2 élèves mais le but et d'en mettre une trentaine. j'espère que là c'est plus claire pour vous je peux envoyer tous le code de la page si il le faut.

Cordialement,

Si tu veux un seul formulaire, le plus simple est d'inclure tout ton tableau dedans en déclarant tes champs comme étant liés à tes profils (via l'ID par exemple, du style name="user['.$user->id.'][first_name]").

Ainsi côté traitement tu récupèreras un tableau associatif sur lequel tu pourras boucler pour effectuer les opérations nécessaires.


Au passage, je te recommande de revoir ton HTML : tu utilises des attributs dépréciés depuis près de 15 ans dans ton tableau…

Ok d'accord merci, juste tu peux m'expliquer ce code en quelque mot car je l'ai jamais vu

1
name="user['.$user->id.'][first_name]"

ps: tu as surement raison comme je reprend un code qui à la base était avec la fonction mysql_

+0 -0

Ça veut tout simple dire que côté serveur tu récupèreras un tableau, un peu comme Ymox te l'a expliqué :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
print_r($_POST['user']);

array(
    '4' => array(
        'first_name' => 'Toto',
        'last_name' => 'Bar'
    ),
    '7' => array(
        'first_name' => 'Jean',
        'last_name' => 'Dupont'
    )
)

Ou quelque chose du genre… ;)

Sinon tu peux aussi passer l'ID dans le sous-tableau au même niveau que les autres infos du profil (via un input hidden par exemple) et laisser les premiers crochets vides : tu auras donc un tableau indexé au lieu d'un tableau associatif.

Merci d'avoir pris le temp de me repondre, mais excuse moi de te contredire mais si dans le deuxième screen que je t'ai montré les balises <form> </form> sont bien à l'intérieur de mes balises <table> </table et <td> </td> au contraire j'ai juste enlever les balises <form> </form> qui sont à l'extérieur.

maiko

Au temps pour moi, on mettra ça sur le compte de l'heure de réponse  :D

Tu me parle de formulaire mais alors que moi le nom et prenom je le récupère sur ma BDD (tu ne pouvais pas le savoir je ne l'avais pas précisais ;) ) et donc la methode que tu m'as passer ne conviens pas dans mon cas je crois. ce que je veux faire enfete c'est comme sur ceux screen http://hpics.li/4e2ef sauf qu'au leiu d'avoir le boutton envoyer autant de fois que le nombre d'élève je le voudrais une seul fois car là c'est un test il y a que 2 élèves mais le but et d'en mettre une trentaine. j'espère que là c'est plus claire pour vous je peux envoyer tous le code de la page si il le faut.

maiko

Je te rassure, outre le fait que j'avais mal lu ton HTML, j'avais très bien compris, et ma méthode, si elle est très générique, est donc adaptée. Mon estimé collègue t'a donné plus d'indices, à toi d'en faire ce dont tu as besoin  ;)

+0 -0

Un <form> dans un <tr> c'est pas glorieux, mais ça marche, en tout cas avec IE et firefox. N'ayant pas d'autre solution crédible pour mon cas, j'ai tout de même adoptée celle-là, en sachant pertinament que ce n'est pas valide. C'est du mauvais code mais ça fait le job, parfois on est obligé d'admettre qu'on ne peut pas honnêtement faire autrement.

Par contre des fomulaires imbriqués, c'est définitivement à éviter, le navigateur ne comprend pas ce qu'il faut faire et c'est assez logique qu'il en soit ainsi.

En HTML5 il devrait exister une solution pour le cas du <form> dans <tr>. L'élément <input/> ajoute un nouvel attribut form qui peut référencer un formulaire par son id. Ainsi on est censé pouvoir placer un <input/> en-dehors de son formulaire. Je n'ai pas encore vérifié dans quelles mesures ça fonctionnait ou non, c'est à tester.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte