[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Деревья, с использованием PHP + MySQL
aserg
Здравствуйте!

Помогите разобраться с деревьями. С использованием PHP + MySQL…
Хочу сделать меню, средствами PHP - элементы беру из базы…

То есть дерево с открытием и закрытием….

- 1 ….
- 1.1 ….
+ 1.1.1 …
+ 2 ….
+ 3 ….




Спустя 8 минут, 24 секунды (15.07.2009 - 17:58) kirik написал(а):
Так как с чем именно помочь не понятно, ищи "mysql иерархия"

Спустя 1 минута, 42 секунды (15.07.2009 - 18:00) Kuliev написал(а):
aserg
тебе надо что-то типа этого Посмотри здесь!

Спустя 11 дней, 20 часов, 30 минут, 43 секунды (27.07.2009 - 14:31) mc-sim написал(а):
Цитата (Kuliev @ 15.07.2009 - 15:00)
aserg
тебе надо что-то типа этого Посмотри здесь!

Kuliev, именно то, что надо! такая же проблема стоит..
Есть таблица table, вида:
PHP
id    parent_id             title
1          0            zagolovok1
2          0            zagolovok2
3          1            zagolovok1_1
4          1            zagolovok1_2
5          2            zagolovok2_1
....

у корневых пунктов меню parent_id = 0, у вложеных - id родителя.
Возможно ли реализовать вывод из данной таблицы, без использования функций, Например с помощью циклов (for, foreach и т.п.) и условий, в следующем порядке:
PHP
zagolovok1
  zagolovok1_1
  zagolovok1_2 
zago

Причем, при щелчке на zagolovok2 - открывается подменю этого заголовка, а при щелчке на zagolovok1 - подменю данного заголовка, при этом подменю zagolovok2 сворачивается. (но это не обязательно)
Заранее спасибо за помощь!!!
Впринцыпе, решение от части есть такое:
PHP
<? 
   $ship 
= array( 
      
"Passenger ship" => array("Yacht","Liner","Ferry"), 
      
"War ship" => array("Battle-wagon","Submarine","Cruiser"), 
      
"Freight ship" => array("Tank vessel","Dry-cargo ship","Container  
      cargo ship"
) 
   
); 
   foreach
($ship as $key => $type) 
   
{ 
      echo
( 
      
"<h2>$key</h2>\n"."<ul>\n"); 
      foreach
($type as $ship) 
      
{ 
         echo
("\t<li>$ship</li>\n"); 
      
} 
   
} 
   echo
("</ul>\n");

Но как мне из базы вевести данные в виде массива/многомерного массива?
Очень прошу помощи...

Спустя 4 часа, 19 минут, 30 секунд (27.07.2009 - 18:50) Krevedko написал(а):
ха...а я у себя на сайте такое сделал...только у меня две таблицы. в одной категории, в другой подкатегории..
И при нажатии на категорию через GET передается ее id. Потом идет проверка isset и если что-то есть, то в цикле выводятся нужные подкатегории.
Короче все работает.


Спустя 57 минут, 16 секунд (27.07.2009 - 19:47) Sylex написал(а):
когда-то поднимал тему, подбирал материалы, может нужно:
http://phpforum.ru/index.php?showtopic=15900

Спустя 3 часа, 17 минут, 52 секунды (27.07.2009 - 23:05) mc-sim написал(а):
Цитата (Krevedko @ 27.07.2009 - 15:50)
ха...а я у себя на сайте такое сделал...только у меня две таблицы. в одной категории, в другой подкатегории..
И при нажатии на категорию через GET передается ее id. Потом идет проверка isset и если что-то есть, то в цикле выводятся нужные подкатегории.
Короче все работает.

Krevedko, привет! Можешь код выложить?

Спустя 18 часов, 47 минут, 57 секунд (28.07.2009 - 17:53) Krevedko написал(а):
Да, конечно. Великие гуру меня заклюют конечно, но алгоритм придумал я сам и даже без всяких посторонних сайтов с готовыми алгоритмами.

PHP
#Функция выборки товаров. Если нет подкатегорий, то выборка всех товаров
    
function goods()
    {
        if (isset (
$_GET['search']))  //Выборка товаров по результатам поиска
        
{
            
$search $_GET['search'];
            
$category $_GET['category'];
            
$search preg_replace("/[^\w\x7F-\xFF\s]/"" "$search);
            if (
$_GET['category'] == "Все")
            {
                
$result mysql_query ("SELECT `group`.category, goods.id, goods.name, goods.price, goods.comments, goods.point, goods.presence, goods.image_mini
                FROM `group` 
                JOIN goods 
                ON `group`.id = goods.group_id 
                AND goods.name LIKE '%$search%'"
                
,CONNECT);
            }
            else 
            {
                
$result mysql_query ("SELECT `group`.category, goods.id, goods.name, goods.price, goods.comments, goods.point, goods.presence, goods.image_mini
                FROM `group` 
                JOIN goods 
                ON `group`.id=goods.group_id 
                AND goods.name LIKE '%$search%'
                AND group.category = '$category'"
                
,CONNECT);
            }
        }
        elseif (isset (
$_GET['podgroup']))  //Выборка категорий
        
{
            
$result mysql_query ("SELECT `group`.category, goods.id, goods.name, goods.price, goods.comments, goods.point, goods.presence, goods.image_mini
            FROM `group` 
            JOIN goods 
            ON `group`.id = goods.group_id 
            AND `group`.id = "
.$_GET['podcat']."
            AND goods.podgroup_id = "
.$_GET['podgroup']."
            ORDER BY goods.id DESC"
            
,CONNECT);
        }
        elseif (isset (
$_GET['podcat']))  //Выборка подкатегорий
        
{
            
$result mysql_query ("SELECT `group`.category, goods.id, goods.name, goods.price, goods.comments, goods.point, goods.presence, goods.image_mini
            FROM `group` JOIN goods 
            ON `group`.id = goods.group_id 
            AND `group`.id = "
.$_GET['podcat']."
            ORDER BY goods.id DESC"
            
,CONNECT);
        }
        else   
//Выборка всех товаров
        
{
            
$result mysql_query ("SELECT `group`.category, goods.id, goods.name, goods.price, goods.comments, goods.point, goods.presence, goods.image_mini
            FROM `group` JOIN goods 
            ON `group`.id = goods.group_id 
            ORDER BY goods.id DESC"
            
,CONNECT);
        }
        
# Проверка на ошибку запроса  
        
valid_query($result);    
        return 
$result;
    }


Результат можешь посмотреть на сайте, который я сейчас пишу

тут

Понажимай на ссылки Фильмы или Игры.

Спустя 20 минут, 15 секунд (28.07.2009 - 18:14) Sylex написал(а):
Цитата (Krevedko @ 28.07.2009 - 20:53)
Великие гуру меня заклюют конечно

biggrin.gif

Krevedko, молодец! smile.gif

Спустя 3 часа, 11 минут, 47 секунд (28.07.2009 - 21:25) sergeiss написал(а):
Цитата (Krevedko @ 28.07.2009 - 18:53)
Великие гуру меня заклюют конечно,

Извиняй, ты сам попросил... Начинаю клевать smile.gif

Во-первых, то, что сам сделал - это очень хорошо! rolleyes.gif

Во-вторых. У тебя нету единого стиля запросов. Для одной таблицы используешь обратные кавычки, для другой - нет. Лучше уж тогда пиши всегда.

В-третьих, каждый блок у тебя состоит из вызова одной функции mysql_query.
Лучше будет в каждом блока записать запрос в переменную, а выполнение запроса сделать после всех ИФоф. Там, где у тебя valid_query.
Например, если ты захочешь все-таки написать что-то типа 'or die( mysql_error())', то тебе надо будет это делать только в одном месте.

В-четвертых. Что это за "китайский кодинг"? smile.gif Зачем каждый раз писать один и тот же список параметров? У тебя же отличия запросов только в условиях. Поэтому лучше (см. также "в-третьих") писать запрос в отдельную переменную. Сначала туда пишешь список параметров, затем (в ИФах) добавляешь нужные условия, а затем уже выполняешь готовый запрос. Это позволит, в случае необходимости, только в одном месте изменить список параметров. Или можно будет легко и просто добавить новые условия.

В-пятых. Это же функция, вроде... Поэтому я бы рекомендовал не брать величины из GET внутри функции, а передавать их в фунцию в виде параметров функции.

В-шестых, ты не проводишь проверку величин из GET перед использованием их в запросах, а это - широченные ворота для SQL-инъекции.

А в-седьмых, это не критика была, а анализ написанного тобой, чтобы ты мог совершенствоваться smile.gif

Спустя 13 минут, 41 секунда (28.07.2009 - 21:39) Krevedko написал(а):
эээ..в обратные кавычки я беру только group...и то вынужденная мера, потому что иначе он сразу ошибку выдает, видать путает с group by
над остальным помозгую. спасибо за замечания.

кстати запрос в переменную-хорошая идея..

rolleyes.gif

от инъекций еще не защищался, поскольку еще не разобрался как..

Спустя 4 минуты, 22 секунды (28.07.2009 - 21:43) sergeiss написал(а):
Цитата (Krevedko @ 28.07.2009 - 22:39)
от инъекций еще не защищался, поскольку еще не разобрался как..

Вот тут очень неплохая подборка на эту тему. Всё разжевано "от и до" wink.gif

Спустя 1 минута, 29 секунд (28.07.2009 - 21:45) Krevedko написал(а):
спасибо. почитаю щас на ночь глядя biggrin.gif

Спустя 9 дней, 23 часа, 27 минут, 45 секунд (8.08.2009 - 21:13) mc-sim написал(а):
Люди, спасибо всем за советы!
Везде шлют на функции, да на рекурсии.
Не подскажите, как можно реализовать данный функционал с помощью циклов, при условии двойной вложенности меню? (пункт-подпункт)
Спасибо! biggrin.gif

Спустя 1 час, 25 минут, 59 секунд (8.08.2009 - 22:39) jetistyum написал(а):
мне кажется, если пунктов меню заведомо не много, можно их выбрать все одним запросом, а потом просто при выводе смотреть в массиве записи с таким-же id
без рекурсии я тут не вижу решения.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.