# Mehrfachauswahl aus Sleectbox Abfragen



## wachteldonk (27. März 2008)

Hallo,

wie kann ich alle ausgewählten Einträge aus einer Listbox auslesen


----------



## Quaese (27. März 2008)

Hi,

durchlauf die Listbox mit Hilfe einer for-Schleife. In jedem Durchlauf prüfst du, ob die aktuelle Option gewählt (selected) wurde. Im Erfolgsfall wird die Option an ein Array angehängt.

Beispiel:

```
<html>
<head>
<title>www.tutorials.de</title>
<meta name="author" content="Quaese">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
  <!--
function checkSelect(strID){
  var arrSel = new Array();
  var objSel = document.getElementById(strID);

  // Selectbox durchlaufen
  for(var i=0; i<objSel.length; i++){
    // Falls die aktuelle Option ausgewählt wurde
    if(objSel.options[i].selected)
      arrSel.push(objSel.options[i]);
  }

  return arrSel;
}
 //-->
</script>

</head>
<body>
<button onclick="checkSelect('selID')">checkSelect()</button>
<select size="5" multiple="multiple" id="selID">
	<option>1</option>
	<option>2</option>
	<option>3</option>
	<option>4</option>
	<option>5</option>
	<option>6</option>
</select>
</body>
</html>
```
Die Funktion gibt das Array mit allen gewählten *option*-Objekten zurück.

Ciao
Quaese


----------



## SweetiePie (22. April 2008)

