|
 15.9 Кб |
|
| Хочю сделать вывод Многоуровневого меню в цикле.
Меню Состоит из трёх частей:
1.Разделы (В цикле работает)
2. Подразделы (выводится только 1результат)
3. Тоже что и со вторым
НЕ ПОЙМУ в ЧЕМ ДЕЛО ВРОДЕ ВСЕ ВЕРНО, а все равно не хочет выодить..
(В Качестве образца прикладываю скрин сделанный в HTML)
<div id="myslidemenu" class="jqueryslidemenu" align="center">
<ul>
<?
//1.Выводим разделы
$res_razdel = mysql_query("SELECT id,razdel FROM razdel ORDER BY id",$db);
if (mysql_num_rows($res_razdel) > 0 )
{
$row_razdel = mysql_fetch_array($res_razdel);
do
{
//2Вывод подразделов
$query ="SELECT id,razdel,name FROM podrazdel WHERE razdel='$row_razdel[razdel]' ORDER BY id";
$result6 = mysql_query ($query,$db);
if(!$result6) exit("Ошибка выполнения запроса - ".mysql_error());
$podrazdel = "";
//Получаем количеcтво рядов cоглаcно запроcа
if(mysql_num_rows($result6))
{
while($myrow6 = mysql_fetch_array($result6))
{
//3. Вывод ПодПодразделов
//Вытаскиваем третью часть меню
/*$query1 ="SELECT id,razdel,name FROM post WHERE podrazdel='$myrow6[name]' ORDER BY id";
$respost = mysql_query ($query1,$db);
if(!$respost) exit("Ошибка выполнения запроса - ".mysql_error());
$post = "";
//Получаем количеcтво рядов cоглаcно запроcа
if(mysql_num_rows($respost))
{
while($rowpost = mysql_fetch_array($respost))
{
$post .= "<ul><li><a href='#'>$rowpost[name]</a></li></ul>";
}
} $post
*/
$podrazdel .= "<ul><li><a href='#'>$myrow6[name]</a></li></ul>";
}
}
echo "<li><a href='#'>$row_razdel[razdel]</a>$podrazdel </li>";
//Конец общего вывода
}
while ($row_razdel = mysql_fetch_array($res_razdel));
}
?>
</ul>
<br style="clear: left" />
</div>
|
Подскажите пожалуйста, в чем проблема, почему while в цикле не выводит? | |
|
|
|
|
|
|
|
для: dinya_1
(25.07.2011 в 17:08)
| | Здравствуйте. Проблема в чем:
возвращает количество рядов массива, т.е. integer. А Вы проверяете её как величину типа boolean, имеющую значение true или false. Поэтому она имеет при проверке лонструкцией if сокращенный синтаксис. Полная запись выглядела бы так:
if($condition == true) {
....
}
|
В Вашем скрипте попробуйте так:
<div id="myslidemenu" class="jqueryslidemenu" align="center">
<ul>
<?
//1.Выводим разделы
$res_razdel = mysql_query("SELECT id,razdel FROM razdel ORDER BY id",$db);
if (mysql_num_rows($res_razdel) > 0 )
{
$row_razdel = mysql_fetch_array($res_razdel);
do
{
//2Вывод подразделов
$query ="SELECT id,razdel,name FROM podrazdel WHERE razdel='$row_razdel[razdel]' ORDER BY id";
$result6 = mysql_query ($query,$db);
if(!$result6) exit("Ошибка выполнения запроса - ".mysql_error());
//Получаем количеcтво рядов cоглаcно запроcа
if(mysql_num_rows($result6)>0)
{
while($myrow6 = mysql_fetch_array($result6))
{
//3. Вывод ПодПодразделов
//Вытаскиваем третью часть меню
$query1 ="SELECT id,razdel,name FROM post WHERE podrazdel='$myrow6[name]' ORDER BY id";
$respost = mysql_query ($query1,$db);
if(!$respost) exit("Ошибка выполнения запроса - ".mysql_error());
$post = "";
//Получаем количеcтво рядов cоглаcно запроcа
if(mysql_num_rows($respost)>0)
{
while($rowpost = mysql_fetch_array($respost))
{
$post .= "<ul><li><a href='#'>$rowpost[name]</a></li></ul>";
}
}
$podrazdel .= "<ul><li><a href='#'>$myrow6[name]</a></li></ul>";
}
}
echo "<li><a href='#'>$row_razdel[razdel]</a>$podrazdel </li>";
//Конец общего вывода
}
while ($row_razdel = mysql_fetch_array($res_razdel));
}
?>
</ul>
<br style="clear: left" />
</div>
|
| |
|
|
|
|
|
|
|
для: Rolex
(26.07.2011 в 00:47)
| |
<?php
$res_razdel = mysql_query("SELECT id,razdel FROM razdel ORDER BY id",$db);
if ( mysql_num_rows($res_razdel) > 0 ) {
$row_razdel = mysql_fetch_array($res_razdel);
do {
//2Вывод подразделов
$query = "SELECT id,razdel,name FROM podrazdel WHERE razdel='$row_razdel[razdel]' ORDER BY id";
$result6 = mysql_query ($query,$db);
if(!$result6) exit("Ошибка выполнения запроса - ".mysql_error());
$podrazdel = "";
//Получаем количеcтво рядов cоглаcно запроcа
if ( mysql_num_rows($result6) ) {
while($myrow6 = mysql_fetch_array($result6)) {
//3. Вывод ПодПодразделов
//Вытаскиваем третью часть меню
/*$query1 ="SELECT id,razdel,name FROM post WHERE podrazdel='$myrow6[name]' ORDER BY id";
$respost = mysql_query ($query1,$db);
if (!$respost) exit("Ошибка выполнения запроса - ".mysql_error());
$post = "";
//Получаем количеcтво рядов cоглаcно запроcа
if (mysql_num_rows($respost)) {
while($rowpost = mysql_fetch_array($respost)) {
$post .= "<ul><li><a href='#'>$rowpost[name]</a></li></ul>";
}
} // $post
*/
$podrazdel .= "<ul><li><a href='#'>$myrow6[name]</a></li></ul>";
}
}
echo "<li><a href='#'>$row_razdel[razdel]</a>$podrazdel </li>";
//Конец общего вывода
} while ($row_razdel = mysql_fetch_array($res_razdel));
}
?>
|
Скорее всего ошибка в строке (проверять слишком хлопотно)
$query = "SELECT id,razdel,name FROM podrazdel WHERE razdel='$row_razdel[razdel]' ORDER BY id";
PHP сообщит, что Use of undefined constant razdel. Неопределенную константу razdel PHP преобразует к 0 - ну и результат $row_razdel[0], фактически $row_razdel['id']. Это просто случайность, что скрипт вообще что-то вывел.
$query = "SELECT id,razdel,name FROM podrazdel WHERE razdel='".$row_razdel['razdel']."' ORDER BY id";
Тут есть еще одна проблема. Код не то чтобы ошибочный, но и правильным его назвать нельзя. (Я и сам в свое время сделал эту ошибку - пока не прочел "М.Кузнецов, И.Симдянов PHP: практика создания web-сайтов"). Нет принципиальной разницы между "Разделом", "ПодРазделом" и "ПодПодРазделом":
РАЗДЕЛЫ:
Извещатели охранные
Извещатели пожарные
Приборы приемно-контрольные
ПОДРАЗДЕЛЫ:
Извещатели охранные: магнитоконтактные
Извещатели охранные: ударноконтактные
Извещатели охранные: ультразвуковые
Извещатели пожарные: тепловые
Извещатели пожарные: дымовые
Извещатели пожарные: пламени
Приборы приемно-контрольные: охранные
Приборы приемно-контрольные: охранно-пожарные
Приборы приемно-контрольные: пожарные
ПОДПОДРАЗДЕЛЫ:
Извещатели охранные: магнитоконтактные: для деревянных конструкций
Извещатели охранные: магнитоконтактные: для металлических конструкций
.....
Приборы приемно-контрольные: охранно-пожарные: одношлейфные
Приборы приемно-контрольные: охранно-пожарные: с количеством шлейфов от 2 до 6
Приборы приемно-контрольные: охранно-пожарные: с количеством шлейфов от 8 до 10
.....
|
А можно и еще глубже: РАЗДЕЛ->ПОДРАЗДЕЛ->ПОДПОДРАЗДЕЛ->ПОДПОДПОДРАЗДЕЛ->...->ТОВАР
Нет смысла создавать под РАЗДЕЛ одну таблицу БД, под ПОДРАЗДЕЛ - вторую, под ПОДПОДРАЗДЕЛ - третью, под ПОДПОДПОДРАЗДЕЛ - четвертую. Можно обойтись и одной. Назовем ее РАЗДЕЛЫ:
id | parent_id | title
------------------------------------
1 | 0 | Извещатели охранные
------------------------------------
2 | 0 | Извещатели пожарные
------------------------------------
3 | 0 | Приборы приемно-контрольные
------------------------------------
4 | 1 | Извещатели охранные магнитоконтактные
------------------------------------
5 | 1 | Извещатели охранные ударноконтактные
------------------------------------
6 | 1 | Извещатели охранные ультразвуковые
------------------------------------
7 | 2 | Извещатели пожарные тепловые максимальные
------------------------------------
8 | 2 | Извещатели пожарные дымовые
------------------------------------
9 | 2 | Извещатели пожарные пламени
------------------------------------
10 | 3 | Приборы приемно-контрольные охранные
------------------------------------
11 | 3 | Приборы приемно-контрольные охранно-пожарные
------------------------------------
12 | 3 | Приборы приемно-контрольные пожарные
------------------------------------
13 | 1 | Извещатели охранные магнитоконтактные для деревянных конструкций
------------------------------------
14 | 1 | Извещатели охранные магнитоконтактные для металлических конструкций
------------------------------------
...|...........|....................
------------------------------------
24 | 3 | Приборы приемно-контрольные охранно-пожарные одношлейфные
------------------------------------
25 | 3 | Приборы приемно-контрольные охранно-пожарные с количеством шлейфов от 2 до 6
------------------------------------
26 | 3 | Приборы приемно-контрольные охранно-пожарные с количеством шлейфов от 8 до 10
|
Простой вариант дерева (найдете без труда в И-нете - много вариантов)
<?php
#Дерево разделов
#Выбор всех разделов
$parts_query = mysql_query("SELECT id, parent_id, name FROM partitions ORDER BY sortorder");
#Если есть хоть какие-то разделы
if ($parts_query && mysql_num_rows($parts_query) > 0) {
$parts_array = array();
$part_data = 0;
#Распихиваем полученные данные в массив
#Попутно заменяем возможные пустые поля "parent_id"
#(для разделов, не имеющих родителя) на ноль
while($part_data = mysql_fetch_row($parts_query)) {
$part_data[1] = isset($part_data[1]) && $part_data[1] > 0 ? $part_data[1] : 0;
array_push($parts_array, $part_data);
}
mysql_free_result($parts_query);
}
#Это функция, рекурсивно вызывающаяся для формирования дерева разделов
function get_hierarchy($parts_array, $parent_id) {
$my_parent_id = isset($parent_id) && $parent_id > 0 ? $parent_id : 0;
#Кол-во записей на текущем уровне. Нужно для того, чтобы по уму
#выводить <ul>...</ul> для этого уровня, т.е. если записей нет, то и
#эти тэги не нужны.
$this_count = 0;
foreach ($parts_array as $element) {
#Выводим раздел текущего уровня (тот, чей идентификатор родителя
#равен заданному при вызове функции ($parent_id)).
if ($element[1] == $my_parent_id) {
$this_count++;
#Вывод HTML очередного пункта меню.
if ($this_count == 1) echo '<ul>';
echo '<li><a href="parts.php?id='.$element[0].'">'.$element[2].'</a>';
#Функция вызывает саму себя для формирования
#дочерних узлов текущего раздела.
get_hierarchy($parts_array, $element[0]);
echo '</li>';
}
}
if ($this_count > 0) echo '</ul>';
}
#Начальный вызов: идентификатор родительского раздела равен
#нулю, т.е. "родителя нет".
get_hierarchy($parts_array, 0);
?>
|
| |
|
|
|
|
|
|
|
для: evgenijj
(27.07.2011 в 06:17)
| | Вопрос снят. :)) | |
|
|
|