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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Два запроса к базе или один?

Сообщения:  [1-10]   [11-19] 

 
 автор: Лена   (07.07.2008 в 12:59)   письмо автору
 
   для: Trianon   (07.07.2008 в 12:51)
 

Пути решений могут быть разными. Спасибо за все.

   
 
 автор: Trianon   (07.07.2008 в 12:51)   письмо автору
 
   для: Лена   (07.07.2008 в 12:34)
 

Всё равно это не повод, так над тегами издеваться.
Вот:
<?php
include("configs/dbopen.php");
require (
"smarty/Smarty.class.php");
$smarty = new Smarty;
function 
showTree($parent_id,$level
{
  global 
$link$list;
  
$sql "SELECT * FROM `menu` WHERE `pid` = "$parent_id ." ORDER BY `id_menu`";
  
//echo $sql."<br>";
  
$result mysql_query($sql) or die (mysql_error());
  
  if (
$level && mysql_num_rows($result) > 0
  {
     
$ulopn "<ul>";
     
$ulcls "</ul>";
  } else 
$ulopn $ulcls "";
  
$list .= $ulopn;
  while (
$row mysql_fetch_row($result)) 
  {
    
$list.= "<li><A HREF=\"?id=$row[0]\">".htmlspecialchars($row[2])."</A>";
    
showTree($row[0],$level+1);
    
$list.="</li>";
  }
  
$list .= $ulcls;
}

//$list = "<div class='suckerdiv'>";
//$list .= "<ul id='suckertree1'>";
showTree(0,0);
//$list .= "</ul>";
//$list .= "</div>";
$smarty->assign('arr'$list);
$smarty->display("menu1.tpl");
?>

   
 
 автор: Лена   (07.07.2008 в 12:34)   письмо автору
 
   для: Trianon   (07.07.2008 в 11:37)
 

Если у нас есть вложенные элементы, то у элемента-родителя вырезаем substr() закрывающий тэг LI:
$list = substr($list, 0, -5);
Если вложения идут, например, вот так:
<li><ul>
<li></li>
<li></li>
</ul>
получается, что родительский элемент LI все еще открыт (потому как мы вырезали substr() конечный тэг). Поэтому надо его закрыть, у меня это: $ulcls = "</ul></li>"; Поэтому в случае вложений открывается один тэг, а закрывается - два. Если же мы имеем дело с родителем, то конечный LI не вырезается.

   
 
 автор: Trianon   (07.07.2008 в 11:37)   письмо автору
 
   для: Лена   (07.07.2008 в 09:28)
 

а) Вместо showTree($row[0],$level++); нужно написать showTree($row[0],$level+1);
б) в строках $ulopn = "<ul>";
$ulcls = "</ul></li>";
Вы почему-то готовитесь открыть один тег , а закрыть - два.

   
 
 автор: Лена   (07.07.2008 в 09:28)   письмо автору
 
   для: sim5   (04.07.2008 в 18:31)
 

Код, преложенный Trianon`ом, работает нормально.
Но, если в функции формировать уровень, то получается вот что:

<?php
include("configs/dbopen.php");
require (
"smarty/Smarty.class.php");
$smarty = new Smarty;
function 
showTree($parent_id,$level) {
  global 
$link$list;
  
$sql "SELECT * FROM `menu` WHERE `pid` = "$parent_id ." ORDER BY `id_menu`";
  
//echo $sql."<br>";
  
$result mysql_query($sql) or die (mysql_error());
  
if (
$level && mysql_num_rows($result) > 0) {
     
$ulopn "<ul>";
     
$ulcls "</ul></li>";
     
$list substr($list0, -5);
  } else 
$ulopn $ulcls "";
  
$list .= $ulopn;
  while (
$row mysql_fetch_row($result)) {
  
$list.= "<li><A HREF=\"?id=$row[0]\">".htmlspecialchars($row[2])."</A></li>";
  
showTree($row[0],$level++);
  }
  
  
$list .= $ulcls;

}

//$list = "<div class='suckerdiv'>";
//$list .= "<ul id='suckertree1'>";
showTree(0,0);
//$list .= "</ul>";
//$list .= "</div>";
$smarty->assign('arr'$list);
$smarty->display("menu1.tpl");
?>

При этом содержимое выводится следующим образом(на вот таких уровнях):
Пункт1
Пункт1.1.
Пункт 1.2.
Пункт 2
Пункт 3
Пункт 3.1.
Пункт 3.2
А надо, чтобы Пункт1.1 и Пункт 1.2 выпадали, как и Пункт 3.1, Пункт 3.2. Получается стиль не срабатывает для потомков Пункта 1.
Где ошибка?

   
 
 автор: sim5   (04.07.2008 в 18:31)   письмо автору
 
   для: Trianon   (04.07.2008 в 18:14)
 

)) Это мой недосмотр, я сократил пример кода, оставив по одному родителю и их потомков, что бы покороче было, когда выставлял меню, потому так получилось.

   
 
 автор: Trianon   (04.07.2008 в 18:14)   письмо автору
 
   для: sim5   (04.07.2008 в 17:29)
 

Тогда может быть Вы мне это проясните?
<div class="suckerdiv">
<ul id="suckertree1">
<li><a href="#">Главная</a></li>
  <ul>
  <li><a href="#">JavaScript</a></li>
    <ul>
    <li><a href="#">PHP 4</a></li>
    </ul>
  </li>
</ul>
</li>
<li><a href="#">CSS</a></li>
</ul>
</div> 

Потому что я двух открывающих тэгов в этом коде не вижу

   
 
 автор: sim5   (04.07.2008 в 17:29)   письмо автору
 
   для: Trianon   (04.07.2008 в 17:04)
 

Нет, закрывающие теги элементов LI на месте - это родительские элементы. Картина немного прояснилась - я увидел JS и CSS. Нужно формировать в функции уровень, проверять его, формируя родительские элементы UL и LI. Этого должно хватить. Иначе суть вопроса в объедении в одном запросе - получить pid равное parent, одновременно узнавая есть ли у этого id потомки. В общем я так все понял.

   
 
 автор: Trianon   (04.07.2008 в 17:04)   письмо автору
 
   для: sim5   (04.07.2008 в 16:29)
 

Вот в этом примере 4-я снизу строка </li> явно чужая. Во всяком случае соответствующего открывающего тега я не нашел.

Уровень вложенности необязательно передавать параметром.
Его можно посчитать в статической переменной.

ShowTree()
{
static $level=0;
++$level;
.....
ShowTree()
....
--level;
return $list;
}

   
 
 автор: sim5   (04.07.2008 в 16:29)   письмо автору
 
   для: Trianon   (04.07.2008 в 15:51)
 

Полон или нет был пример, сказать не могу. Я не видел CSS для меню, но мне показали пример HTML-кода меню:

<div class="suckerdiv">
<ul id="suckertree1">
<li><a href="#">Главная</a></li>
  <ul>
  <li><a href="#">JavaScript</a></li>
    <ul>
    <li><a href="#">PHP 4</a></li>
    </ul>
  </li>
</ul>
</li>
<li><a href="#">CSS</a></li>
</ul>
</div>

И если все так, то думается, достаточно будет добавить аргументом функции еще и уровень вложения, по которому определять вложенность. В противном случае (как я понимаю) требуется запросом узнавать не только, что pid=parent, но и есть ли категории с id равными pid, то есть - имеет ли запрашиваемая категория потомков.

   

Сообщения:  [1-10]   [11-19] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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