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
Форумы портала PHP.SU :: Версия для печати :: выбор раздела вместе со всеми подразделами
Форумы портала PHP.SU » PHP » Программирование на PHP » выбор раздела вместе со всеми подразделами

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

1. leshiy_SV - 19 Мая, 2010 - 12:30:01 - перейти к сообщению
Задача такая. выбрать из базы раздел и все его подразделы включая и их под подразделы тоже. Структура базы такая id | name | sid
делаю так:
PHP:
скопировать код в буфер обмена
  1. $sql_res = array(); // массив который содержит id каталогов
  2. function Scan_SQL($sql){
  3.         global $sql_res;
  4.         $sql_r = false;
  5.         $ok = false;
  6.         foreach($sql as $s)
  7.         {
  8.                 $query = "SELECT id FROM  `categories` WHERE `sid` = ".$s." ";
  9.                 $result_sql = mysql_query($query);
  10.                 WHILE($result = mysql_fetch_array($result_sql,MYSQL_ASSOC))
  11.                 {
  12.                         $sql_r[] .= $result['id'];
  13.                         $sql_res[] .= $result['id'];
  14.                         $ok = true;
  15.                         echo $result['id']." _нашлось<br>";
  16.                 }
  17.         }
  18.         IF($sql_r !== false) Scan_SQL($sql_r);
  19.         return $sql_res;
  20. }
  21. $id[]=1;
  22. $arr = Scan_SQL($id);
  23. print_r($arr);
  24.  

вроде код работает, но мне кажется, что что-то все равно не то.
Как на счет правильности кода? или может есть другой вариант по проще
2. Djin_dj - 19 Мая, 2010 - 13:11:04 - перейти к сообщению
Походу не все так просто, у тебя древовидная структура разделов!? Тогда тебе надо гуглить деревья в SQL там много инфы.

Понимаешь чтобы найти корень нет вопросов он тебе отобразит все разделы с заданным сидом, а вот если тебе нужно выбрать все подразделы из конкретного сида как ты построишь запрос!?

Раньше я делал Таблицу линковочную где указывал ид родителя, потом почитав стал делать с левелом этого подраздела то есть если есть раздел 1_1 и его левел 1 а парент 1, то он понимал и возвращал мне все подразделы раздела 1_1.

Короче ищи, готового решения и стандартного тут не может быть, смотря для чего использовать и количество вложений
3. leshiy_SV - 19 Мая, 2010 - 13:22:27 - перейти к сообщению
Djin_dj что то не очень понял ход твоих мыслей. мне нужно просто чтобы задаешь id раздела, ищешь все подразделы, у которых sid = id, заносишь их в массив $sql_r и потом проверяешь уже найденные id из массива $sql_r в разделах поля sid путем повторного вызова функции и т.д.
4. Djin_dj - 19 Мая, 2010 - 14:39:15 - перейти к сообщению
leshiy_SV пишет:
у которых sid = id

а если надо отобразить новости или товары не только раздела 1 но и его подразделов?

Ты делаешь запрос SELECT * FROM Razdel WHERE Razdel_ID=1

он тебе отобразит все новости или товары только раздела 1 но никак не Подраздела 2 у которого Razdel_ID=2 и Razdel_Sid=1
Теперь понятно!?
5. leshiy_SV - 19 Мая, 2010 - 15:03:17 - перейти к сообщению
мне содержание (т.е новости или товары), которые входят в этот раздел или подраздел не нужны. нужны только id разделов, которые являются включением определенного раздела
пример вида id раздел sid
CODE (htmlphp):
скопировать код в буфер обмена
  1. 1 раздел 0
  2. -2 подраздел 1
  3. --5 подраздел 2
  4. ---8 подраздел 5
  5. -3 подраздел 1
  6. --6 подраздел 3
  7. 7 раздел 0

так вот указываешь например id 1 и выбираются все включенные подразделы в раздел 1, а это 2, 3, 5, 6, 8
6. Djin_dj - 19 Мая, 2010 - 15:06:30 - перейти к сообщению
leshiy_SV пишет:
мне содержание (т.е новости или товары), которые входят в этот раздел или подраздел не нужны. нужны только id разделов, которые являются включением определенного раздела
пример вида id раздел sid
CODE (htmlphp):
скопировать код в буфер обмена
  1. 1 раздел 0
  2. -2 подраздел 1
  3. --5 подраздел 2
  4. ---8 подраздел 5
  5. -3 подраздел 1
  6. --6 подраздел 3
  7. 7 раздел 0

так вот указываешь например id 1 и выбираются все включенные подразделы в раздел 1, а это 2, 3, 5, 6, 8

У тебя указанный запрос по sid=1 выдаст только раздел 2 и 3 и все
7. leshiy_SV - 19 Мая, 2010 - 15:09:29 - перейти к сообщению
leshiy_SV пишет:
IF($sql_r !== false) Scan_SQL($sql_r);

рекурсия, функция вызывается повторно и проверяет уже найденные id на наличие в них подразделов и так далее пока больше подразделов не останется.
функция рабочая (проверял несколько раз). просто хотелось чтобы профи своим взглядом проверили правильность действий
8. JustUserR - 19 Мая, 2010 - 15:36:14 - перейти к сообщению
leshiy_SV пишет:
Рекурсия, функция вызывается повторно и проверяет уже найденные id на наличие в них подразделов и так далее пока больше подразделов не останеться
Если вам необходимо вывести разделы и подразделы всех уровней то можете поступить следующми образом - выбрать все разделы из БД и сохранять их в дерево которое по сути является многомерных хеш-массивом следующим образом - ключом в хеш-массиве будет являться имя раздела в значение ссылка на его подраздел и соответственно null будет термиринующим значением
9. leshiy_SV - 19 Мая, 2010 - 15:47:01 - перейти к сообщению
JustUserR спасибо за подсказку.
JustUserR пишет:
сохранять их в дерево которое по сути является многомерных хеш-массивом следующим образом - ключом в хеш-массиве будет являться имя раздела в значение ссылка на его подраздел и соответственно null будет термиринующим значением

можно небольшой примерчик
сделал вот так
PHP:
скопировать код в буфер обмена
  1. $qq = array();
  2.                 $query = "SELECT id, cid FROM `categories`";
  3.                 $result_sql = mysql_query($query);
  4.                 WHILE($result = mysql_fetch_array($result_sql,MYSQL_ASSOC))
  5.                 {
  6.                         $qq[$result['id']] = $result['cid'];
  7.                 }
  8. print_r($qq);
10. JustUserR - 19 Мая, 2010 - 16:07:53 - перейти к сообщению
leshiy_SV пишет:
JustUserR спасибо за подсказку.
Можно небольшой примерчик Сделал вот так
Пожалуйста! В принципе похожий пример с построением дерева разделов уже рассматривался и я предлагал готовое решение - здесь http://forum.php.su/topic.php?fo...65891#1271165891 приведена функция которая из массива элементов и индексов их родительских элементов формирует дерево - вам нужно лишь при проходе по mysql_fetch_row скопировать элементы в массив по образцу и передать его на обработку

 

Powered by ExBB FM 1.0 RC1