2008-09-30 16 views
2

Ich baue ein Formular mit PHP/MySQL. Ich habe eine Tabelle mit einer Liste von Orten und Unterorten. Jede Sublocation hat einen übergeordneten Standort. Eine Spalte "parentid" verweist auf eine andere locationid in derselben Tabelle. Ich möchte nun diese Werte in einem Drop-Down auf die folgende Weise laden:Verschachteltes Dropdown

--Location 1 
----Sublocation 1 
----Sublocation 2 
----Sublocation 3 
--Location 2 
----Sublocation 4 
----Sublocation 5 

etc. etc.

Jeder bekam eine elegante Lösung, dies zu tun?

Antwort

1

Hinweis: Dies ist nur psuedo-Code .. Ich habe versucht es nicht läuft, obwohl Sie sollten in der Lage, die Konzepte anzupassen, was Sie brauchen .

$parentsql = "SELECT parentid, parentname FROM table"; 

$result = mysql_query($parentsql); 
print "<select>"; 
while($row = mysql_fetch_assoc($result)){ 
    $childsql = "SELECT childID, childName from table where parentid=".$row["parentID"]; 
    $result2 = mysql_query($childsql); 
    print "<optgroup label=\".$row["parentname"]."\">"; 
    while($row2 = mysql_fetch_assoc($result)){ 
     print "<option value=\"".$row["childID"]."\">".$row["childName"]."</option>\n"; 
    } 
    print "</optgroup>"; 
} 
print "</select>"; 

Mit BaileyP gültigen Kritik daran, hier ist, wie es ohne den Overhead zu tun in jeder Schleife mehr Abfragen des Aufrufs:

$sql = "SELECT childId, childName, parentId, parentName FROM child LEFT JOIN parent ON child.parentId = parent.parentId ORDER BY parentID, childName"; 
$result = mysql_query($sql); 
$currentParent = ""; 

print "<select>"; 
while($row = mysql_fetch_assoc($result)){ 
    if($currentParent != $row["parentID"]){ 
     if($currentParent != ""){ 
      print "</optgroup>"; 
     } 
     print "<optgroup label=\".$row["parentName"]."\">"; 
     $currentParent = $row["parentName"]; 
    } 

    print "<option value=\"".$row["childID"]."\">".$row["childName"]."</option>\n"; 
} 
print "</optgroup>" 
print "</select>"; 
+0

Ich habe dies abgelehnt, weil die Durchführung einer Abfrage pro Iteration einer Schleife ein großes Nein ist. –

0

Sie können Leerzeichen und Bindestriche im HTML-Code verwenden. Sie benötigen jedoch eine recusus-Schleife, um es zu erstellen. Etwas wie:

<?php 

$data = array(
    'Location 1' => array(
     'Sublocation1', 
     'Sublocation2', 
     'Sublocation3' => array(
      'SubSublocation1', 
     ), 
    'Location2' 
); 

$output = '<select name="location">' . PHP_EOL; 

function build_items($input, $output) 
{ 
    if(is_array($input)) 
    { 
     $output .= '<optgroup>' . $key . '</optgroup>' . PHP_EOL; 
     foreach($input as $key => $value) 
     { 
      $output = build_items($value, $output); 
     } 
    } 
    else 
    { 
     $output .= '<option>' . $value . '</option>' . PHP_EOL; 
    } 

    return $output; 
} 

$output = build_items($data, $output); 

$output .= '</select>' . PHP_EOL; 

?> 

oder etwas ähnliches;)

0

Idealerweise würden Sie all diese Daten in der richtigen Reihenfolge wählen direkt aus der Datenbank, dann einfach über diese für die Ausgabe. Hier ist mein nehmen auf, was Sie fragen für

<?php 
/* 
Assuming data that looks like this 

locations 
+----+-----------+-------+ 
| id | parent_id | descr | 
+----+-----------+-------+ 
| 1 |  null | Foo | 
| 2 |  null | Bar | 
| 3 |   1 | Doe | 
| 4 |   2 | Rae | 
| 5 |   1 | Mi | 
| 6 |   2 | Fa | 
+----+-----------+-------+ 
*/ 

$result = mysql_query("SELECT id, parent_id, descr FROM locations order by coalesce(id, parent_id), descr"); 

echo "<select>"; 
while ($row = mysql_fetch_object($result)) 
{ 
    $optionName = htmlspecialchars((is_null($row->parent_id)) ? "--{$row->descr}" : "----{$row->desc}r", ENT_COMPAT, 'UTF-8'); 
    echo "<option value=\"{$row->id}\">$optionName</option>"; 
} 
echo "</select>"; 

Wenn Sie nicht wie die Verwendung der coalesce() Funktion geben Sie eine „Display_Order“ Spalte dieser Tabelle hinzufügen können, die Sie manuell festlegen können, und verwenden Sie dann für die ORDER BY.