• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Werte aus Datenbank holen und daraus ein Dropdown Feld mit Vorauswahl erstellen

Kirschtomate

New member
Ich schreibe gerade an einem Script, mit welchem ich die Daten aus meiner Datenbank editieren möchte.

Haupttabelle
ID | Name | Beziehungsstatus_ID
(1 - Manfred - 2)
(2 - Hans - 3)
(3 - Lotte - 1)

Beziehungsstatus
Beziehungsstauts_ID | Name_Beziehungsstatus
(1 - ledig)
(2 - verheiratet)
(3 - verlobt)

Ich möchte dabei im Editierskript den Namen jedes Beziehungstatus auslesen und daraus ein Dropdown Feld erstellen. Gleichzeitig soll in Bezug auf den zu editierenden Datensatz der ursprünglich eingetragene Beziehungsstatus bereits ausgewählt sein.

Ich habe zuerst meine select Abfrage:

PHP:
$abfrage = "select Haupttabelle.*, Beziehungsstatus.Name_Beziehungsstatus from Haupttabelle, Beziehungsstatus where Haupttabelle.ID = '$ID'";

$resultat = $verbidnung->query($abfrage);

$reihe = $resultat->fetch_assoc();

Bisher bin ich nur auf folgende Lösung gekommen:

PHP:
<select name="Beziehungsstatus_ID">
<option value="">- Auswahl -</option>
<option value="1" <?php if ($reihe['Beziehungssatutus_ID'] == 1) echo 'selected'; ?> >ledig</option>
<option value="2" <?php if ($reihe['Beziehungssatutus_ID'] == 2) echo 'selected'; ?> >verheiratet</option>
<option value="3" <?php if ($reihe['Beziehungssatutus_ID'] == 3) echo 'selected'; ?> >verlobt</option>
</select>

Allerdings ist diese Lösung nur halbautomatisch. Wie muss ich vorgehen, wenn ich die das Dropdown Feld komplett automatisch erstellen will?
 
Zuletzt bearbeitet:
Allerdings ist diese Lösung nur halbautomatisch. Wie muss ich vorgehen, wenn ich die das Dropdown Feld komplett automatisch erstellen will?
Ein Dropdown-Feld oder Select, wie es im HTML heißt, besteht aus Text. PHP kann beliebigen Text ausgeben. Ob Du das mit Echo machst, oder Inline-HTML, oder über eine Template-Engine oder ein Framework und wo die Daten herkommen, ob Datenbank, Datei, oder hardkodiert, ist eine Frage des persönlichen Könnens, Geschmacks, Programmierstils, und der zusätzlichen Randbedingungen.
 
Dafür brauchst du zwei Abfragen: eine von der Haupttabelle und eine von den Stati
ABER warum verschmutzt du deine DB mit einer zusätzlichen Tabelle? Genau für so etwas gibt es den enum Datentyp:
Code:
$db = new MySQLi($server, $user, $pwd);
$db->select_db($db);

$fieldDef = $db->query("SHOW COLUMNS FROM `Haupttabelle` WHERE `Field` = 'Beziehungsstatus'")->fetch_assoc();
$fieldValues = str_replace("''", "'", preg_split("/','/", preg_replace("/^enum\\('|'\\)$/", "", $fieldDef["Type"])));

$res = $db->query("SELECT *  FROM `Haupttabelle`");
while($result = $res->fetch_assoc()){
	echo "<select>";
	foreach ($fieldValues as $value){
		echo "<option " . ($value == $result["Beziehungsstatus"]? " selected": "") . ">" . $value . "</option>";
	}
	echo "</select>";
}
 
ABER warum verschmutzt du deine DB mit einer zusätzlichen Tabelle? Genau für so etwas gibt es den enum Datentyp:

Ich höre heute das erste Mal von "enum". Hier wird aber anscheinend davon abgeraten.

$fieldValues = str_replace("''", "'", preg_split("/','/", preg_replace("/^enum\\('|'\\)$/", "", $fieldDef["Type"])));

Puh, die Zeile wird noch eine Herausforderung. Ich bin mal recherchieren ;)
 
http://www.brandonsavage.net/why-you-should-replace-enum-with-something-else/ schrieb:
ENUM could be useful for columns that had data that would always fit into one particular set of values
genau dein Fall - auch macht es keinen Sinn, nach dem Beziehungsstatus zu sortieren.
 
So, ich habe mein Problem mittlerweile gelöst. Wie in meinem Erstbeitrag verwende ich für mein reales Problem eine Extratabelle. Dies ist nach meiner Recherche sinnvoll, wenn nicht alle Werte bekannt sind und nach und nach neue Wertepaare hinzugefügt werden sollen. Bezogen auf das erwähnte Beispiel lese ich in einer Schleife die Tabelle "Beziehungsstatus" aus. Entspricht die Beziehungstatus_ID jener der Haupttabelle, wird ein "selected" gesetzt. Eigentlich ganz einfach:

