Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]kategorie i podkategorie, wyświetlanie...
Forum PHP.pl > Forum > Przedszkole
hejkumkejkum
Mam pewną zagwozdkę, chcę zrobić coś takiego

Kategoria gł1
podkategoriaA
1.publikacja (link Word lub pdf) wielkość pliku, data
2 publikacja (link Word lub pdf) wielkość pliku, data
| LINK wyświetl całą zawartość podkategoriiA. |
podkategoriaB
1.publikacja (link Word lub pdf) wielkość pliku, data
2 publikacja (link Word lub pdf) wielkość pliku, data
3 publikacja (link Word lub pdf) wielkość pliku, data
4 publikacja (link Word lub pdf) wielkość pliku, data
5 publikacja (link Word lub pdf) wielkość pliku, data
| LINK wyświetl całą zawartość podkategoriiB. |
Kategoria gł2
1.publikacja (link Word lub pdf) wielkość pliku, data
2 publikacja (link Word lub pdf) wielkość pliku, data
| LINK wyświetl całą zawartość kategorii gł2. |

A więc chodzi o to, że chcę na stronie umieścić pliki do pobrania, przy czym chcę aby od razu były widoczne i kategorie główne, które mogą zawierać odnośniki do plików(publikacji) jak i podkategorie, oraz powiedzmy widocznych 5 najnowszych publikacji, a pod spodem link do reszty publikacji z danej kategorii/podkategorii po kliknięciu którego przechodzi się do całego spisu publikacji z danej kategorii.

Czyli zdaje się dwie tabele (lub trzy), jedna tabela przechowuje dane dotyczące plików, druga tabela przetrzymuje kategorie i podkategorie, ewentualnie osobno tabela z kategoriami i podkategoriami(?).

Czy dobrze kombinuję?

W PHP jestem laikiem staram się coś nauczyć lecz ja muszę stopniowo rozgryzać koncepcję, a wiele przykładów jest od razu z grubej rury, które są na tyle skomplikowane, że logicznie nie potrafię ich rozpracować i jednocześnie poznać zasad działania.

Głownie mam niejasność co do tabeli kategorii i podkategorii, czy to ma być w jednej tabeli czy ma to być jednak rozbite na dwie tabele? Bo za chiny ludowe nie wiem jak to można wyświetlic mając

mysql> select * from category;
+----+----------+-------------+
| id | deep | name |
+----+------+-----------------+
| 1 | 0 | kategoria gł1 |
| 2 | 0 | kategoria gł2 |
| 3 | 0 | kategoria gł3 |
| 4 | 1 | podkategoriaA |
| 5 | 1 | podkategoriaB |
+----+------+-----------------+

W takiej sytuacji nie wiem jak podpiąć podkategorie do kategorii głównych, to chyba bardziej się nadaje do metody wyświetlania która w danym momencie wyświetla tylko kategorie lub podkategorie w zależnosci od deep.

Czy dobrze to rozumiem czy całkowicie poplątałem?
Pilsener
Kombinujesz niepotrzebnie - strukturę generuje się automatycznie, zapoznaj się z funkcją glob. Skrypt automatycznie wygeneruje Ci menu i linki do plików na podstawie struktury i zawartości folderów - na forum i w sieci masz masę przykładów: listing plików, przeglądarka katalogów etc.
cbagov
Wystarczy 1 tabela, w ktorej trzymasz dane plikow i przypisanie do kategorii - kolumna-kategoria, kolumna_podkat itd. potem nic nie kopiujesz jesli chcesz przeniesc miedzy kategoriami a jedynie zmieniasz wpis w polu w danej kolumnie.

Tak samo nie ma sensu uzywanie funkcji typu glob i innych skryptow cos tam generujacych z listy katalogu bo szkoda czasu.
Skoro cos zostalo wprowadzone na serwer, to wszystkie dane sa juz znane i teraz zaleznie od koncepcji zapisujesz w tabeli bazy albo na plikach taka ilosc danych jaka uwazasz za stosowna np. w zaleznosci od wydajnosci.
Czyli mozesz takze wkleic w baze rozmiar pliku, czas itp.

