Additionner les valeurs d'une liste déroulante multiple

Fermé
Signaler
Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
-
Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
-
Bonjour,
Ce que j'ai actuellement.
J'ai un formulaire dynamique pour la saisie d'une adhésion avec une liste déroulante à choix multiple issue de ma BDD. Cette liste déroulante il y a 5 items, lorsque je sélectionne un item cela me retourne dans un input la somme correspondante, son montant est alors enregistré dans ma BDD.
Ce que je souhaiterai.
Pouvoir sélectionner plusieurs choix et de ce fait les sommes correspondantes s’additionneraient dans l'input en question et le montant total sera alors enregistré en BDD.
Merci sincèrement pour votre aide.
<script language="javascript" type="text/javascript">
$LDpaie->onchange = "payer()";
$instr = "var cotis = new Array('0'";
$requete  = "SELECT montant FROM cdc_paiements ORDER BY idpaie";
$resultat = executeQuery($requete,$bdd);
while ($donnees = $resultat->fetch()) { $instr .= ", '".$donnees->montant."'"; }
$instr .= ")";
echo $instr;

function payer() {
	var idpaie;
	idpaie = document.adh.idpaie.options[document.adh.idpaie.options.selectedIndex].value;
	document.adh.montant.value = cotis[idpaie];
}
</script>

Voici ma table des enregistrements, reste encore une question en suspense l'enregistrement des IDs des paiements.

7 réponses

Messages postés
34205
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2021
3 852
Bonjour,

Ton code semble mélanger du php et du JS en même temps....
Ce n'est pas possible.
Soit tu ne nous a pas tout montré.... soit il manque des balises de code...

