ГОЛЯМ Проблем: Дървовидна структура на под-категории

Извинявай, не съм разбрал правилно структурата на Датабазата!

Ето и решение на проблема:

Код:
<?php

mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("selo") or die(mysql_error());
mysql_query('SET NAMES cp1251');
mysql_query('SET CHARACTER SET cp1251_general_ci');

$sql = mysql_query("SELECT * FROM `kategorii` WHERE `sub` = '0' ORDER BY `id` ASC ");
while ($assoc = mysql_fetch_array($sql, MYSQL_ASSOC)) {
    $subID = $assoc['id'];
    echo "Kategoriqta e: ".$assoc['ime']."<br />";

    $sql = mysql_query("SELECT `sub` FROM `kategorii` WHERE `subbr` = '$subID' AND `sub` > '0'");
    $subs = mysql_num_rows($sql);

        $g = "sub-";
            $sql = mysql_query("SELECT * FROM `kategorii` WHERE `subbr` = '$subID' AND `sub` = '1'");
            while ($assoc = mysql_fetch_array($sql, MYSQL_ASSOC)) {
                echo $g."kategoriqta e: ".$assoc['ime']."<br />";
                $subID2 = $assoc['id'];
                    $sql2 = mysql_query("SELECT * FROM `kategorii` WHERE `subbr` = '$subID2' AND `sub` = '2'");
                        while ($assoc2 = mysql_fetch_array($sql2, MYSQL_ASSOC)) {
                            echo $g."sub-kategoriqta e: ".$assoc2['ime']."<br />";
                        }
                echo "<hr />";
            }
}
?>

Този код при твоята структура ще работи. Ако искаш да се повтаря докато има sub-sub-sub, то тогава преброй колко са тези subs на "дървото" и с 1 for ( $i = 1; $i <= $subs; $i++ ) {
повтори циклите, като при всеки следващ път $subID се заменя с ID-то на предишния sub ( категория ), и $i е subbr-то в таблицата!
}

Как да направиш $subID се заменя с ID-то на предишния sub, ми запазвай всеки 1 ID на SUB в 1 променлива ($predi6niqSub) и в края на врътването сложи $subID = $predi6niqSub

Би трябвало да се справиш!

П.П => Пример за взимане на предишна стойност имаш и в предния скрипт, там $g биваше взимана предишната стойност ( sub-, sub-sbu-, sub-sub-sbu ) и се повтаряше.
 
g9m29 каза:
Извинявай, не съм разбрал правилно структурата на Датабазата!

Ето и решение на проблема:

Код:
<?php

mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("selo") or die(mysql_error());
mysql_query('SET NAMES cp1251');
mysql_query('SET CHARACTER SET cp1251_general_ci');

$sql = mysql_query("SELECT * FROM `kategorii` WHERE `sub` = '0' ORDER BY `id` ASC ");
while ($assoc = mysql_fetch_array($sql, MYSQL_ASSOC)) {
    $subID = $assoc['id'];
    echo "Kategoriqta e: ".$assoc['ime']."<br />";

    $sql = mysql_query("SELECT `sub` FROM `kategorii` WHERE `subbr` = '$subID' AND `sub` > '0'");
    $subs = mysql_num_rows($sql);

        $g = "sub-";
            $sql = mysql_query("SELECT * FROM `kategorii` WHERE `subbr` = '$subID' AND `sub` = '1'");
            while ($assoc = mysql_fetch_array($sql, MYSQL_ASSOC)) {
                echo $g."kategoriqta e: ".$assoc['ime']."<br />";
                $subID2 = $assoc['id'];
                    $sql2 = mysql_query("SELECT * FROM `kategorii` WHERE `subbr` = '$subID2' AND `sub` = '2'");
                        while ($assoc2 = mysql_fetch_array($sql2, MYSQL_ASSOC)) {
                            echo $g."sub-kategoriqta e: ".$assoc2['ime']."<br />";
                        }
                echo "<hr />";
            }
}
?>