Czytanie kazdorazowe struktury katalogowej przy masie plikow to strata czasu i pradu.
hejkumkejkum
Cytat(Pilsener @ 20.05.2008, 08:18:06 ) *
Kombinujesz niepotrzebnie - strukturę generuje się automatycznie, zapoznaj się z funkcją glob. Skrypt automatycznie wygeneruje Ci menu i linki do plików na podstawie struktury i zawartości folderów - na forum i w sieci masz masę przykładów: listing plików, przeglądarka katalogów etc.


Nie mogę struktury generować automatycznie pobierając katalog z plikami gdyż do publikacji muszę dodać również opis, a linki do pliku muszą mieć normalną nazwę, która zarazem jest linkiem. Tak więc oparcie na bazie danych to jedyne sensowne rozwiązanie.

Cytat(cbagov @ 20.05.2008, 12:22:57 ) *
Wystarczy 1 tabela, w ktorej trzymasz dane plikow i przypisanie do kategorii - kolumna-kategoria, kolumna_podkat itd. potem nic nie kopiujesz jesli chcesz przeniesc miedzy kategoriami a jedynie zmieniasz wpis w polu w danej kolumnie.

Tak samo nie ma sensu uzywanie funkcji typu glob i innych skryptow cos tam generujacych z listy katalogu bo szkoda czasu.
Skoro cos zostalo wprowadzone na serwer, to wszystkie dane sa juz znane i teraz zaleznie od koncepcji zapisujesz w tabeli bazy albo na plikach taka ilosc danych jaka uwazasz za stosowna np. w zaleznosci od wydajnosci.
Czyli mozesz takze wkleic w baze rozmiar pliku, czas itp.

Czytanie kazdorazowe struktury katalogowej przy masie plikow to strata czasu i pradu.


Czy mógł bym prosić o jakiś przykład wizualny? wstydnis.gif
cbagov
Tabela

(auto)id | index | nazwa pliku | grupa | kategoria | |data pliku | data upload | data ...itd |


Czesc danych generuje sie automatycznie przy wrzucaniu pliku - rozmiar, daty itp
Podczas lub po wrzuceniu na serwer uzytkownik ustala przynaleznosc do kategorii i inne parametry.

Jesli "obrazek" ma miec tez inne wlasciwosci opisowe a _zalezne_ od jego kategorii - dopiero wtedy mozesz myslec o kolejnej tabeli posiadajacej adekwatne wlasciwosciom kolumny.


Majac juz 1 wpis np:
01 | ... | ... | grupa=natura | kategoria=kwiatki | ....

zmiana kategorii to zmiana wpisu w polach, zadnego kopiowania, glebszych zmian itp, pliki zostaja w swoim miejscu.

Oczywiscie w tym konkretnym przykladzie, poniewaz inna koncepcja, zakladajaca inny uklad chociazby na dysku - spowodowany jakimis specyficznymi operacjami na plikach - moze wymoc inne sposob realizacji operacji na bazie.

Z kolei np. | nazwa pliku | po pierwsze powinna byc generowana nowa dla pliku pracujacego na serwerze np. dla ulatwienia operacji dyskowych lub bezpieczenstwa a nie pozostawiana taka jak oryginalu, jesli nazwa oryginalu potrzebna mozna ja trzymac ale jako ceche opisowa a nie jako wlasciwosc od ktorej cos zalezy.

Same nazwy mozesz generowac dla ulatwienia tak: prefNAM1099439661527b897052c1a

gdzie powstaje ci struktura dyskowa:

KATALOG nazwa: prefNAM1099439661527b897052c1a
.
..
plik_duzy(np. oryginal).jpg
plik_mini.jpg
plik_sredni.jpg