PHP:
<select name="beziehungsstatus_id">
<option value="">-Auswahl-</option>

<?php
 $query = "select * from beziehungsstatus";
 $result = $db->query($query);
 while ($row = $result->fetch_assoc()) {
  echo '<option value="' . $row['beziehungsstatus_id'] . '"';
  if ($row['beziehungstatus_id'] == $return['beziehungsstatus_id']) echo 'selected';
  echo '>' . $row['name_beziehungsstatus'] . '</option>';
 }
 $result->free();
?>

</select>

$return['beziehungsstatus_id'] stammt dabei aus einer vorhergehenden Abfrage, die alle Daten der Haupttabelle ausliest.

Nun habe ich aber bereits einen neues Problem: Eine m:n Beziehung aus der Tabelle auslesen und mittels Checkboxen anzeigen.

Haupttabelle
ID | Name
(1 - Manfred)
(2 - Hans )
(3 - Lotte)

Projekt
Projekt_ID | Projektname
(1 - Gartengestaltung)
(2 - Fruehjahrsputz)
(3 - Muellentsorgung)

Personen_Projekt
ID | Projekt_ID
(1 - 2)
(2 - 1)
(2 - 3)
(3 - 1)
(3 - 2)

Weiß jemand eine Lösung? Ein vollständiger Code ist nicht notwendig, eine Beschreibung des Lösungsweges in zwei bis drei Sätzen wäre schon hilfreich ;)

Edit (zur Verdeutlichung): Ich sehe etwa das Profil von Hans und möhte darunter alle Projekte als Checkboxen gelistet haben. Die Projekte, an denen Hans teilnimmt, sollen bereits angekreuzt sein.
 
Zuletzt bearbeitet:
Du lädst erst alle Projekte - geordnet nach Projekt_ID (aufsteigend). Dann alle "Projekt_ID"s, an denen Hans teilnimmt - auch in aufsteigender Reihenfolge. Dann gehst du alle Projekte durch und wenn die ID mit der ersten aus der Teilnahmeliste übereinstimmt -> "checked". Erste aus Teilnahmeliste streichen und weitermachen.
 
Du lädst erst alle Projekte - geordnet nach Projekt_ID (aufsteigend). Dann alle "Projekt_ID"s, an denen Hans teilnimmt - auch in aufsteigender Reihenfolge. Dann gehst du alle Projekte durch und wenn die ID mit der ersten aus der Teilnahmeliste übereinstimmt -> "checked". Erste aus Teilnahmeliste streichen und weitermachen.
Ähhhh, JOIN bitte!
 
Danke für eure Posts. Ich habe mein Problem nun durch Zufall gelöst. Meine Select Abfrage sieht wie folgt aus:

select personen_projekt.id, projekt.*
from personen_projekt
right join projekt
on personen_projekt.projekt_id = projekt.projekt_id
and personen_projekt.id = '$id';

Eigentlich wollte ich ein "where" schreiben, habe aber ein "and" erwischt. Zuerst habe ich es ohne die letzte Zeile (and personen_projekt.id = '$id') probiert, aber dann funktioniert es nur solange sich nur eine Person in der Datenbank befindet ;)

Als Ausgabe (mit der obigen Abfrage) erhalte ich für Hans folgende Tabelle:

id | projekt_id | projektname
(2 - 1 - Gartengestaltung)
(NULL - 2 - Fruehjahrsputz)
(2 -3 - Muellentsorgung)

Hierzu mein PHP Script:

PHP:
<?php
 $query = "select personen_projekt.id, projekt.*
 from personen_projekt
 right join projekt
 on personen_projekt.projekt_id = projekt.projekt_id
 and personen_projekt.id = '$id'";

 $result = $db->query($query);

 while ($row = $result->fetch_assoc()) {
  echo '<input type="checkbox" name="projekt_id[]" value="' . $row['projekt_id'] . '"';
  if (isset ($row['id'])) echo 'checked';
  echo '>' . $row['projektname'] . ' | ';
 }

 $result->free();
?>

Ich erhalte dadurch alle Projekte als Checkboxen und ein "Häckchen" wenn sich ein dazugehöriger Eintrag in der Datenbank befindet. Das Script, das die Editierung vornimmt, sieht dann so aus:

PHP:
$query = "delete from personen_projekt where id = '$id'";
$result = $db->query($query);

foreach ($projekt_id as $single_projekt_id) {
 $query = "insert into personen_projekt values ('$id', '$single_projekt_id')";
 $result = $db->query($query);  
}

Ginge das noch einfacher, quasi in einer Abfrage?
 
Zuletzt bearbeitet:
Zurück
Oben