Forum Webscript.Ru

Программирование => PHP => Тема начата: AlexDJ от 16 Ноября 2004, 07:27:08

Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: AlexDJ от 16 Ноября 2004, 07:27:08
У нас в сети решили сделать портал-базу по рефератам. Все я сделал остались две траблы, про первую я здесь и пишу.
   Итак, имеется база с названием \'referats\'. В ней есть таблицы: {cat [id, name, info]; news [id, data, title, text]; refs [id, scat_id, title, type_id, type, descr, date, pages, comm]; scat [id, cat_id, name]; types [id, name]}. Таблицы отмечены {}, поля в них - [] :)
   Задача такая: нужно организовать на странице вывод вывод работ по категориям в таком виде.
   Сверху должна быть шапка: все предметы, А-Б, В-Г, Д-Е, Ж-З, И-К, Л-М, Н-О, П-Р, С-Т , У-Ф, Х-Ч, Ц-Я
   Дальше само тело вывода: тут должно быть дерево, в котором должны быть выведены категории (cat [name]), причем, если у категории есть подкатегории (то есть в scat есть ссылка на данную категорию в cat - например, scat [cat_id = 7] означает, что в категории cat [id] = 7 есть подкатегории в таблице scat с полем [cat_id] = 7), то слева от категории должен быть "+" и при нажатии на категорию, она бы раскрывалась в виде дерева, меняла цвет на красный, и под ней появлялись бы подкатегории и "+" менялся бы на "-". Соответственно, все наоборот при закрытии.
   Немного подробнее о выводе дерева. Как уже, наверное, понятно, дерево должно выводится в зависимости от запроса из шапки, то есть по алфавитному порядку (или сразу все, в зависимости от выбора). То есть, нажали, допустим, на Ж-З - выведется дерево из категорий, начинающихся на Ж и З и т.д., нажали на П-Р - из категорий, начинающихся на П-Р. По умолчанию, при открытии страницы, должны выводиться категории А-Б.Что касается ссылок. Категории должны иметь ссылки в виде /?mode=cat&id=7 (где ID - это cat [id]), подкатегории - в виде /?mode=item&id=7&sid=1 (где ID - это cat [id], sid - это scat [id]), работы - в виде /?mode=info&id=386 (где ID - это refs [id]).
   Причем, есть еще один нюанс: под деревом должна быть строка: все работы, курсовые, рефераты, контрольные, дипломы, доклады, отчеты. Рядом с этими словами должны быть checkbox’ы, при выборе которых в дереве должны отображаться категории/подкатегории, имеющие внутри себя ТОЛЬКО отмеченные работы. Кстати, это {types [name]}.
   При выборе категории (если она без подкатегорий) или подкатегории, должна открыться новая страница, скажем, spisok.php вместо данной (у меня это все открывается внутри таблицы), на которой сверху наше дерево с выбранным буквенным (или общим) разделом, а под ним собственно, таблица, в которой работы из выбранной категории (подкатегории).
   Причем, есть еще один нюанс: под деревом должна быть строка: все работы, курсовые, рефераты, контрольные, дипломы, доклады, отчеты. Рядом с этими словами должны быть checkbox’ы, при выборе которых в дереве должны отображаться категории/подкатегории, имеющие внутри себя ТОЛЬКО отмеченные работы. Соответственно, в таблице должны отображаться, только те работы, которые сооответствуют выбранному {types [name]}.
   Теперь подробней о структуре таблицы. Сверху таблицы - шапка, в которой слева должны быть подкатегории в выбранной категории (если таковые имеются, иначе NULL), справа должны быть номера страниц (поскольку работ ОЧЕНЬ много, вывод нужно сделать постраничным).
   Далее, шапка самой таблицы. Таблица должна состоять из 5 колонок: ID (refs [id]), тема работы (refs [title]), тип работы (refs [type]), объем (refs [pages]), дата (refs [date]). В таблице, собственно, вывод запроса.
   Под таблицей шапку, аналогичная той, что над таблицей: шапка, в которой слева должны быть подкатегории в выбранной категории (если таковые имеются, иначе NULL), справа должны быть номера страниц (поскольку работ ОЧЕНЬ много, вывод нужно сделать постраничным).


   Вот такая вот задачка. Подобные дерева ввода данных я видел, здесь лишь усложнена структура. Поскольку сам я ч этими деревьями еще не работал, прошу хэлпа, чтобы сразу помогли написать итоговый код. Я думаю, что данный код можно будет потом выложить в open source’ы в интернете, т.к. я думаю, что со временем все сталкиваются с необходимостью реализации подобных проблем.
   Я уже неделю не спал - делал сам портал. Осталось эти два скрипта: дерево и поиск, а я хочу спать :((( Зато, если поможете, я получу автомат по информатике :)))

   ЗЫ Если что - меня можно найти в асе: 125659225, или в ИРКе на 213.24.73.20:6667. Мой ник AlexDJ
   ЗЫ2 Заранее огромный фэнкс и респект тому, кто сможет помочь.
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: Daiz13 от 16 Ноября 2004, 11:54:50
Мне одно непонятно - с чем именно возникли проблемы, задание описано детально, бери и делай. Возникнут конкретные проблемы - ищи на форуме, может кто-то с таким уже сталкивался, а уже потом спрашивай. Или ты расчитываешь, что кто-то сейчас быстренько напишет тебе твое задание по информатике?