co powoduje, ze kasujac wpis w bazie dla danego obrazka kasujesz wszystkie dane dotyczace pliku, jakie masz na dysku jedna operacja, bez szukania i grzebania sie.

Dodatkowo optymalizujesz dzialanie Apache, ktory nie ma katalogu zapelnionego setkami plikow a jedynie podkatalogi z plikami, wielokrotna oszczednosc listowania struktury: zamiast [1000] plikow obrazkow i kazdy ma np. 5 podplikow, masz [200] - katalogow i tam grzebiesz.

Budowa nazwy przykladowego katalogu:
prefNAM1099439661527b897052c1a

pref -prefiks kategorii
NAM -czesc oryginalnej nazwy obrazka
1099439661527b897052c1a - indywidualny tzw. hash czyli ID plikowy dla katalogu.

Nie bede wyjasnial co i po co, bo pewnie sam sie domyslisz, ze moze ci sie to do czegos przydac, bo wcale nie musisz sie kurczowo trzymac kazdego posdunietego tu pomyslu. Dla mnie one pracuja bo mam okreslona koncepcje.

Ciekawa zaleta to fakt, ze podajesz do kazdego obrazka link http://..............plik_duzy.jpg winksmiley.jpg bo wlasciwe skierowanie nadala _nazwa katalogu_, co rowniez pozwala na pewne interesujace sztuczki i ulatwienia.
Jedno z nich to fakt, ze osoba nieswiadomie robi zapis 10 fotek ze strony, a zapisala sie jedna bo kazda ma te sama nazwe. Jesli faktycznie chcesz zabezpieczac to polaczysz ten trik z kilkoma innymi i nie da rady zapisac obrazka inaczej jak tylko przez PrintScreen. (ale to znowu za szeroki temat winksmiley.jpg)

no moze starczy na razie

PS powyzsza struktura katalogu moze zawierac tez inne pliki zwiazane z obrazkiem np. zwiazane ze statystyka, dokumenty albo tez jakies elementy HTML itp.
ale nie musi, tak samo jak nie musi byc w niej plikow miniatur i srednich bo jak masz superfast server to mozesz generowac np. dynamicznie miniatury albo pobierac je z z pliku poprzez EXIF itd itd. To temat na ladnych pare piw.
hejkumkejkum
Znalazłem taki temat:
http://forum.php.pl/index.php?showtopic=89...mp;hl=kategorie

Chodzi mi głównie o to, że nie wiem kompletnie jak wyświetlić strukturę tabeli mając tak jak autor powyższego tematu podoobną budowe tabeli kategorii/podkategorii:

Tabela category:

| ID | NAZWA KATEGORI | PODKATEGORIA |
-------------------------------------------------
| 1 | Kategoria 1 | 0 |
| 2 | Kategoria 2 | 0 |
| 3 | Kategoria 3 | 0 |
| 4 | Podkategoria A | 2 |
| 5 | Podkategoria B | 2 |
| 6 | Podkategoria C | 3 |
-------------------------------------------------