Hallo, ich hab' gestern mit Entzuecken den Loesungsweg hier gelesen und versucht umzusetzen ... leider ohne Erfolg.
Ich habe ebenfalls eine multiple-selectbox definiert (nach o. g. Muster). Es wird jedoch sowohl mit diesem Script-Vorschlag als auch ohne immer nur ein Wert an das Mailform-php-Script uebergeben.
Das gesamte Formular wird problemlos per $_POST-Methode uebergeben (in einen Array "$mailtext" und als HTML-Mail weitergeleitet. Leider kann ich das Formular immer noch nicht online stellen, weil die optionale Mehrfachauswahl ein essentieller Bestandteil desselben ist.
Ich benoetige unbedingt alle ausgewaehlten Werte dieser select-box.

Um nachvollziehen zu koennen, wie ich versucht habe (anhand des o. g. Beispiels), das zu realisieren:


```
<script type="text/javascript">

    function checkSelect(strID){
      var arrSel = new Array();
      var objSel = document.getElementById(strID);

      for(var i=0; i<objSel.length; i++){
        if(objSel.options[i].selected)
          arrSel.push(objSel.options[i]);
      }
      return arrSel;
    }                          
</script>

<form name="Moderatorbewerbung" action="action.php" method="post" onsubmit="checkSelect('Serverwahl')">
<!-- Bem.: weitere Formulardaten -->
        <select name="Lieblingsserver" id="Serverwahl" size="5" multiple="multiple">
            <option value="EA_01">EA #01</option>
            <option value="EA_02">EA #02</option>
            <option value="EA_03">EA #03</option>
            <option value="EA_04">EA #04</option>
            <option value="EA_05">EA #05</option>
            <option value="EA_06">EA #06</option>
            <option value="EA_07">EA #07</option>
            <option value="EA_08">EA #08</option>
            <option value="EA_09">EA #09</option>
            <option value="EA_10">EA #10</option>
        </select> 
<!-- Bem.: weitere Formulardaten -->           
        <input type="submit" value="Senden" />&nbsp;&nbsp;
        <input type="reset" value="Zurücksetzen" />          
</form>
```

Was mach' ich da genau falsch ?
Sollte es ein ganz banaler Fehler sein, so bitte ich das vielmals zu entschuldigen, da ich ein absoluter Neuling auf dem Gebiet der JAVAScript-Programmierung bin !
Also bitte nicht lachen, fuer Hilfe jedoch, waere ich unendlich dankbar !

LG

Bernd

PS.: Hier muss es 'ne ganze Menge "Bernds" geben, ich musste meinen "gamenick" verwenden, weil keine Option in der Namenswahl angenommen wurde.


----------



## Quaese (22. April 2008)

Hi,

um PHP-seitig eine Mehrfachauswahl auswerten zu können, muss der Name des Elements als Array ausgezeichnet werden.

```
<select name="Lieblingsserver[]" id="Serverwahl" size="5" multiple="multiple">
```
Im PHP-Script kannst du dann mit

```
$_POST['Lieblingsserver'][0];
$_POST['Lieblingsserver'][1];
// ... usw ...
```
darauf zugreifen.

Ciao
Quaese


----------



## SweetiePie (22. April 2008)

Danke, für die schnelle Antwort.
Das habe ich auch schon mehrfach gelesen.
Mein Problem ist jedoch, dass ich ein kostenfreies, einfaches Mailinput-php-Script verwende, dem ich ein captcha-code-script hinzugefügt habe.
Ich möchte darauf nur sehr ungern verzichten, weil es eben ganz prächtig funktioniert (bis auf die select-box eben).

Die verantwortliche Funktion für die Sammlung der Daten ist:


```
function GenerateHTMLMailBodyLIGHT()
{
	// ---------------------------------------------------
	// erzeuge einfache HTML-Mail (formatiert mit Tabelle)
	// gen simple HTML-mail (formatting via table)
	// ---------------------------------------------------
	global $MOM_Note;
	$rs  = "";
	if(strlen($MOM_Note)>0) 	$rs .= $MOM_Note . "<br>";		// Hinweis einfügen, falls vorhanden / include note if given
	$rs .= "<table>";
	foreach($_POST as $key => $value)
		$rs .= "<tr><td>" . $key . "</td><td>&nbsp;&nbsp:&nbsp&nbsp;</td><td>" . $value . "</td></tr>";
	$rs .= "<table><br>";
	return $rs;
}
```

Und hier weiß ich nicht weiter.
Wie kann ich

```
$_POST['Lieblingsserver'][0];
$_POST['Lieblingsserver'][1];
// ... usw ...
```
darin unterbringen, wenn doch der Array $rs bereits vorgegeben ist.
Tut mir leid, wenn ich Umstände bereiten sollte.

LG

Bernd

PS.: Ich habe nun mehrfach gelesen, dass es möglich ist, Arrays per JAVAScript-function zu generieren und zu übermitteln. Alle Versuche in diese Richtung schlagen aber bei mir fehl.
Ich hoffe ein Beispiel ist gestattet:

```
function GetSelectedItem() {
    len = document.Lieblingsserver.Serverwahl.length
    i = 0
    chosen = ""
    for (i = 0; i < len; i++) {
        if (document.Lieblingsserver.Serverwahl[i].selected) {
        chosen = chosen + document.Lieblingsserver.Serverwahl[i].value + "\n"
        }
    }
    return chosen
}
```

Ich versuche nun diesen Array separat zum Absenden des gesamten Formulars mit einem zusätzlichen Button zur  Übermittlung *vor* dem eigentlichen Submit festzulegen, indem ich diesen der select-box nachschalte:

```
<input type=button value="Auswahl bestätigen" onclick="GetSelectedItem();">
```
Aber auch das will einfach nicht funktionieren.


----------



## Quaese (22. April 2008)

Hi,

hast du Zugriff auf die Funktion *GenerateHTMLMailBodyLIGHT*? In dem Fall könntest du die Routine um eine weitere Schleife erweitern:

```
function GenerateHTMLMailBodyLIGHT()
{
	// ---------------------------------------------------
	// erzeuge einfache HTML-Mail (formatiert mit Tabelle)
	// gen simple HTML-mail (formatting via table)
	// ---------------------------------------------------
	global $MOM_Note;
	$rs  = "";
	if(strlen($MOM_Note)>0) 	$rs .= $MOM_Note . "<br>";		// Hinweis einfügen, falls vorhanden / include note if given
	$rs .= "<table>";
	foreach($_POST as $key => $value){
  	    if(is_array($value)){
    	        foreach($value as $innerKey => $innerValue){
				$rs .= "<tr><td>" . $key . "[". $innerKey . "] = " . "</td><td>&nbsp;&nbsp:&nbsp&nbsp;</td><td>" . $innerValue . "</td></tr>";
              }
        }else{
	    $rs .= "<tr><td>" . $key . "</td><td>&nbsp;&nbsp:&nbsp&nbsp;</td><td>" . $value . "</td></tr>";
    }
  }
	$rs .= "<table><br>";
	return $rs;
}
```
Hast du keinen Zugriff darauf, könntest du vor dem Versenden des Forumlars die Selektgruppe durchlaufen und für jede markierte Option ein verstecktes Feld mit fortlaufender Nummerierung und entsprechendem Wert ins Formular einbinden.

Die Funktion *checkSelect* könnte dann zum Beispiel wie folgt aussehen:

```
function checkSelect(strID){
  var intCounter = 0;
  var objSel = document.getElementById(strID);

  for(var i=0; i<objSel.length; i++){
    if(objSel.options[i].selected){
      var objInput = document.createElement("input");
      objInput.type = "hidden";
      objInput.name = "Lieblingsserver_" + intCounter++;
      objInput.value = objSel.options[i].value;
      objSel.form.appendChild(objInput);
    }
  }
}
```
Ciao
Quaese


----------



## SweetiePie (22. April 2008)

Göttlich, einfach göttlich.
Ich hab' die Schleife in das php-script eingebaut.
Es funktioniert perfekt.

Vielen Dank für Deine Hilfe.
Ich werde http://www.tutorials.de wärmstens weiter empfehlen.
Darf ich die Domain auf unserer Community-Homepage verlinken ?
Und wenn ja, wo finde ich ein Banner in der Größe 468x60 für Eure User-helfen-Usern-Community ?
In unserer Gamer-Community gibt es hin und wieder auch recht explizite Fragestellungen zu den verschiedensten Themen aus unterschiedlichen Programmierungsbereichen, und ich bin sicher, damit wären die betreffenden Leute hier bestens aufgehoben ! 

LG

Bernd


----------

