Page 1 sur 1

recup valeurs de plusieurs form via un seul submit !

Posté : 21 déc. 2007, 03:44
par vaucer
Bonjour,


Je crée dans ma page un form en boucle qui affiche une vingtaine de form dans un tableau au final.

Mon problème est que j'utilise la méthode traditionnelle du submit à l'intérieur de chaque form appelés par la boucle et qu'ensuite le submit envoie les valeurs via _POST au script d'insertion/modif dans ma base de donnée.

J'aimerai donc au lieu d'avoir un submit (en l'occurence j'en ai deux mod et sup)dans chaque formulaire, n'en avoir qu'un seul pour tous et pouvoir selectionner les formulaires à modifier en même temps avec des check box.

Merci d'avance à celui qui aura une soluce à me proposer, voilà pas mal de temps que je trime la dessus ^^

Ci-joint le lien vers le mon code : /http://pastebin.com/mbf24234

Posté : 21 déc. 2007, 11:05
par Ryle
La solution me parait assez simple, tu as X formulaires indépendant générés par une boucle, tu n'en veux qu'un contenant tous les champs, ben suffit de le sortir de ta boucle.. Ton bouton submit enverra le formulaire avec les valeurs de toutes les cases qui ont été cochée et voilà tout :)
<form ...>
  <?php 
    while (...) { 
      echo '<input type="chekbox" name="case[]" value="'.$idDeLaCase.'" />';
      ...
    }
  ?>
  <input type="submit" value="Envoi le formulaire" />
</form>

recup valeurs de plusieurs form via un seul submit

Posté : 21 déc. 2007, 17:37
par vaucer
Bonjour ryle,

Merci de ta réponse tout d'abord. Tu as effectivement raison c'est une solution que d'englober tous les form dans un seul form en le sortant de la boucle, j'y ai pensé, mais ça ne convient pas à ma situation étant donné que je peux avoir 40 form en boucle de suite.

Donc chaques lignes (regroupée par un form) possède le même modèle de champs input appelés par des requêtes sql dans la boucle :

Code : Tout sélectionner

