Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Nieskończona liczba podgrup w grupach
treewood
post
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


Jestem w trakcie robienia skryptu i zagięło mnie w pewnym momencie ... albo zaćmiło [;

Wiecie może jak rozplanować bazę danych z minimalną liczbą pól by móc zrobić potem do tego skrypt który wyświetlał by dane?

wg mnie baza wyglądać powinna tak:
id, nazwa czegoś, opis czegoś, przynależność do grupy ID (jeśli jest grupą to wartość 0), nr zagłębienia czyli np. dla podkategorii 2 zagłębienie równe 2

obrazowo:
1,warzywa,spis warzyw,0 (bo jest grupą),1
2,ogórki,tu znajdziesz nasze ogórki,1 (pod grupa grupy warzywa o id 1),2 (zagłębienie 2)
3,kiszone,ogórki kiszone,2 (po przynależy do podgrupy o id 2),3
4,owoce,spis owoców,0 (bo jest grupą),1
5,kiszone z polski,ogórki kiszone z polski,3 (po przynależy do podpodgrupy 3),4

i w sumie dane powinny wyglądać tak

warzywa
-ogórki
--kiszone
---kiszone z polski
owoce

tyle, że problemem jest tutaj dla mnie brak limitu podgrup. oczywiście mógłbym zrobić coś z limitem podgrup ale pomyślałem by zrobić bardziej giętki skrypt

w końcu skrypt u mnie wygląda tak:

[php:1:b8a8a88b13]<?php
$zaglebienia = mysql_query("select zaglebienie from _grupy order by zaglebienie desc limit 1");
while ($row=mysql_fetch_array($zaglebienia)) { $zaglebienie = $row[zaglebienie]; }

$grupy = mysql_query("select * from _grupy where nalezy='0' order by nazwa");
while ($row=mysql_fetch_array($grupy)) {
$id_gr = $row[id];
echo "&<a href='' title='".$row[opis]."' class=grupa>".$row[nazwa]."</a><br>";

for ($lp=1;$lp<=$zaglebienie;$lp++)
{
$podgrupy = mysql_query("select * from _grupy where nalezy='$lp' and nalezy='$id_gr' order by nazwa");
while ($row=mysql_fetch_array($podgrupy)) {

echo "&- <a href='' title='".$row[opis]."'>".$row[nazwa]."</a><br>";

for ($lp=1;$lp<=$row[zaglebienie];$lp++)
{
$podgrupy_2 = mysql_query("select * from _grupy where nalezy='$lp' and nalezy='$id_gr' order by zaglebienie, nazwa");
while ($row=mysql_fetch_array($podgrupy_2)) {

}
}

}
}


}
?>[/php:1:b8a8a88b13]

wychodzi na to, że musiałbym robić ciągle pętle for ... macie jakieś inne pomysły?
może zamiast przynależności zapisanej w formie np. 1 to zapisywać
np. 1.2.4.5
z tych 4 liczb wtedy wynikałoby, że jest to 4 zagłębienie (zliczanie ilości kropek) a zarazem sprawdzanie kolejki spisu grup i podgrup.
np. że ogórek poslki kiszony należy wpierw do grupy warzywa potem podgrupy ogórki, potem ogórki kiszone a w końcu do ogórków polskich kiszonych...

proszę o pomoc ... wiem, że z tym zagmatwałem.
widziałem takie bajery na phpbb czy openbb ale kod jest tam tak napisany, że ciężko się rozeznać i wziąć wzór od nich ...
Go to the top of the page
+Quote Post
Cudi
post
Post #2


Administrator planeta/IRC


Grupa: Przyjaciele php.pl
Postów: 385
Pomógł: 0
Dołączył: 19.04.2003
Skąd: Zabrze

Ostrzeżenie: (0%)
-----


rekurencja -> wywołanie funkcji wewnątrz samej siebie ;]
Go to the top of the page
+Quote Post
treewood
post
Post #3





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


tzn ze mam to wywolac jakos tak:

[php:1:cb8cbec69a]<?php
function cos(){

for (...){
cos ();
}
}
?>[/php:1:cb8cbec69a]
Go to the top of the page
+Quote Post
scanner
post
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Tylko pamiętaj, zeby się nie zapętlić.
Go to the top of the page
+Quote Post
spenalzo
post
Post #5





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