Il faudrait également que tu nous précises si tu veux que cette "addition" se fasse dans le code PHP (avant de faire l'insertion en base) .. ou bien que le calcul se fasse lors du "click" sur les différents montants (donc côté javascript )

Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
33
Bonjour,
Oui effectivement il manque les balises <?php
Le calcul il faudrait qu'il se fasse lors du click sur les différents items côté javascript.
Par exemple je sélectionne un premier item qui a pour montant 10
Alors le montant affiché sera 10
Je sélectionne un deuxième item qui a pour montant 100
Alors le montant affiché sera 110.
Je vous remercie, malheureusement je n'arrive pas à trouver la solution.
Messages postés
34205
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2021
3 852
Donc...
Tu nous postes le code avec les balises
Tu nous montres le code html qui va avec
Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
33
Bonjour,
Voici le code complet.
<script language="javascript" type="text/javascript">
<?php
require("libs/class.liste.php");
$LDpaie = new liste("libs/paiements","","oblig"); //classe qui gère les listes déroulantes
$LDpaie->onchange = "payer()";
$instr = "var cotis = new Array('0'"; 

$requete  = "SELECT montant FROM cdc_paiements ORDER BY idpaie";
$resultat = executeQuery($requete,$bdd);

	while ($donnees = $resultat->fetch()) { $instr .= ", '".$donnees->montant."'"; }
	$instr .= ")";
	echo $instr; 
?>
</script>

<script language="javascript" type="text/javascript">
function payer() {
	var idpaie;
	idpaie = document.adh.idpaie.options[document.adh.idpaie.options.selectedIndex].value;
	document.adh.montant.value = cotis[idpaie];
}
</script>

Voici le formulaire. Je pense avoir tout poster en ce qui concerne mon problème. Merci.
echo '<form method="post" name="adh" action="'.$_SERVER["PHP_SELF"].'" onsubmit="return verif()">';
	echo '<h1>'.$title.'</h1>';

	echo '<table>';
	echo '<tr>';
	echo '<td class="libel">Adhérent</td>';
	echo '<td class="data">'; echo $LDpers->write($idpers).'<input type="button" name="plus" value="+" onclick="javascript:document.location=\'sais_personnes.php?a=add\'" /></td>';
	echo '</tr><tr>';
	echo '<td class="libel">Cotisation</td>';
	echo '<td class="data">'; echo $LDpaie->write($idpaie).'</td>';
	echo '</tr><tr>';
	echo '<td class="libel">Classe de musicien</td>';
	echo '<td class="data">'; echo $LDclas->write($idclas).'</td>';
	echo '</tr><tr>';
	echo '<td class="libel">Instrument du musicien</td>';
	echo '<td class="data">'; echo $LDpup->write($idpup).'</td>';
	echo '</tr><tr>';
	echo '<td class="libel">Au titre de l\'année</td>';
	echo '<td class="data"><input type="text" name="annee" size="3" value="'.$aadh.'" class="oblig" /></td>';
	echo '</tr><tr>';
	echo '<td class="libel">Date de début</td>';
	echo '<td class="data"><input type="text" name="ddebut" size="8" value="'.$ddebut.'" /></td>';
	echo '</tr><tr>';
	echo '<td class="libel">Date de fin</td>';
	echo '<td class="data"><input type="text" name="dfin" size="8" value="'.$dfin.'" /></td>';
	echo '</tr><tr>';
	echo '<td class="libel">Montant payé</td>';
	echo '<td class="data"><input type="text" name="montant" size="5" style="text-align:right" value="'.$montant.'" /> €</td>';
	echo '</tr><tr>';
	echo '<td>';
		echo '<input type="hidden" name="haction" value="'.$action.'" />';
		echo '<input type="hidden" name="oldid" value="'.$oldid.'" />';
	echo '</td>';
	echo '<td class="data"><input type="submit" name="submit" value="'.$btsub.'" /></td>';
	echo '</tr>';
	echo '</table>';

echo '</form>';
Messages postés
34205
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2021
3 852
C'est moi.....ou il manque la liste déroulante ??
Je ne la trouve pas dans le code que tu nous montres...

Une fois de plus.. on galère a comprendre ton code et à obtenir toutes les infos....
Merci de bien vouloir faire de gros efforts pour nous communiquer TOUT ce qui peut nous servir à te répondre !
C'est fatiguant de toujours devoir te répéter les même choses.... :-(
Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
33
En fait j'ai hésité à mettre ma class mais je me suis dit qu'elle ne servirai pas à résoudre mon soucis. Comme une fois on m'a reproché de mettre du code qui n'a aucun intérêt avec le problème concerné, alors voilà.
voici ma page 'paiements.def'
<?php
$table  = "cdc_paiements";
$champs = "idpaie,libelle";
$ordre  = "libelle";
$lignes = "5";
$texte  = "-- Type de paiement --";
?>

'class.liste.php'
class liste {
     var $champs    = "";
     var $texte     = "";
     var $requete   = "";
     var $ctrlname  = "";
     var $tronque   = 0;
     var $option    = "";
     var $style     = "";
     var $onchange  = "";
     var $slimit    = "";
     var $limit     = "";

     var $nbrecs    = 0;

     function liste($objet, $ctrlname="", $style="", $limit=0) {
          if($objet != "null") {
               $slimit          = $limit; // sauvegarde du paramètre / fichier .def
               require("$objet.def.php");
               $this->texte     = $texte;
               $this->ctrlname  = $ctrlname;
               $this->style     = $style;
               $this->onchange  = $onchange;
               $this->champs    = $this->getfieldnames($champs);
               if($limit) {
                    $this->limit  = $limit;
               }
               if($lignes) {
                    $this->texte = "";
                    $this->option = " multiple size=\"$lignes\"";
               }
               if($where)  { $insWHERE = "WHERE $where";    } else { $insWHERE = ""; }
               if($group)  { $insGROUP = "GROUP BY $group"; } else { $insGROUP = ""; }
               if($ordre)  { $insORDER = "ORDER BY $ordre"; } else { $insORDER = ""; }
               if($limit)  { $insLIMIT = "LIMIT 0,$limit";  } else { $insLIMIT = ""; }
               if($slimit) { $insLIMIT = "LIMIT 0,$slimit"; } else { $insLIMIT = ""; }

               $this->sql = "SELECT $champs FROM $table $insWHERE $insGROUP $insORDER $insLIMIT;";
               $datas = NULL;
               //$cnx = $GLOBALS["connexion"];
               $result = executeQuery($this->sql,$datas);
               $this->nbrecs = $result->rowCount(); unset($resultat);
          }
     }

     function write($indice="",$text=0) {
          $champs = explode(",",$this->champs); $idctrl = $champs[0];
          if($this->ctrlname) { $idctrl = $this->ctrlname; }
          if($this->style) { $style = " class=\"$this->style\""; }
          if($this->onchange) { $onchange = " onchange=\"javascript:$this->onchange\""; }
          
          $datas = NULL;
          $result = executeQuery($this->sql,$datas);
          $this->nbrecs = $result->rowCount();
          if($text && $indice) { $textonly = 1; } else { $textonly = 0; }
          if(!$textonly) {
               echo "<select name=\"".$idctrl."\"$this->option".$style.$onchange.">";
               if(!$this->option) {
                    if($this->texte) { echo "<option value=\"null\">$this->texte"; }
               }
          }
          while ($donnees = $result->fetch()) {
               if($indice/1) { $idnum = 0; } else { $idnum = 1; }
               if($indice == $donnees->$champs[$idnum]) { $thisrec = 1; } else { $thisrec = 0; }
               if (count($champs) > 2) {
                    $texte = $donnees->$champs[1]; $n = 2;
                    if($textonly && $thisrec) { $buffer = $texte; }
                    while(count($champs) > $n) {
                         if($textonly && $thisrec) { $buffer .= " ".$donnees->$champs[$n]; $n++; }
                         else                      { $texte  .= " ".$donnees->$champs[$n]; $n++; }
                    }
               } else {
                    if($textonly && $thisrec) { $buffer = $donnees->$champs[1]; }
                    else                      { $texte  = $donnees->$champs[1]; }
               }
               if($this->tronque) {
                    $lg = $this->tronque-9;     // 9 = longueur de "... / ..."
                    if(($lg % 2) != 0) { $lg++; }
                    if(strlen($texte) > $lg) {
                         $texte = substr($texte,0,$lg/2) . "... / ..." . substr($texte,strlen($texte)-($lg/2),$lg/2);
                    }
                    if(strlen($buffer) > $lg) {
                         $buffer = substr($buffer,0,$lg/2) . "... / ..." . substr($buffer,strlen($buffer)-($lg/2),$lg/2);
                    }
               }
               if(!$textonly) {
                    echo "<option value=\"".$donnees->$champs[0]."\"";
                    if($thisrec) { echo " selected"; }
                    echo ">".$texte;
               }
          }
          if($textonly) { echo $buffer;        }
          else          { echo "</select>\n";  }
     }
Messages postés
34205
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2021
3 852
il nous faut le code HTML de ton select ... pas le code php qui le génère.
Pour cela :
- Affiche ta page dans ton navigateur,
- Affiche son code source ( via le raccourci CTRL + u par exemple )
- Trouve la partie qui concerne ta liste déroulante
- Colle nous son code.

Je vois, au passage, que tu ne fermes pas tes balises option ?? (il semble manquer les </option>
<option value="10" > texte </option>
Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
33
Je suis actuellement dans la partie administration du site. Cette partie admin est un sous domaine alors en ce qui est du code source il y a uniquement cela.
hai hai hai
<link rel="stylesheet" href="css/menusscr.css" type="text/css" media="screen">
<link rel="stylesheet" href="css/menusprt.css" type="text/css" media="print">
   
<frameset rows="20,*" frameborder="0" border="0" marginheight="0" marginwidth="0">
   <frame name="menu" src="menu.php" scrolling="no" noresize class="np">
   <frame name="main" src="accueil.php" scrolling="auto">
</frameset>

Pour les balises options je regarde ça.
Messages postés
34205
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
1 décembre 2021
3 852
Ben reviens nous voir quand tu auras ta liste déroulante.... histoire qu'on puisse avancer....
Car je ne vois pas comment tu peux développer le côté interactif Javascript sans pouvoir le tester ...
Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
33
Est ce que c'est ça qu'il te faudrait pour essayer de m'aider?
<tr><td class="libel">Cotisation</td><td class="data"><select name="idpaie" multiple size="5" class="oblig" onchange="javascript:payer()"><option value="4">Adhésion gratuite<option value="1">Cotisation annuelle<option value="2">Cours collectif<option value="3">Cours individuel<option value="5">Paiement Dégressif</select>
Messages postés
410
Date d'inscription
lundi 25 juillet 2016
Statut
Membre
Dernière intervention
24 novembre 2021
33
Bonjour,
Voilà trois jours que j'essaie à vouloir trouver une solution à mon problème, mais je pense que c'est un peu plus compliqué que je ne le pensais sans votre aide je vais devoir y renoncer. J'ai changé quelques petites choses déjà mais en vain. J'ai vraiment besoin de votre aide s'ils vous plait. Je vous remercie.