W jaki sposób to wyświetlić, męczę się od kilku dni ale już mnie flustracja dopada i powoli się poddaję.
  1. <?php
  2. $sql = mysql_query(&#092;"SELECT * FROM category\")
  3.  or die ('Wystąpił błąd: '.mysql_error() );
  4. while($row=mysql_fetch_array($sql))
  5. {
  6. echo $row['name'];
  7.  }
  8. ?>

W powyższym wylistowanie kategorii i podkategorii będzie wyglądać tak:

# kategoria główna 1
# kategoria główna 2
# kategoria główna 3
# podkategoria A
# podkategoria B
# Podkategoria C


A powinno wyglądać tak:

# kategoria główna 1
# kategoria główna 2
# podkategoria A
# podkategoria B
# kategoria główna 3
# Podkategoria C


Nie wiem jak to ruszyć dalej HELP sciana.gif .

Chyba sobie poradziłem.

  1. <?php
  2. $query = mysql_query(&#092;"SELECT * FROM category WHERE Subcat='0' ORDER BY id ASC\");
  3. while ($result = mysql_fetch_row($query)) {
  4. echo $category = &#092;"<a href="$result[0]">$result[3]</a href='$result[0]'>\"; 
  5. $subQuery = mysql_query(&#092;"SELECT * FROM category WHERE Subcat='\".$result['0'].\"' ORDER BY id ASC\");
  6. while ($subResult = mysql_fetch_array($subQuery)) 
  7. {
  8. echo $category = '<li>--'.$subResult[3] . ' ' ;
  9. }
  10. }
  11. ?>


Jak takie rozwiązanie ma się do wydajności i obciążenia bazy danych?
Samych kategorii i podkategorii wiele nie będzie ale plikków zdaje się około 300-400.
Cysiaczek
Tworząc system kategorii warto zapoznać się z:
http://depesz.com/various/various-sqltrees.php
oraz
"metoda 5": http://depesz.com/various/various-sqltrees...lementation.php

W sieci znajdziesz sporo rozwiązań dotyczących Nested Sets, które są dobrym rozwiązaniem, a na pewno lepszym niż proponowane w tym topicu metody. Oczywiście warto, jeśli planowane są później bardziej skomplikowane operacje na kategoriach.

Pozdrawiam
hejkumkejkum
Cysiaczek wiesz najpierw chciałem się nauczyć podstawowego myślenia w związku z budowaniem takich tabel, pól, zanim przejdę do dalszej analizy i ewentualnej optymalizacji muszę poznać zasady.

Mam jeszcze prośbę o pomoc z zapytaniem.

Męczę się na różne sposoby i JOIN i bez JOIN ale nijak mi tonie wychodzi.

Czyli mam kod który wyświetla kategorie główne i podkategorie w postaci

Kategoria gł1
podkategoriaA
podkategoriaB
Kategoriagł2
podkategoriaA
kategoria gł3


Struktura bazy to:

"category":
id, Subcat, name
--------------------
id to wiadomo,
Subcat to wartość kategorii podkategorii (0 to kategoria główna),
name to nazwa kategori lub subkategorii.

oraz

"file":
id, category, name, url, addition
--------------------
id wiadomo
category to przyporządkowanie do id w tabeli (problem z zapytaniem)
name to nazwa pliku/odnośnika
url to ścieżka do ktorej został załadowany plik,
addition (timestamp) to data dodania wpisu do bazy


Samą strukturę kategorii i podkategorii wyświetlam na raize tak:

  1. <?php
  2. $query = mysql_query("SELECT * FROM category WHERE Subcat = '0'");
  3. while ($result = mysql_fetch_row($query)) {
  4. echo $category = "<br/><li><a href='$result[0]'>$result[2]</a></li><br/>";
  5.  
  6. $subQuery = mysql_query("SELECT * FROM category WHERE Subcat='".$result['0']."' ");
  7. while ($subResult = mysql_fetch_array($subQuery)) 
  8. {
  9. echo $category = '<li>--'.$subResult[2] . '</li> ' ;
  10. }
  11. }
  12. ?>


Proszę o pomoc z zapytaniem chodzi o to, że chcę wyświetlić to tak:


Kategoria gł1
podkategoriaA
podkategoriaB
Wrzucony plik jeden, nazwa odnosnika blabla (data)
Wrzucony plik dwa, nazwa odnosnika blabla (data)
Kategoriagł2
podkategoriaA
kategoria gł3

W zależności od tego do której kategorii, podkategorii przyporządkowany będzie plik z danymi.

CODE
SELECT * FROM category WHERE Subcat = '0'

Wyświetla na razie tylko kategorie główne, jak zmodyfikować to zapytanie by do kategorii głównych (również do podkategorii w drugim zapytaniu) przyporządkowało dane z tabeli "file" ?



PS. Czy jest jakiś darmowy generator zapytań, którym się można posiłkować?


Pozdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.