Question

Je construis un formulaire avec php / mysql. J'ai une table avec une liste d'emplacements et de sous-localisations. Chaque sous-localisation a un emplacement parent. Une colonne " parentid " fait référence à un autre emplacement dans la même table. Je souhaite maintenant charger ces valeurs dans une liste déroulante de la manière suivante:

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

etc. etc.

Quelqu'un a-t-il une solution élégante pour le faire?

Était-ce utile?

La solution

REMARQUE: ceci n’est que du code pseudo-code. Je n’ai pas essayé de l’exécuter, mais vous devriez pouvoir ajuster les concepts à vos besoins.

$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>";

En gardant à l'esprit la critique valable de BaileyP, voici comment procéder SANS la surcharge d'appeler plusieurs requêtes à chaque boucle:

$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>";

Autres conseils

Recherchez-vous quelque chose comme le tag OPTGROUP ?

optgroup est définitivement la voie à suivre. C'est en fait ce à quoi ça sert,

Par exemple, consultez la source de http://www.grandhall.eu/tips/submit / - le sélecteur sous "Grandhall Grill Used".

Vous pouvez utiliser et un espace / tiret indentation dans le code HTML réel. Vous aurez cependant besoin d'une boucle de récupération pour le construire. Quelque chose comme:

<?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;

?>

Ou quelque chose de similaire;)

Idéalement, vous sélectionneriez toutes ces données dans le bon ordre dès leur sortie de la base de données, puis vous ne feriez que passer en boucle pour la sortie. Voici mon point de vue sur ce que vous demandez

<?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>";

Si vous n'aimez pas utiliser la fonction coalesce () , vous pouvez ajouter un " display_order " colonne à cette table que vous pouvez définir manuellement, puis utiliser pour ORDER BY .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top