а для начала почитай про Nested Set, например здесь (http://www.webscript.ru/stories/04/09/01/8197045)
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: AlexDJ от 16 Ноября 2004, 12:26:51
Для начала я не могу сделать побуквенный вывод, не говоря уже о ссылках. Nested Set попробовал, но запутался окончательно, т.к. там используются вспомогательные три таблицы, а что с ними делать и с чем их есть - я так и не понял :(((
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: CGVictor от 17 Ноября 2004, 16:03:15
Daiz13
Я понимаю, что хотелось как лучше, но NestedTrees (указание родителя) для понимания гораздо легче чем NestedSets.
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: Daiz13 от 19 Ноября 2004, 13:00:31
CGVictor
согласен, NestedTrees гораздо легче, хотя в данном случае вообще трудно что-то посоветовать


Цитировать
AlexDJ:
Для начала я не могу сделать побуквенный вывод

к концу недели у меня телепатические способности совсем упали, побуквенный вывод чего и для чего? предметов, рефератов, категорий?
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: AlexDJ от 20 Ноября 2004, 14:53:13
Вот снова и я :)
Итак за то время, пока меня не было, я умудрился сделать почти все сам. :) Осталась лишь одна трабла.

Итак, проблема осталась такая:

К этой проблеме я даже пока не знаю, как подступиться.
Под деревом должна быть строка: все работы, курсовые, рефераты, контрольные, дипломы, доклады, отчеты. Рядом с этими словами должны быть checkbox’ы, при выборе которых в дереве должны отображаться категории/подкатегории, имеющие внутри себя ТОЛЬКО отмеченные работы.

Вот строка с checkbox\'ами (это я сделал сам Ж-) ):

       Все работы
      
       Курсовые
            
       Рефераты
            
       Контрольные
            
       Дипломы
            
       Доклады
            
       Отчеты
            

И что делать дальше, я понятия не имею :(
Дальше нужно проверить, какие checkbox\'ы отмечены, а какие нет, и в зависимости от этого по ссылке из "дерева" должна открываться страница только с выбранными типами работ. Как это сделать - я даже не представляю. Буду признателен, если тут вы сможете помочь.
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: Daiz13 от 21 Ноября 2004, 12:59:55
шаг 1. На форму добавляеш нудніе чекбоксы:
Курсовые

Рефераты

передаешь данные постом или гетом и потом проверяешь массив types - получаем требуемые типы.

шаг 2. из таблицы извлекаем соответствующие записи (рефераты, контрольные и т.д.). Предполагаю, что все рефераты, курсовые и т.д. хранятся в одной таблице и для каждой работы указан ее тип. Если отмечено "все работы" то извлекаем из таблицы все записи.
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: AlexDJ от 21 Ноября 2004, 13:36:09
Имеется база с названием \'referats\'. В ней есть таблицы: {cat [id, name, info]; news [id, data, title, text]; refs [id, scat_id, title, type_id, type, descr, date, pages, comm]; scat [id, cat_id, name]; types [id, name]}. Таблицы отмечены {}, поля в них - []

Каким образом извлечь эти данные, чтобы они потом выходили на следующей странице? Не понимаю... Можно кодом?
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: Daiz13 от 22 Ноября 2004, 17:06:59
AlexDJ
твои вопросы это именно тот случай когда ничего более приличного чем RTFM  в голову не приходит
[p]mysql_query[/p]
[p]mysql_fetch_array[/p]
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: Меняздесьдавнонет от 22 Ноября 2004, 17:12:41
Цитировать
Daiz13:
Каким образом извлечь эти данные, чтобы они потом выходили на следующей странице? Не понимаю...

если честно - я тоже.
какой смысл извлекать данные на одной странице, если они нужны на другой?
Какой смысл извлекать ВСЕ данные, какие только есть? Неужили они прямо все и требуются?
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: AlexDJ от 22 Ноября 2004, 22:08:12
Сорри, кажется, я не совсем ясно выразился.
Выводится каталог с деревом, в котором есть категории и (если есть) подкатегории в категориях. У этих (под)категорий есть ссылки вида и для категорий и подкатегорий соответственно. Ссылки эти открывают страницу, на которой отображаются рефераты из данной категории.
Чекбоксы нужны для того, чтобы ограничить вывод определенными в чекбоксах типами работ (type_id).

Вот, надеюсь теперь понятно объяснил.
Название: Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева
Отправлено: AlexDJ от 22 Ноября 2004, 22:12:25
Вот мой скрипт отображения категорий:


function print_cats_8() {

    $qq = "

    ";


    $query = "SELECT  * FROM  `cat` WHERE  `name` BETWEEN  \'П%\' AND  \'С%\' ORDER by name;";
//    $query = "SELECT  * FROM  `refs` WHERE  `cat_id`  =33 AND  `scat_id`  =24 AND  `type_id`  =2;";

    $rez = sql_query($query);

    while (list ($id, $name) = mysql_fetch_array($rez)) {

$query2 = "SELECT * FROM scat WHERE cat_id=\'".$id."\' ORDER by name;";
$rez2 = sql_query($query2);


if (mysql_num_rows($rez2) != 0) {
       $qq .= "";
  $qq .= "-";

     $app_1 = "onclick=\\"return displayNews5(".$id.");\\" ";
        $app_2 = "onclick=\\"cache(\'a1\'); cache(\'t2\'); montre(\'t1\'); return displayNews5(".$id.");\\" ";
  } else {
       $qq .= "   ";
  $qq .= "-";

$app_1 = "";
$app_2 = "";
}

    $qq .= "   
".$name."
\\n";
// $qq .= "   ".$name."
\\n
";


if (mysql_num_rows($rez2) != 0) {
//     $qq .= "   Разделы

//\\n";
   $qq .= "
\\n";
   while( list ($id2, $cat_id, $name2) = mysql_fetch_array($rez2)) {
$qq .= "          ".$name2."
\\n";
   }
   $qq .="
\\n";
}
    }
    return $qq;
}