Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выборка подкатегорий

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Как составить запрос?
Rus
Отправлено: 10 Февраля, 2010 - 15:01:16
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Добрый день!
Не могу понять логику запроса на выборку подкатегорий определенной категории.
Есть одна таблица pages, в ней поля:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. id     parent_id     title            title2         full_text
  3. 1      0                Один          odin          Один
  4. 2      1                Один два    odin_dva   Один два
  5. 3      0                Два             dva           Два
  6. 4      3                Два два      dva_dva    Два два
  7.  

Меню формирую таким образом:
PHP:
скопировать код в буфер обмена
  1.  
  2. <ul>
  3. <?PHP
  4. $result = mysql_query ("SELECT * FROM pages WHERE root_cat = 0");
  5. $test = mysql_fetch_array($result);
  6. do
  7. {
  8. echo "<li><a href=\"http://".$_SERVER['HTTP_HOST']."/".str2url($test['title'])."/\">".$test['title']."</a></li>";
  9. }
  10. while ($test = mysql_fetch_array($result));
  11. ?>
  12. </ul>
  13.  

Ссылка обрабатывается в .htaccess так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. RewriteRule ^([A-Za-z_0-9]+)/?$ index.html?title=$1
  3.  

Контент выводится так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $id = mysql_real_escape_string($_GET['title']);
  4. if (isset($id))
  5. {
  6. $result2 = mysql_query("SELECT * FROM pages WHERE title2='$id'");
  7. $test2 = mysql_fetch_assoc($result2);
  8. if ($test2['title2'])
  9. {
  10. echo '<table class="tableborder">
  11.  <tr>
  12.    <td class="td_title"><h1>'.$test2['title'].'</h1></td>
  13.  </tr>
  14.  <tr>
  15.    <td class="td_fulltext">'.$test2['full_text'].'</td>
  16.  </tr>
  17. </table>';
  18. }
  19. else
  20. {
  21. echo '<h1>Такой страницы не существует!</h1>';
  22. }
  23. }
  24. ?>
  25.  

Все выводит нормально, но выводит при переходе по ссылки на родителя - категорию только родительские категории, а подкатегории не выводит. Огорчение
Подскажите пожалуйста как при таком раскладе сделать вывод с подкатегориями?
 
 Top
A.N.R.I
Отправлено: 10 Февраля, 2010 - 15:21:37
Post Id



Гость


Покинул форум
Сообщений всего: 122
Дата рег-ции: Март 2009  
Откуда: Вінницька обл.


Помог: 0 раз(а)




$result = mysql_query ("SELECT * FROM pages WHERE root_cat = 0");
$test = mysql_fetch_array($result);

А где поле root_cat. Оно существует, да?


-----
 
 Top
Rus
Отправлено: 10 Февраля, 2010 - 15:25:46
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




A.N.R.I пишет:
$result = mysql_query ("SELECT * FROM pages WHERE root_cat = 0");
$test = mysql_fetch_array($result);

А где поле root_cat. Оно существует, да?

Конечно существует, просто я его не правильно обозвал, оно должно называться parent_id по логике, не суть, потом переименую. Мне главное что б работало, а пока имеем то что имеем - не выводит контент подкатегорий, а выводит только контент категорий.
(Добавление)
Не хотелось бы заниматься мультипостингом, ребят, вы скажите, может не в тот раздел запостил? Может в php надо было? Направьте хотя бы в русло правильное так сказать, а то уже чайник кипит.
З.Ы. это не для коммерции (если кому принципиально знать), пишу для себя.
 
 Top
Viper
Отправлено: 11 Февраля, 2010 - 07:49:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




немного туманная структура БД. откуда у вас берутся подкатегории и что вы ими считаете?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Rus
Отправлено: 11 Февраля, 2010 - 08:55:49
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Viper пишет:
немного туманная структура БД. откуда у вас берутся подкатегории и что вы ими считаете?

Тогда скажите, какая не туманная структура на ваш взгляд?
Задумка такова (это по поводу подкатегорий):
Использовать только один файл обработчик для вывода как меню (верхней навигации), так и контента, который относится к этой навигации, но так как вид страницы будет блоговым, обязательно должна быть постраничная навигация и конечно же возможность добавлять подразделы (статьи) к основным разделам.

Меню (просто пример):

PHP JS CSS HTML

