Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Многоуровневое меню - Под меню не выводится в цикле
 
 автор: dinya_1   (25.07.2011 в 17:08)   письмо автору
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) > )
{
$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 в цикле не выводит?

  Ответить  
 
 автор: Rolex   (26.07.2011 в 00:47)   письмо автору
 
   для: dinya_1   (25.07.2011 в 17:08)
 

Здравствуйте. Проблема в чем:

musql_num_rows($result) 

возвращает количество рядов массива, т.е. 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) > 

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


  Ответить  
 
 автор: evgenijj   (27.07.2011 в 06:17)   письмо автору
 
   для: 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) > ) {
    
$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] > $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 $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_array0);
?>

  Ответить  
 
 автор: Dinya_1   (07.11.2011 в 19:13)   письмо автору
 
   для: evgenijj   (27.07.2011 в 06:17)
 

Вопрос снят. :))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования