Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите сделать вывод данных из базы данных MySQL в PHP в виде дерева

8.3K
16 ноября 2004 года
AlexDJ
8 / / 16.11.2004
У нас в сети решили сделать портал-базу по рефератам. Все я сделал остались две траблы, про первую я здесь и пишу.
Итак, имеется база с названием '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 Заранее огромный фэнкс и респект тому, кто сможет помочь.
302
19 ноября 2004 года
Sagittarius
648 / / 12.04.2003
Слишком большой текст очень сложен для восприятия.
Единицы будут сидеть и пытаться разобраться в твоем тексте. Разбей его на части, попросту, задавай поочередно конкретные вопросы, и будут тебе ответы. ;)
8.3K
20 ноября 2004 года
AlexDJ
8 / / 16.11.2004
Вот снова и я :)
Итак за то время, пока меня не было, я умудрился сделать почти все сам. :) Осталась лишь одна трабла.

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

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

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

<td>Все работы
<input name="chkall" type="checkbox" value="checkbox" checked> </td>
<td>Курсовые
<input type="checkbox" name="chk1" value="checkbox"> </td>
<td>Рефераты
<input type="checkbox" name="chk2" value="checkbox"> </td>
<td>Контрольные
<input type="checkbox" name="chk3" value="checkbox"> </td>
<td>Дипломы
<input type="checkbox" name="chk4" value="checkbox"> </td>
<td>Доклады
<input type="checkbox" name="chk5" value="checkbox"> </td>
<td>Отчеты
<input type="checkbox" name="chk6" value="checkbox"> </td>