При переходе по любой из этих ссылок, выводится страничка, на которой будет выводиться блоками краткое описание статьи по несколько штук на страницу, а далее идет пагинация, при клике по заголовку любого из блоков статьи будет открываться страница с полным описанием.
Вроде все постарался понятно объяснить...
(Добавление)
Один - это главный раздел (верхнее меню).
Один два - это его подраздел.
Два - это главный раздел (верхнее меню).
Два два - это его подраздел.
На данный момент выводит контент только:
Один - заголовок
Один - контент
Два - заголовок
Два - контент.
 
 Top
Champion Супермодератор
Отправлено: 11 Февраля, 2010 - 09:02:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




paerent_id = 0 у самых верхних категорий как раз. Просто номер нужной категории укажи и увидишь все ее подкатегории. Но без их дочерних. Чтоб всё дерево получить надо по-другому. Если это и надо, объясню как.
 
 Top
Rus
Отправлено: 11 Февраля, 2010 - 10:41:30
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Champion пишет:
paerent_id = 0 у самых верхних категорий как раз. Просто номер нужной категории укажи и увидишь все ее подкатегории. Но без их дочерних. Чтоб всё дерево получить надо по-другому. Если это и надо, объясню как.

Думаю что вложеность будет только двухуровневая не более...
Можно поподробнее, как вывести контент при вот таком раскладе:
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT * FROM pages WHERE title2='$id'
  3.  

И вот таком:

Только при этих условиях выводит хоть какой-то контент. Огорчение
Как по-другому сделать - не знаю.
 
 Top
Champion Супермодератор
Отправлено: 11 Февраля, 2010 - 14:05:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




ну ты селект выполни, посмотри, что выбралось и реши, что тебе оттуда надо. А как выводить все подуровни и на форуме обсуждалось, и в инете есть. Поищи, это писать долго, и куча вопросов еще возникнет, на которые уже отвечали.
Вот нашел, тут должно быть хорошо написано
http://www[dot]opennet[dot]ru/docs/RUS/hierarchy_sql/
 
 Top
Rus
Отправлено: 11 Февраля, 2010 - 16:30:36
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Champion пишет:
ну ты селект выполни, посмотри, что выбралось и реши, что тебе оттуда надо. А как выводить все подуровни и на форуме обсуждалось, и в инете есть. Поищи, это писать долго, и куча вопросов еще возникнет, на которые уже отвечали.
Вот нашел, тут должно быть хорошо написано
http://www.opennet.ru/docs/RUS/hierarchy_sql/

Спасибо за ссылку, но как узнать значение текущего id родителя когда я нахожусь на заданной странице?
 
 Top
Rus
Отправлено: 15 Февраля, 2010 - 08:48:38
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Извините что поднимаю вновь этот вопрос, но проблема так и не решена.
Уважаемый Champion ткните пожалуйста носом где обсуждалась подобная тема?
(Добавление)
Дело в том, что если сделать запись вида:
Цитата:

SELECT "ID" FROM CATALOG WHERE "PARENT_ID" = <значение id родителя>

То выведет только подкатегории, а родителя не выведет.
Вот как узнать текущее значение родителя?
 
 Top
Champion Супермодератор
Отправлено: 15 Февраля, 2010 - 09:11:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




добавть условие OR id = <значение id родителя>
Тему сейчас поищу. Там так разжевали, что мало не покажется
(Добавление)
Последняя тема в самых обсуждаемых уж очень похожа на твою, правда? Категории и подкатегории (54)
 
 Top
Rus
Отправлено: 15 Февраля, 2010 - 11:55:04
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Champion пишет:
добавть условие OR id = <значение id родителя>
Тему сейчас поищу. Там так разжевали, что мало не покажется
(Добавление)
Последняя тема в самых обсуждаемых уж очень похожа на твою, правда? Категории и подкатегории (54)

Да, тема очень похожа, но с массивами не догоняю...
Пробовал немного переделать вот так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $q = mysql_query("SELECT * FROM pages WHERE title2='$id' ORDER BY 'parent_id' DESC");
  3. while ($row = mysql_fetch_row($q)) {
  4. $categs = array($row[2]);
  5. }
  6. foreach ($categs as $key => $value) {
  7. echo "<p>$value</p> ";
  8. }
  9.  

Но:
1) Из-за $row[2] - выводит только тайтл.
2) Выводит только родителя.
А как вывести все поля (ну естессно кроме id и т.п...) родителя (если есть таковые) и поля дочерних категорий?
 
 Top
Champion Супермодератор
Отправлено: 15 Февраля, 2010 - 12:17:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Rus пишет:
title2='$id
это что означает?
Там в той теме был код, который таблицу превращает в массив с подмассивами
 
 Top
Rus
Отправлено: 15 Февраля, 2010 - 14:36:08
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Champion пишет:
Rus пишет:
title2='$id
это что означает?
Там в той теме был код, который таблицу превращает в массив с подмассивами