$dbh = mysql_connect('localhost','root', ''); mysql_select_db('essai', $dbh); #########Supp, Mod, Ajout ou rien ########## if (isset($_REQUEST['DELETE'])) { $id = $_REQUEST['id']; $sql = "DELETE FROM incitresorerie WHERE id = $id"; } elseif (isset($_REQUEST['UPDATE'])) { $id = $_REQUEST['id']; $numinci = $_REQUEST['numinci']; $etainci = $_REQUEST['etainci']; $date = $_REQUEST['date']; $datefi = $_REQUEST['datefi']; $sql = "UPDATE incitresorerie SET numinci = '$numinci', "; $sql = $sql . "etainci = '$etainci', "; $sql = $sql . "date = '$date', "; $sql = $sql . "datefi = '$datefi', "; } elseif (isset($_REQUEST['INSERT'])) { $numinci = $_REQUEST['numinci']; $etainci = $_REQUEST['etainci']; $date = $_REQUEST['date']; $datefi = $_REQUEST['datefi']; $sql = "INSERT INTO incitresorerie(id, numinci, etainci, date, datefi) "; $sql = $sql . " VALUES ('','$numinci', '$etainci', '$date','$datefi') "; } if (isset($sql)) { $a = mysql_query($sql); if ($a) { $num = mysql_affected_rows($dbh); $message = "$num enregistrement(s) mis à jour"; } else { $message = "Erreur: " . mysql_error(); } <?php } // On parcourt la table de incit $sql = "SELECT * from incit ORDER BY id DESC LIMIT 20"; $a = mysql_query($sql); $num = mysql_num_fields($a); ?> <?php while($record = mysql_fetch_row($a)) { ?> <!-- Pour chaque enregistrement on crée un formulaire --> <FORM METHOD="POST"> <TR> <TD width="50" class="blancbis"> <INPUT size="10" NAME ="<?php echo mysql_field_name($a, 0)?> VALUE="<?php echo $record[0]?>" > </TD> <TD width="50" class="blancbis"> <INPUT size="10" NAME ="<?php echo mysql_field_name($a, 1)?> VALUE="<?php echo $record[1]?>" > </TD> <TD width="50" class="blancbis"> <INPUT size="10" NAME ="<?php echo mysql_field_name($a, 2)?> VALUE="<?php echo $record[2]?>" > </TD> <TD width="50" class="blancbis"> <INPUT size="10" NAME ="<?php echo mysql_field_name($a, 3)?> VALUE="<?php echo $record[3]?>" > </TD> <TD width="50" class="blancbis"> <INPUT size="10" NAME ="<?php echo mysql_field_name($a, 4)?> VALUE="<?php echo $record[4]?>" > </TD> <TD class="grisbis"> <INPUT size="1" TYPE="SUBMIT" NAME="UPDATE" VALUE="Mod"> <INPUT size="1" TYPE="SUBMIT" NAME="DELETE" VALUE="Sup"> </TD> </TR> </FORM> <?php } mysql_close(); ?> </TABLE>
Ensuite la méthode _POST de chaque form avait le role de renvoyer par un submit les 13 valeurs du form (j'en ai mis que 5 dans le code pour pas faire trop lourd) à la partie insertion sql de la page

Le problème est donc que si je sors le FORM de la boucle du while comment différencier les valeurs regroupées en lignes de tableau par les form et ensuite les récuperer dans mon script d'insertion BDD pour quelles soient correctement entrées par ligne (avec une valeur de submit en plus UPDATE où DELETE).

J'ai l'impression que si j'englobe toutes les lignes de mon tableau dans un form je serais incapable de réinserer les valeurs dans la bdd selon le modèle ci-dessus ...

Je rappelle que je voudrais pouvoir insérer les valeurs de mon tableau par lignes avec un checkbox sans devoir avoir un submit à chaques fin de form.

J'ai pensé à ajouter un attribut name aux FORM et ensuite à récuperer les valeurs des input de chaque form dans un tableau comme le faisait _POST traditionnellement mais je me sens pas capable de les manipuler pour les inserer dans l'ordre dans ma bdd.

Un peu d'aide serait bienvenue :cry:


Je ne sais pas si vous m'aurez compris

Mais merci beaucoup d'avance ! et merci pour la réponse !

Posté : 21 déc. 2007, 20:32
par Patriboom
La méthode de Ryle reste bonne. Il te suffit de nommer tes champs pour en faire des tableaux:

Code : Tout sélectionner

<input name="banane[]"><input name="Contenu[]">
Les paires de crochets font toute la différence.
Pour les récupérer, ensuite, tu traites des tableaux habituels:

Code : Tout sélectionner

$_POST["banane"][0];$_POST["banane"][1];$_POST["banane"][2] ... $_POST["Contenu"][0];$_POST["Contenu"][1];$_POST["Contenu"][2];$_POST["Contenu"][3]...

Posté : 22 déc. 2007, 01:50
par Invité
le problème est que si je nomme mes input ils auront toujours les mêmes name puisque même si le form est hors de la boucle, il reste que la ligne d'input est aussi en boucle ...

est ce que quelqu'un pourrait me donner un bout de code pour inserer mes lignes de tableaux dans lordre dans ma base de donnée (comme dans mon code) dans le cas ou j'ajouterais un id qui s'incrémente à tout mes input ...(donc que j'ai des valeurs différentes)

en gros comment je pourrais simplement réinserer les valeurs du _post récupérées dans ma base de donnée sur le même modèle que mon script actuel d'insertion ? ...


Merci à tous !! Merci !! :roll:

Posté : 22 déc. 2007, 05:42
par Patriboom
Dans ton code d'interprétation du formulaire, celui qui fait passer les infos du formulaire à la BDD, tu y vas un peu comme suit:

    $REQUETE = "INSERT INTO NomDeTable (Champ1, Champ2, Champ3 ...) VALUES ";
    for ($x=0; $x=count($_POST["banane"]); $x++) {
        $REQUETE .= "( '".$_POST["banane"][$x]."',  '".$_POST["Contenu"][$x]."', '".$_POST["Input3"][$x]."', ... )";
     if ($x != count($_POST["banane"])) { $REQUETE .= ", "; }
    }
    if (mysql_query($REQUETE, $db)) { echo "Insértion réussie"; } else { echo "Échec"; }

Posté : 22 déc. 2007, 16:43
par Invité
je n'ai pas réussi à inserer des name à mes imput comme vous me l'aviez consseillé :

Code : Tout sélectionner

<input name="banane[]"><input name="Contenu[]">
car mes name d'input étaient déjà appelés par une bdd :

Code : Tout sélectionner

<INPUT size="10" NAME ="<?php echo mysql_field_name($a, 1)?> VALUE="<?php echo $record[1]?>">
mais j'ai trouvé une solution pour ajouter une variable qui s'incrémente dans la boucle et que j'ajoute à la fin de chacun des names de mes input:
la boucle

Code : Tout sélectionner