Този код при твоята структура ще работи. Ако искаш да се повтаря докато има sub-sub-sub, то тогава преброй колко са тези subs на "дървото" и с 1 for ( $i = 1; $i <= $subs; $i++ ) {
повтори циклите, като при всеки следващ път $subID се заменя с ID-то на предишния sub ( категория ), и $i е subbr-то в таблицата!
}

Как да направиш $subID се заменя с ID-то на предишния sub, ми запазвай всеки 1 ID на SUB в 1 променлива ($predi6niqSub) и в края на врътването сложи $subID = $predi6niqSub

Би трябвало да се справиш!

П.П => Пример за взимане на предишна стойност имаш и в предния скрипт, там $g биваше взимана предишната стойност ( sub-, sub-sbu-, sub-sub-sbu ) и се повтаряше.

Добре де, това ми е ясно, че може да стане така... Проблема ми идва, когато започна да пиша именно тези удебелените предложения. Защото каквото и да правя, все ми изкарва подкатегории максимум до второ ниво, а останалите ми ги показва отдолу - абе обърквация голяма :idea:

Можеш ли да ми дадеш код, което да прави това, което си описал горе? Защото аз колкото и да се пробвам, все ми го дава разбъркано???

ЕДИТ: Забравих да спомена нещо важно - кода да ги изкарва в селект... Защото в <li> и <ul> успях да го направя, но в <select> и <option> ми ги дава разбъркано :shock:
 
Прати да видя как си ги направил в <ul> <li>, ако мога да го преработя, да не се бъхтя да пиша код-а.
 
Съжалявам, изгубил съм го из всички файлове :@ Съжалявам много! Лошото е, че не си спомням и как го бях направил... мисля, че беше като теб горе... :shock:
 
Никой ли не може да се справи с проблема? :shock:
 
function cat($parent = 0, $level = 0) {
$query = mysql_query("тук викаш всички категории които имат родител $parent") or die(mysql_error());
while ($row = mysql_fetch_object($query)) {
for ($i = 0;$i < $level; $i++) {echo "-";}
echo $row->name . "<br />";
cat($row->id, $level + 1);
}
}

Нарича се рекурсия.
викаш само така
cat();
и то ще ти изкара всички категории с всички техни под категории и под под категории и т.н...
 
Код:
function cat($parent = 0, $level = 0) {
$query = mysql_query("SELECT *
FROM `kategorii`
WHERE `subbr` =".$parent."
ORDER BY `red` ASC ") or die(mysql_error());
while ($row = mysql_fetch_object($query)) {
for ($i = 0;$i < $level; $i++) {echo "-";}
echo $row>name . "<br />";
cat($row->id, $level + 1);
}
}

$query = mysql_query("SELECT *
FROM `kategorii`
WHERE `subbr` =".$parent."
ORDER BY `red` ASC ") or die(mysql_error());

Това ми е заявката... subbr се записва на самия ред ИД-то на parent-a.

Код:
echo $row>name . "<br />";

$row>name - това не го разбрах... Би ли пояснил? Полето ми се казва ime, а като го направя:

Код:
echo $row>ime . "<br />";

и нищо не става...

Все пак като го оставя name ми изкарва:

Код:
1-1--1--1--1--1-1-1-1-1-1-11111-1-1-1-1-111

EDIT: С мааалко пипане от моя страна стана.... не знам какво трябва да те черпя, ама една точица смешна ми се струва наистина НИЩОЖНО в сравнение с това, което ми предостави - спокойсвие в живота ми :?:

+11111111111111111111111111111111 :?:

И мерси много!!!!!! :P
 
Здравейте!

А как би станало ако резултатите от рекурсивната функция , не искаме да ги извеждаме директно от функцията с echo , а да ги подредим в масив. Като масива трябава да спазва същата йерархична структура?

Примерно трбява да стане:

Array 0
...Array 1
...Array 1.1
......Array 1.1.1
......Array 1.1.2
......Array 1.1.3
...Array 1.2
......Array 1.2.1
.........Array 1.2.1.1
...Array 2
и тн ...


Като условието и тук е , че може да имаме n брой нива в йерархията.
 

Back
Горе