dynamische Selectbox

ich schreibe an einem kleinem Script, in dem man über die DB zu einem bestehenden Formular weitere Felder hinzufügen kann, z.B. Textfelder, Textaraes und Selectboxen mit eigenen Auswahlmöglichkeiten die auch aus der DB kommen.

Beispiel: neue Selectbox mit der Auswahl ja, nein, vielleicht
DB-Struktur für neue Boxen:
Tabellename - boxen
Spalten - id feldname feldtyp feldinhalt

Inhalt bei Erstellen der neuen Selectbox:
id=1
feldname=Willst du...
feldtyp=sel
feldinhalt=ja nein vielleicht (jedes steht in einer eigenen Zeile)

Beim Erstellen der neuen Box wird in einer anderen Tabelle "userbox" eine neue Spalte angelegt mit dem Namen "feld" mit der id aus der Tabelle "boxen", also in diesem Beispiel "feld1". Standardmässig ist noch eine weitere Spalten "userid" vorhanden um Einträge den Usern zuzuordnen.
Füllt ein User dieses Formular aus und wählt in der Selectbox "nein" aus, wird dieses als neuer Eintrag mit Userid in die Spalte userid und die Auswahl "nein" in die Spalte feld1 eingetragen. Bis hier hin funktioniert auch soweit alles.
Ich habe jetzt das Problem, das wenn ein User seinen Eintrag edtieren möchte auf dieser Formularseite nicht seine zuvor abgeschickte Auswahl sieht sondern immer nur den ersten Eintrag der Selectbox - also "ja".

PHP:
$zfeld = $db->query_first("SELECT * FROM userbox WHERE userid=".$userid."");
	  //Zusatzfelder holen
      $zfresult = $db->unbuffered_query("SELECT * FROM boxen ORDER BY id");
      $zusatzfeld = "";
      if($zfresult){
        while ($zfrow = $db->fetch_array($zfresult)) {
        //Selectfeld
	      if($zfrow['feldtyp'] == "sel"){
	        $opt = explode("\n",$zfrow['feldinhalt']);
	        $optionfeld .= "<select name=\"feld[$zfrow[id]]\">\n<option value=\"\"></option>\n";
			
			foreach ($opt as $value) {
			  $feldres = $zfeld["feld".$zfrow['id']];  //ergebnis aus userbox
			  if(isset($feldres)) $selectet[$feldres] = "selected=\"selected\"";  //sollte eigentlich dafür benutzt werden um das ergebnis zu selectieren
			  $optionfeld .= "<option value=\"$value\" $selectet[$value]>$value</option>";
            }
	        $optionfeld .= "</select>";
          }
	      //Textfeld
	      else if($zfrow['feldtyp'] == "txt" || $zfrow['feldtyp'] == "url" || $zfrow['feldtyp'] == "banner"){
			$optionfeld = "<input name=\"feld[$zfrow[id]]\" type=\"text\" value=\"".$zfeld["feld".$zfrow['id']]."\" size=\"".$zfrow['size']."\" maxlength=\"".$zfrow['maxlength']."\" />";
	      }
	      //Textarea
	      else if($zfrow['feldtyp'] == "txtarea"){
	        $optionfeld = "<textarea name=\"feld[$zfrow[id]]\" cols=\"".$zfrow['size']."\" rows=\"".$zfrow['maxlength']."\" >".$zfeld["feld".$zfrow['id']]."</textarea>";
	      }
	      else $optionfeld = "";
          $tdclass = getone($z, "tablea", "tableb");
          eval("\$zusatzfeld .= \"".$tpl->get("user_edit_zus)."\";");
          $z++;
        }
      }
eval("\$tpl->output(\"".$tpl->get("user_edit")."\");");
 
Zuletzt bearbeitet:
Wie sieht ein von diesem Codeschnippsel erzeugtes Stück html Code aus?

Und wo speicherst du die Auswahl des Users?
Ich nehme an $zfeld = $db->query_first holt den ersten Datensatz aus dem Query etc..
Vielleicht machst du mal an der Stelle ein echo und schau was statt dem gewünschten Wert in den Variablen drin steht.

Edith grüßt:
PHP:
if(isset($feldres)) $selectet[$feldres] = "selected=\"selected\"";  //sollte eigentlich dafür benutzt werden um das ergebnis zu selectieren
$optionfeld .= "<option value=\"$value\" $selectet[$value]>$value</option>";
selectet und selected :-)
 
Zuletzt bearbeitet:
Mit der Abfrage $zfeld hole ich mir den Usereintrag aus der Tabelle "userbox".
Mit der Abfrage $zfresult hole ich die Einträge für das Selectfeld aus der Tabelle "boxen", da es aber nicht nur die Selectbox gibt, sondern auch Textfelder und Textareas ... lese ich durch die while-Schleife while ($zfrow = $db->fetch_array($zfresult)) alle aus.
Die Zeile $feldres = $zfeld["feld".$zfrow['id']]; ist das Resultat des abgespeicherten Usereintrages im jeweilgen feld der Tabelle "userbox". Wenn ich mir per echo $feldres; das Resultat ausgeben lasse bekomme ich das richtige Ergebnis "nein".
Das ganze wird über zwei Templates ausgegeben. Im ersten Template ist eine Tabelle in der alle Felder ausgegeben werden. Die zusätzlichen werden mit der Variable $zusatzfeld über das zweite Template hinzugefügt in der sich die Variable $optionfeld befindet.

HTML Code Template 1 "user_edit.tpl":
HTML:
<table>
  <tr align="left">
     <td><b>Eintrag editieren</b></td>
   </tr>
   $zusatzfeld
</table>

HTML Code Template 2 "user_edit_zus.tpl":
HTML:
<tr align="left">
  <td><b>$zfrow[feldname]:</b></td>
  <td>$optionfeld</td>
</tr>

Das ganze ist ansich dem WBB nachempfunden (Profilfelder erstellen), ich wollte aber nicht deren Code einfach kopieren sondern auf eigene Art lösen.

Ich erweitere oben mal noch den PHP-Code, sodas man noch die Abfrage der weiteren Felder (Textfelder/Textareas) und die Ausgabe in die Templates sieht.
 
Zurück