<?php $idfil = 1; while ($record = mysql_fetch_row($a)) { $idfil++ ?>
et les input:

Code : Tout sélectionner

<INPUT size="3" type=hidden NAME ="<?php echo mysql_field_name($a, 0), $idfil ?>"
je me retrouve donc avec un _POST contenant des name type: numinci1, date1, datefi1, com1, check2, numinci2, date2, datefi2, com2, check2.
J'ai une checkbox à chaque finde ligne à selectionner deselectionner si je veux modifier ou non le champ selectionné.

comment je pourrais adapter ta boucle à mon script d'insertion qui est à la base :

Code : Tout sélectionner

$dbh = mysql_connect('localhost','root', ''); mysql_select_db('TRESORERIE', $dbh); ############################################ #########Supp, Mod, Ajout ou rien ########## for ($x=0; $x=count($_POST["id2"]); $x++) { if (isset($_REQUEST['DELETE'])) { $id = $_REQUEST['id']; $sql = "DELETE FROM incitresorerie WHERE id = $id"; } elseif (isset($_REQUEST['UPDATE'])) { $id = $_REQUEST['id2']; $numinci = $_REQUEST['numinci2']; $etainci = $_REQUEST['etainci2']; $date = $_REQUEST['date2']; $datefi = $_REQUEST['datefi2']; $fili1 = $_REQUEST['fili12']; $fili2 = $_REQUEST['fili22']; $fili3 = $_REQUEST['fili32']; $refeinci = $_REQUEST['refeinci2']; $flux = $_REQUEST['flux2']; $heureinci = $_REQUEST['heureinci2']; $heuretrait = $_REQUEST['heuretrait2']; $commentaires = addslashes($_REQUEST['commentaires2']); $sql = "UPDATE incitresorerie SET numinci = '$numinci', "; $sql = $sql . "etainci = '$etainci', "; $sql = $sql . "date = '$date', "; $sql = $sql . "datefi = '$datefi', "; $sql = $sql . "fili1 = '$fili1', "; $sql = $sql . "fili2 = '$fili2', "; $sql = $sql . "fili3 = '$fili3', "; $sql = $sql . "refeinci = '$refeinci', "; $sql = $sql . "flux = '$flux', "; $sql = $sql . "heureinci = '$heureinci', "; $sql = $sql . "heuretrait = '$heuretrait', "; $sql = $sql . "commentaires = '$commentaires' "; $sql = $sql . "WHERE id = $id"; } elseif (isset($_REQUEST['INSERT'])) { $numinci = $_REQUEST['numinci']; $etainci = $_REQUEST['etainci']; $date = $_REQUEST['date']; $datefi = $_REQUEST['datefi']; $fili1 = $_REQUEST['fili1']; $fili2 = $_REQUEST['fili2']; $fili3 = $_REQUEST['fili3']; $refeinci = $_REQUEST['refeinci']; $flux = $_REQUEST['flux']; $heureinci = $_REQUEST['heureinci']; $heuretrait = $_REQUEST['heuretrait']; $commentaires = addslashes($_REQUEST['commentaires']); $sql = "INSERT INTO incitresorerie(id, numinci, etainci, date, datefi, fili1, fili2, fili3, refeinci, flux, heureinci, heuretrait, commentaires) "; $sql = $sql . " VALUES ('','$numinci', '$etainci', '$date','$datefi','$fili1','$fili2','$fili3','$refeinci','$flux', '$heureinci', '$heuretrait','$commentaires') "; } if (isset($sql)) { $a = mysql_query($sql); if ($a) { $num = mysql_affected_rows($dbh); $message = "$num enregistrement(s) mis à jour"; } else { $message = "Erreur: " . mysql_error(); } ?> <?php } // On parcourt la table de incitresorerie $sql = "SELECT * from incitresorerie ORDER BY id DESC LIMIT 20"; $a = mysql_query($sql); $num = mysql_num_fields($a); ?>

Posté : 22 déc. 2007, 20:03
par Patriboom
J'ai déjà été pris avec des noms d'input comme les tiens, mais depuis que je travaille avec des tableaux, c'est beaucoup plus facile. Je te conseille donc d'opter pour les tableaux.

Il te suffit, en fait, de mettre une paire de crochets à l'intérieur des guillemets encadrant le nom.

Voici ce que pourrait devenir ton script pour arriver à faire tes <input> de façon à arriver à cela:
<INPUT size="3" type=hidden NAME ="<?php echo mysql_field_name($a, 0) ?>[]">
La variable idfil devient donc inutile.
Dans ta citation, tu avais oublié de fermer le crochet du "input"

Posté : 23 déc. 2007, 03:00
par Invité
Je te remercie pour ta réponse je vais tester ta solution des demain !