1) Это как раз и есть в определенной мере фишка, а в другой мере затык, который не знаю как обойти.
а) Изначально из файла htaccess идет переменная $title (она же стоит и в ссылке меню), то есть htaccess обрабатывает ссылку в меню.
б) В бд заносятся два поля: title и title2.
title - заносится как есть, а title2 - заносится латиницей.
в) Задумка была сравнивать эти два поля и вытаскивать оригинальный контент по клику по ссылке в меню, но задумка не совсем сработала и по сему сделал так:
$id = mysql_real_escape_string($_GET['title']);
Ну а это поле:
WHERE title2='$id'
По нему как раз и выводится оригинальный контент для определенной категории.
(Добавление)
2) Да, все верно, он вернул массив с подмассивами, но как вытащить нужный?
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. array(3) { [0]=>  array(2) { [0]=>  array(2) { [0]=>  string(1) "1" [1]=>  string(4) "Один" } [1]=>  array(2) { [0]=>  string(1) "3" [1]=>  string(3) "Два" } } [1]=>  array(1) { [0]=>  array(2) { [0]=>  string(1) "2" [1]=>  string(8) "Один два" } } [3]=>  array(1) { [0]=>  array(2) { [0]=>  string(1) "4" [1]=>  string(7) "Два два" } } }
  3.  

Тут получается так, что выводится все что есть в бд, а нужно что бы выводилось только то, что относится к конкретной категории, в которую перешли по ссылке.
Если сделать так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $q = mysql_query("SELECT * FROM pages WHERE title2='$id'");
  3. while ($row = mysql_fetch_row($q)) { // в row будет id, parent_id, caption
  4. $categs[ $row[1] ][] = array($row[0], $row[2]);
  5. }
  6. var_dump($categs);
  7.  

То выведет это:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. array(1) { [0]=>  array(1) { [0]=>  array(2) { [0]=>  string(1) "1" [1]=>  string(4) "Один" } } }
  3.  

Только раздел получается, а подраздела нет.
С массивами (тем более такими сложными) всегда были проблемы. Огорчение
(Добавление)
З.Ы. что бы была более понятна задумка, для чего весь этот геморой, я хочу избавиться в урле от цифер в конце урла, то есть, с использованием id и htaccess, получиться адрес такого вида: http://mysite[dot]ru/rubrika/1 - вот так у меня все без проблем получается, а хотелось бы без единички: http://mysite.ru/rubrika/.
При всем при этом, заметьте, контент без id показывает динамический урл и такой же контент и айдишник не фигурирует в урле (хотя при входе в подкатегорию он уже будет, но это совсем другая история).

(Отредактировано автором: 15 Февраля, 2010 - 15:11:16)

 
 Top
Rus
Отправлено: 17 Февраля, 2010 - 14:23:10
Post Id


Новичок


Покинул форум
Сообщений всего: 9
Дата рег-ции: Февр. 2010  


Помог: 0 раз(а)




Снова я со своими вопросами.
Перелопатил тырнет, маны, почитал немного, переделал код, но все-равно выводит только категории, а подкатегории не хочет:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $id = mysql_real_escape_string($_GET['title']);
  4. if (isset($id))
  5. {
  6. function getTree($data, $parent)
  7. {
  8.         $out=array();
  9.         if (!isset($data[$parent]))
  10.         return $out;
  11.         foreach ($data[$parent] as $row)
  12.         {
  13.         $chidls=getTree($data, $row['id']);
  14.         if ($chidls)
  15.         $row['childs']=$chidls;
  16.         $out[]=$row;
  17.         }
  18.         return $out;
  19. }
  20. $res = mysql_query("SELECT * FROM pages WHERE title2='$id'");
  21. $data = array();
  22. while($row = mysql_fetch_assoc($res))
  23. $data[$row['parent_id']][] = $row;
  24. $data = getTree($data, 0);
  25. echo '<table class="tableborder">';
  26.     foreach ($data as $k1=>$v1)
  27.     {
  28.     echo '<tr><td>'.$v1['title'].'</td></tr>';
  29.         echo '<tr><td>'.$v1['full_text'].'</td></tr>';
  30.     if (isset($v1['childs']))
  31.        
  32.     foreach ($v1['childs'] as $k2=>$v2)
  33.     echo '<tr><td>'.$v2['title'].'</td></tr>';
  34.         echo '<tr><td>'.$v2['full_text'].'</td></tr>';
  35.     }
  36.     echo '</table>';
  37. }
  38. ?>
  39.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB