Frage

Ich baue ein Formular mit PHP / MySQL. Ich habe eine Tabelle mit einer Liste von Orten und sublocations bekommt. Jede Sublokation hat eine übergeordnete Stelle. Eine Spalte „parentid“ verweist auf eine andere LocationID in der gleichen Tabelle. Ich möchte nun diese Werte in einem Drop-Down auf die folgende Weise laden:

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

usw. etc.

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

War es hilfreich?

Lösung

. HINWEIS: Dies ist nur psuedo-Code .. Ich habe versucht es nicht läuft, obwohl Sie in der Lage sein sollte, 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>";

Andere Tipps

Suchen Sie so etwas wie die OPTGROUP Tag?

optgroup ist definitiv der Weg zu gehen. Es ist eigentlich das, was es ist für,

Zum Beispiel Nutzung, Ansicht Quelle http://www.grandhall.eu/tips/submit / -. die Wähler unter "Grandhall Grill verwendet"

Sie können verwenden und Raum / dash Einzug in den eigentlichen HTML. Sie erhalten eine recusrive Schleife brauchen es aber zu bauen. So 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;)

Im Idealfall würden Sie all diese Daten in der richtigen Reihenfolge wählen direkt aus der Datenbank, dann nur eine Schleife über die für die Ausgabe. Hier ist mein nehmen auf das, was Sie für Fragen

<?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 über die Verwendung der coalesce() Funktion möchten, können Sie eine „Display_Order“ Spalte dieser Tabelle hinzufügen, die Sie manuell einstellen, und dann für die ORDER BY verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top