:arrow: http://webcity.pl/porady.php/t/69
Go to the top of the page
+Quote Post
treewood
post
Post #6





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


w sumie myslalem by uzyc funkcji ... ale dzieki bardzo ... na pewno znajde wyjscie ... dziala juz w sumie ale nie najlepiej ...
Go to the top of the page
+Quote Post
DeyV
post
Post #7





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




trafiłeś na problem, na który w pewnym momęcie trafiają prawie wszyscy. I co ludzi, tyle pomysłow, jak go ominać. Jedną z lepszych metod tworzenia rzewa zapisanego w bazie zaprezenował dragossani na innym forum.
Jak uda ci sie przez to przebrnać - mozęsz osiągnac dokładnie to, o co ci chodzi.
:arrow: http://webdeveloper.pl/forum/read.php?f=3&...i=711&t=711&v=f
Go to the top of the page
+Quote Post
treewood
post
Post #8





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


deyv ... super pomysl ja zrobilem to inaczej
ze niby do bazy zapisuje cala sciezke np.
do powiedzmy
rzeczy
owoce > jablka > lobo
owoce > brzoskwinie
warzywa > pomidory

gdzie:

id | nazwa
--+------
1 | owoce
2 | jablka
3 | lobo
4 | warzywa
5 | brzoskwinie
6 | pomidory

wpisałem tak

id | nazwa | przynaleznosc
--+---------+-------------
1 | owoce | 0
2 | jablka | 1.2
3 | lobo | 1.2.3
4 | warzywa | 0
5 | brzoskwinie | 1.5
6 | pomidory | 4.6


niby to lepsze z jednej strony (oszczednosc danych i zliczanie po kropach glebokosc zagniezdzenia) ale to co napisal dragossani wyglada dosc ciekawie. teraz tylko bedzie problem to oprogramowac ... macie moze jakies pomysly
Go to the top of the page
+Quote Post
DeyV
post
Post #9





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