И что делать дальше, я понятия не имею :(
Дальше нужно проверить, какие checkbox'ы отмечены, а какие нет, и в зависимости от этого по ссылке из "дерева" должна открываться страница только с выбранными типами работ. Как это сделать - я даже не представляю. Буду признателен, если тут вы сможете помочь.
302
22 ноября 2004 года
Sagittarius
648 / / 12.04.2003
Цитата:
Originally posted by AlexDJ
И что делать дальше, я понятия не имею :(
Дальше нужно проверить, какие checkbox'ы отмечены, а какие нет, и в зависимости от этого по ссылке из "дерева" должна открываться страница только с выбранными типами работ. Как это сделать - я даже не представляю. Буду признателен, если тут вы сможете помочь.


А в чем проблема? В составлении запроса или проверке состояний чекбоксов?

8.3K
22 ноября 2004 года
AlexDJ
8 / / 16.11.2004
Цитата:
Originally posted by Sagittarius

А в чем проблема? В составлении запроса или проверке состояний чекбоксов?



И в том и другом! :(

302
23 ноября 2004 года
Sagittarius
648 / / 12.04.2003
Цитата:
Originally posted by AlexDJ
И в том и другом! :(


По вопросу проверки состояния чекбоксов обратись в соответствующий форму (HTML).
Ответь на такой вопрос. MySQL поддерживает команду SQL Exec? Т.е. можно выполнить такой запрос?

 
Код:
exec('select * from Table1')
8.3K
23 ноября 2004 года
AlexDJ
8 / / 16.11.2004
Цитата:
Originally posted by Sagittarius

По вопросу проверки состояния чекбоксов обратись в соответствующий форму (HTML).
Ответь на такой вопрос. MySQL поддерживает команду SQL Exec? Т.е. можно выполнить такой запрос?
 
Код:
exec('select * from Table1')


Про exec не знаю, но select выполнить точно можно :)

Я тут кое-что доделал Добавил в страницу вывода рефератов код

 
Код:
<?php
    $tid = $_GET['tid'];
?>

у меня теперь работают ссылки вида /?mode=cat&id=48&tid=3, где tid= - это и есть тот самый тип рефератов.
Выглядит код сейчас так:
Код:
<td class="style13">Все работы
<input type="checkbox" name="tid" value="10" checked>          </td>
        <td class="style13">Курсовые
<input type="checkbox" name="tid" value="1">          </td>
        <td class="style13">Рефераты
<input type="checkbox" name="tid" value="2">          </td>
        <td class="style13">Контрольные
<input type="checkbox" name="tid" value="3">          </td>
        <td class="style13">Дипломы
<input type="checkbox" name="tid" value="4">          </td>
        <td class="style13">Доклады
<input type="checkbox" name="tid" value="5">          </td>
        <td class="style13">Отчеты
<input type="checkbox" name="tid" value="6">          </td>

Обращаю внимание, что формы нету, ни POST ни GET нигде не фигурирует.
А мне надо, чтобы при нажатии на ссылку открывалась страничка с выбранными типами работ :(

Сюда же выложу код вывода страницы с рефереатами (items.php)
Код:
<link rel="stylesheet" href="./Style.css" type="text/css">
    <?php
    $tid = $_GET['tid'];
?>
          <?php
         
            // поставим сразу, чтобы потом мозги не парить
            if ($scat == "") {
                $scat = "-1";
            }
           
           

            // выборка сортировки
            if ($_GET['search'] == 6) {
                $ob = "id";
            } elseif ($_GET['search'] == 1) {
                $ob = "title";
            } elseif ($_GET['search'] == 2) {
                $ob = "descr";
            } elseif ($_GET['search'] == 3) {
                $ob = "type_id";
            } elseif ($_GET['search'] == 4) {
                $ob = "date";
            } elseif ($_GET['search'] == 5) {
                $ob = "pages";
            } else {
                $ob = "title";
            }
           
           
            // и попробуем высунуть список рефератов у которых есть категория и подкатегория
            $query = "SELECT * FROM refs WHERE cat_id='".$_GET['id']."' AND scat_id='".$scat."' AND type_id='".$tid."' ORDER BY ".$ob.";";
            $rez = sql_query($query);
           
            if (mysql_num_rows($rez) != 0) {
         
          ?>
          <?php

    if (!isset($cfg['Bgcolor1'])) {
    if (isset($cfgBgcolor1)) {
        $cfg['Bgcolor1'] = $cfgBgcolor1;
        unset($cfgBgcolor1);
    } else {
        $cfg['Bgcolor1'] = '#FFFFFF';
    }
}

if (!isset($cfg['Bgcolor2'])) {
    if (isset($cfgBgcolor2)) {
        $cfg['Bgcolor2'] = $cfgBgcolor2;
        unset($cfgBgcolor2);
    } else {
        $cfg['Bgcolor2'] = '#F5F5F5';
    }
}
?>
          <table width="100%"  border="0" cellspacing="2" cellpadding="0">
            <tr>
              <td colspan="8"></td>
            </tr>
            <tr valign="middle" bgcolor="#E9E9E9" class="style12">
              <td width="5%" align="center" bgcolor="#E9E9E9">[url="<?php echo $PHP_SELF;?>?mode=<?php echo $_GET['mode']; ?>&id=<?php echo $_GET['id']; ?>&sid=<?php echo $scat; ?>&search=6"]ID[/url]</td>
              <td width="40%" align="left" bgcolor="#E9E9E9">[url="<?php echo $PHP_SELF;?>?mode=<?php echo $_GET['mode']; ?>&id=<?php echo $_GET['id']; ?>&sid=<?php echo $scat; ?>&search=1"]Работа[/url]</td>
              <td width="15%" align="left">[url="<?php echo $PHP_SELF;?>?mode=<?php echo $_GET['mode']; ?>&id=<?php echo $_GET['id']; ?>&sid=<?php echo $scat; ?>&search=2"]Предмет[/url]</td>
              <td width="15%" align="center" bgcolor="#E9E9E9">[url="<?php echo $PHP_SELF;?>?mode=<?php echo $_GET['mode']; ?>&id=<?php echo $_GET['id']; ?>&sid=<?php echo $scat; ?>&search=3"]Тип[/url]</td>
              <td width="8%" align="center" bgcolor="#E9E9E9">[url="<?php echo $PHP_SELF;?>?mode=<?php echo $_GET['mode']; ?>&id=<?php echo $_GET['id']; ?>&sid=<?php echo $scat; ?>&search=7"]Страниц[/url]</td>
              <td width="9%" align="center" bgcolor="#E9E9E9">[url="<?php echo $PHP_SELF;?>?mode=<?php echo $_GET['mode']; ?>&id=<?php echo $_GET['id']; ?>&sid=<?php echo $scat; ?>&search=4"]Дата[/url]</td>
            </tr>
            <tr>
              <td colspan="7"></td>
            </tr>
                <?php
                $i         = 0;
                while (list ($id, $cat_id, $scat_id, $title, $type_id, $type, $descr, $date, $pages) = mysql_fetch_array($rez)) {
                $i++;
                $bgcolor          = ($i % 2) ? $cfg['Bgcolor1'] : $cfg['Bgcolor2'];    
                ?>             
            <tr valign="middle" class="style11">
              <td width="5%" align="center" bgcolor="<?php echo $bgcolor; ?>"><?php echo $id; ?></td>
              <td width="40%" align="left" bgcolor="<?php echo $bgcolor; ?>"><?php echo $title; ?></td>
              <td width="15%" align="left" bgcolor="<?php echo $bgcolor; ?>"><?php echo $descr; ?></td>
              <td align="center" bgcolor="<?php echo $bgcolor; ?>"><div align="center"><?php $rt = mysql_fetch_row(sql_query("SELECT name FROM types WHERE id='".$type_id."'")); if ($type_id == "-1") { echo $type;  } else { echo $rt[0]; } ?></div></td>
              <td width="8%" align="center" bgcolor="<?php echo $bgcolor; ?>"> <div align="center"><?php echo $pages; ?></div></td>
              <td width="10%" align="center" bgcolor="<?php echo $bgcolor; ?>"> <div align="center"><?php echo date("m.Y", $date); ?></div></td>
            </tr>
                            <?php
               
                }
               
                ?>
          </table>
          <?php
            }
          ?>


ЗЫ Сорри, за такой длинный вывод :(
8.3K
23 ноября 2004 года
AlexDJ
8 / / 16.11.2004
Особо хочу акценитровать внимание на том, что мне не нужна кнопка типо Submit'а.
Данные должны передаваться путем нажатия на ссылку в категориях.
13K
18 марта 2009 года
zxxc
18 / / 04.05.2006
Цитата: AlexDJ
Особо хочу акценитровать внимание на том, что мне не нужна кнопка типо Submit'а.
Данные должны передаваться путем нажатия на ссылку в категориях.



Вотки JavaScript функцию, которая будет срабатывать по клику на checkbox'e отправлять запрос на сервер для получения новой странички.
По хорошему тебе нужно было бы отриосвать твое дерево у клиента другим JavaСкриптом, тогда бы проще было бы обновлять на лету это дерево без перезагрузки всей страницы
А если такое не надо, или дерево у тебя даже не свертывается по плюсикам, то функция OnClick, которая перезагрузит всю страницу с другими параметрами у GET

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог