Выпадающий список 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 с помощью шаблонов.