twoje rozwiazanie - choć wydawałoby się bardzo proste - nie jest praktyczne.
Wyobraź sobie np. że musisz usunąć jedna z podgrup. Lub przenieść kórąś z gałęzi. Straszna robota. (IMG:http://forum.php.pl/style_emoticons/default/aaevil.gif)

A zakodowanie tej struktury z przykładu - nie próbowałem , ale chyba nie powino być tak straszne. Klka zdań na temat jej zalet i wad pojawiło się również na forum php.pl - jądro -> bazodanowy system plików.
Go to the top of the page
+Quote Post
treewood
post
Post #10





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


no w sumie tak .. tyle, ze nie mam wiekszego pojecia jak pobierac dane z takich dwoch tabel ...
czy za pomoca jednego selecta i pobieraniu od razu w dwoch tabel czy w petli while zrobic druga petle while z zapytaniem do poprzedniej petli ...

moze znacie jakis skrypt, ktory by mnie naprowadzil na to gdyz duzo czasu moze mi zejsc na drazeniu tego ... a juz pare godzin stracilem [;
Go to the top of the page
+Quote Post
DeyV
post
Post #11





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




nie bardzo cie pokrzepię, ale zmontownie w pełni funkcjonalnej (a i to nie do końca) klasy do obsługi drzewka poświeciłem z 5 dni, jeśli nie więcej (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Choć nie uważam tego za czas zmarnowany.

Z drugiej strony - jeżeli problemem jest dla ciebi proste zapytanie oparte na np. join no to obawiam sie, że zadane może cie przerosnąć...

Jeśli jednak postanowisz to zorbić, zastanów się, dokladnie jakie dane bedą ci potrzebne.
Bo przecież oczywiste jest, ze raczej żadko potrzebne są wszystkie podkategorie, czyli całe drzewo.
A wyciagnięcie tylko jednej gałęzi, lub kategorii z jednego poziomu zagłębienia w bazie konstrukcji dragossaniego jest naprawdę łatwe.
Go to the top of the page
+Quote Post
treewood
post
Post #12





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


nie no raczej problemu z joinem nie mam ... tylko "głośno" myślę ... właśnie teraz przerabiam bazę a raczej dorabiam tabele w ktorej beda przynaleznosci ...

a co do pocieszenia ... dzięki [;
Go to the top of the page
+Quote Post
treewood
post
Post #13





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


No niby zrobiłem i wyświetla ale nie do końca dobrze

struktura bazy wygląda tak:
_grupy:
id | nazwa
----+------------
1 | warzywa
2 | owoce
3 | jablka
4 | lobo
5 | brzoskwinie

_podgrupy:
first_id | last_id | glebia
----------+-----------+-------
1 | 1 | 0
2 | 2 | 0
2 | 3 | 1
2 | 4 | 1
3 | 4 | 2
2 | 5 | 1

skrypt wyglada tak:
[php:1:7357c30aad]<?php
function grupy($id){
$grupy = mysql_query("select _podgrupy.first_id, _podgrupy.last_id,
_podgrupy.glebia, _grupy.nazwa, _grupy.opis, _grupy.id from _grupy, _podgrupy
where glebia >'0' and _podgrupy.last_id = _grupy.id and _podgrupy.first_id
= '$id' order by glebia desc");
while ($row=mysql_fetch_array($grupy)) {
$id = $row[id];
for ($l=0;$l<=$row[glebia];$l++) { $pokaz[$id] = "-".$pokaz[$id]; }
echo $pokaz[$id]."&<a href='' title='".$row[opis]."'>".$row
[nazwa]."</a><br>";
grupy($id);
}

}


$grupy = mysql_query("select _podgrupy.first_id, _grupy.nazwa, _grupy.opis,
_grupy.id from _grupy, _podgrupy where _podgrupy.glebia='0' and
_podgrupy.first_id = _grupy.id order by _grupy.nazwa");
while ($row=mysql_fetch_array($grupy)) {
echo "&<a href='' title='".$row[opis]."' class=grupa>".$row
[nazwa]."</a><br>";
grupy($row[id]);
}
?>[/php:1:7357c30aad]


i jest problem bo wyswietla na poczatku dobrze a potem na koniec wyswietla
wszystko jest niepotrzebne
Owoce
-- Jabłka
--- Lobo
-- Brzoskwinie
-- Lobo
Warzywa

Jak widać lobo powtarza się drugi raz i nie wiem jak tego gówna się pozbyc
Go to the top of the page
+Quote Post
kurtz
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 786
Pomógł: 0
Dołączył: 18.03.2002
Skąd: Wroclaw/Warszawa

Ostrzeżenie: (0%)
-----


Cytat
No niby zrobiłem i wyświetla ale nie do końca dobrze

ogolnie - mowisz o metodzie nr 5: http://www.depesz.pl/various-sqltrees.html

1) nie mow gowno na swoj blad
2) nie lepiej zamiast sie tak dziergac napisac jednego selcta z dodatkowym wskaznaiem refrencyjnym na tabelke ze struktura.. pisze sei 4 minuty i dziala.


pozdrawiam
Go to the top of the page
+Quote Post
treewood
post
Post #15





Grupa: Zarejestrowani
Postów: 215
Pomógł: 0
Dołączył: 18.01.2003

Ostrzeżenie: (0%)
-----


kurtz << jak mam rozumieć to wskazanie referencyjne?
jakby to miało wyglądać? mam wywołać dodatkowe zapytanie czy jak?

domyślam się, że chodzi o tą funkcję:

[php:1:d918aa09f5]<?php
function grupy($id){

$grupy = mysql_query("select _podgrupy.first_id, _podgrupy.last_id, _podgrupy.glebia, _grupy.nazwa, _grupy.opis, _grupy.id from _grupy, _podgrupy where glebia >'0' and _podgrupy.last_id = _grupy.id and _podgrupy.first_id = '$id' order by _podgrupy.glebia desc");
while ($row=mysql_fetch_array($grupy)) {
$last_id = $row[last_id];
$GLOBALS[$last_id] = $last_id;

$id = $row[id];
for ($l=0;$l<=$row[glebia];$l++) { $pokaz[$id] = "-".$pokaz[$id]; }

echo $pokaz[$id]."&<a href='' title='".$row[opis]."'>".$row[nazwa]."</a><br>";

grupy($id);
}
}
?>[/php:1:d918aa09f5]


myślałem, żeby to jakoś do globalnych zmiennych przekazać, albo do pliku zapisywać albo tablice wczesniej zrobic

wystarczy przeciez by TYLKO raz wyciagane byly dane a nie po kilka razy ...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 22:11