Выпадающий список PHP с основным элементом в качестве optgroup и дочерним элементом в качестве опции

Я пытаюсь создать раскрывающийся список из базы данных, которая содержит основные элементы и их дочерние элементы. Я хочу, чтобы основные элементы стали метками optgroup, а дочерние элементы - элементами option.

<select>
  <optgroup label="$rs_pa['Name']">
    <option value="$rs_ch['Link']">$rs_ch['Name']</option>
    <option value="$rs_ch['Link']">$rs_ch['Name']</option>
  </optgroup>
  <optgroup label="$rs_pa['Name']">
    <option value="$rs_ch['Link']">$rs_ch['Name']</option>
    <option value="$rs_ch['Link']">$rs_ch['Name']</option>
  </optgroup>
</select>

Выше приведена просто схема, показывающая, где должна соответствовать каждая переменная.

$ rs_pa ['Name] - это имя родительского элемента.

$ rs_ch ['Name] - это имя дочернего элемента.

$ rs_ch ['Link'] - это ссылка дочернего элемента.

Вот код, который у меня есть сейчас:

$mysql_table_items      = "sys_menu_top";
$mysql_table_options    = "sys_options";

// SQL QUERY
$mysql_result_number    = mysql_query("SELECT VALUE FROM $mysql_table_options WHERE Name LIKE 'nav_menu_elements_on_line_usr'") or die($myQuery . "<br/><br/>" . mysql_error());
$mysql_select_parent    = "SELECT * FROM $mysql_table_items WHERE `Parent` = '0' AND Type LIKE 'top' AND Active = 1 ORDER BY `Order` ASC";
$mysql_select_child     = "SELECT * FROM $mysql_table_items WHERE `Parent` = '" . $rs_pa['ID'] . "' AND Active = 1 ORDER BY `Order` ASC";

// SQL RESULT
$mysql_result_number    = mysql_fetch_array($mysql_result_number, MYSQL_ASSOC) or die("Error: Query Failed! " . mysql_error());
$mysql_result_parent    = mysql_query($mysql_select_parent) or die("Error: Query Failed! " . mysql_error());
$mysql_result_child     = mysql_query($mysql_select_child) or die("Error: Query Failed! " . mysql_error());

$output .= "<select>";
while ($rs_pa = mysql_fetch_array($mysql_result_parent)) {
    $output .= "<optgroup label='" . $rs_pa['Name'] . "'>";
    while ($rs_ch = mysql_fetch_array($mysql_result_child)) {
        $output .= "<option value='" . $rs_ch['Link'] . "'>" . $rs_ch['Name'] . "</option>";
        }
    $output .= "</optgroup>";
    }

$output .= "</select>";

echo $output;

Проблема в том, что это не так, как надо.. Я попробовал все, но я не так хорош с php.. Спасибо за любую помощь..

1 ответ

Решение

Вы ссылаетесь на $rs_pa['ID'] на этой линии:

$mysql_select_child     = "SELECT * FROM $mysql_table_items WHERE `Parent` = '" . $rs_pa['ID'] . "' AND Active = 1 ORDER BY `Order` ASC";

Уверены ли вы $rs_pa['ID'] определяется в этой точке?

Примерно так должно работать лучше:

$mysql_table_items      = "sys_menu_top";
$mysql_table_options    = "sys_options";

// SQL QUERY
$mysql_result_number    = mysql_query("SELECT VALUE FROM $mysql_table_options WHERE Name LIKE 'nav_menu_elements_on_line_usr'") or die($myQuery . "<br/><br/>" . mysql_error());
$mysql_select_parent    = "SELECT * FROM $mysql_table_items WHERE `Parent` = '0' AND Type LIKE 'top' AND Active = 1 ORDER BY `Order` ASC";

// SQL RESULT
$mysql_result_number    = mysql_fetch_array($mysql_result_number, MYSQL_ASSOC) or die("Error: Query Failed! " . mysql_error());
$mysql_result_parent    = mysql_query($mysql_select_parent) or die("Error: Query Failed! " . mysql_error());

$output = "<select>";

while ($rs_pa = mysql_fetch_array($mysql_result_parent))
{
    $output .= "<optgroup label='" . $rs_pa['Name'] . "'>";

    $mysql_select_child     = "SELECT * FROM $mysql_table_items WHERE `Parent` = '" . $rs_pa['ID'] . "' AND Active = 1 ORDER BY `Order` ASC";
    $mysql_result_child     = mysql_query($mysql_select_child) or die("Error: Query Failed! " . mysql_error());

    while ($rs_ch = mysql_fetch_array($mysql_result_child))
    {
        $output .= "<option value='" . $rs_ch['Link'] . "'>" . $rs_ch['Name'] . "</option>";
    }

    $output .= "</optgroup>";
}

$output .= "</select>";

echo $output;

Некоторые дальнейшие улучшения могут быть сделаны:

  • Прекратить использование mysql_query и переключитесь на PDO ( http://php.net/manual/en/ref.pdo-mysql.php), который является более безопасным. mysql_query функции все равно не поддерживаются, начиная с PHP 5.5.0.
  • Перепишите ваш запрос, чтобы получить все необходимые данные в одном запросе. Это действительно ускорит вещи.
  • Отделите ваш PHP от HTML с помощью шаблонов.
Другие вопросы по тегам