System kategorii w PHP i MySQL
System kategorii jest jedną z prostszych, ale zarazem jednym z najpowszechniej wykorzystywanym skryptem. Jego elementy można dostrzec niemal w każdej aplikacji WWW. Jednak niektórzy początkujący mają problemy z wykonaniem takiego skryptu.
Choć już system ten został częściowo opisany w artykule System download, to tutaj przedstawie podobny skrypt w większym naciskiem na tworzenie i zarządzanie kategoriami.
Założenia techniczne
Nasz system kategorii oprzemy o bazę mysql. Umożliwimy robienie podkategorii o dowolnym stopniu zagłębienia. Aby pokazać, wykorzystanie kategorii stworzymy system listujący elementy (w naszym przypadku pliki) z innej tabeli. Dla uproszczenia przyjmijmy, że kategorie mogą zawierać subkategorie, tylko jesli nie zawierają innych plików. (Bez tego założenia, skrypt jest także prosty, lecz poszczególne części skryptu byłby by mniej klarowne).
Tworzymy tabele
Przed rozpoczęciem pisania kodu PHP zaprojektujemy 2 tabele. Pierwsza categories przechowywać będzie informacje o kategoriach i subkategoriach, a druga files informacje o przynależności plików do kategorii.
Jakie zatem pola powinna mieć tablica categories? Przede wszystkim powinna zawierać pole identyfikujące jednoznacznie daną kategorię. Takim polem będzie catid. Innym polem niezbędnym jest pole parent, w którym przechowywana będzie informacja o rodzicu. Jeżeli pole parent przyjmie wartość równą 0, oznacza to, że jest kategorią główną, w przeciwnym wypadku, jest subkategorią kategorii o polu catid takim jak parent. Inne przydatne pola to nazwa, opis i liczba plików.
Właściwie jedynym niezbędnym założeniem dotyczącym tabeli files jest umieszczenie pola parent, oznaczającego przynależnośc do danej kategorii.
Oto polecania SQL:
create table categories(
catid int unsigned primary key auto_increment,
name varchar(50),
description text,
filescount int unsigned,
parent int unsigned
);
![]()
alter table categories add index (parent);
![]()
create table files(
fileid integer unsigned primary key auto_increment,
filename varchar(50),
filedesc text,
counter int unsigned,
filelink varchar(100),
parent int unsigned
);
![]()
alter table files add index (parent);
Indeksy na pola parent w obu tabelach zostały dodane, aby zwiększyć wydajność poleceń SQL.
Drzewo kategorii
Warto zastanowić się, jaką strukturę reprezentujemy. Otóż będzie to drzewo. Jednak w inaczej niż zwykle, nie pamiętamy synów w danym wierzchołku, lecz jedgo rodzica.
Jak to wygląda w PHP
Dla przejżystości podzielimy skrypt na 2 funkcje: show_cat, wyświetlajacą podkategorie i list_files wypisujące pliki danej kategorii.
Pokazywanie podkategorii
Kategorie do sprawdzenie otrzymamy w parametrze $id. Funkcja rozpocznie działanie od nawiązania połączenie z bazą danych. Później pobierze informacje o kategorii oraz informacje o jej podkategoriach. Następnie wyświetli odpowiednio przetworzony wynik.
![]()
function show_cat($id){
//Nawiązanie połączenia z abazą MySQL
$link = mysql_connect('localhost','username','password');
//Wybranie bazy
mysql_select_db('kategorie',$link);
//Pobranie informacji o wyśwuetlanej kategorii
//stąd uzyskamy nazwę kategorii
$sql = 'Select * from categories where catid='.$id.';';
$result = mysql_query($sql,$link);
$info = mysql_fetch_array($result);
//Jeżeli kategoria nie istnieje
//(i nie pytamy o kategorie nadrzędną - 0)
//to wyświetlamy błąd
if(!$info && $id!=0){
echo 'Nie znana kategoria<br />';
return;
}
//Jeśli pytamy o kategorię nadrzędną
//to nadajemy odpowiednim polą potrzebne wartości
if($id==0){
$info<'name'>='Kategorie';
$info<'filescount'>=0;
}
![]()
//pobieramy informacje o podkategoriach
$sql = 'Select * from categories where parent='.$id.';';
$result = mysql_query($sql,$link);
//jeśli nie istnieje żadna podkategoria wyświetlamy pliki
if(mysql_num_rows($result)<1){
list_files($id);
return 0;
}
//Wyświetlamy tabelke
echo '<table border="0"><tr><th>'.$info<'name'>.'('. $info<'filescount'> .')</th></tr>'."n";
//Wyświetlamy w pętli wszystkie subkategorie
while(($subcats = mysql_fetch_array($result))!=null){
echo '<tr><td>'.$subcats<'name'>.' ('.$subcats<'filescount'>.') - '
.$subcats<'description'>.'</td></tr>'."n";
}
echo '</table>';
![]()
}
![]()
Jak widać skrypt jest zupełnie prosty.
Pokazywanie plików
Poniżej przedstawiam przykładową funkcje list_files, która wykorzystuje nasz system kategorii do podziału swoich danych.
![]()
function list_files($id){
//Łączymy się z bazą danych
$link = mysql_connect('localhost','username','password');
mysql_select_db('categories',$link);
//pobieramy dane o plikach
$sql = 'Select * from files where parent='.$id;
$result = mysql_query($sql,$link);
//jeśli pliki istnieją wyświetlamy je
if($result){
//wyświetlamy tabelkę z informacjami o plikach
echo '<table border="0"><tr><th>Files:</th></tr>'."n";
//w pętli wyświetlamy kolejne wiersze
while(($file = mysql_fetch_array($result))!=null){
echo '<tr><tr><a href="download.php?fileid="' .$file<'fileid'>. '">'. $file<'filename'> .'</a></td></tr>';
}
echo '</table>';
}
}
![]()
Warstwa logiczna
Mamy już odpowiednie funkcje, teraz zostaje tylko ułożenie prostego kodu, pozwalającego zadecydować jaką czynność skrypt powinnien wykonać.
![]()
//Przyjmujemy że wyświetlamy kategorie nadrzędną
$catid=0;
//Jeżeli ustawiono $_GET<'catid'> zmieniamy wartość $catid
if(isset($_GET<'catid'>))$catid=(int)$_GET<'catid'>;
$action = '';
//czy wiemy co skrypt ma robic?
if(isset($_GET<'action'>))$action = $_GET<'action'>;
//w zaleznosci od zmiennej action
switch($action){
//wyswietlamy zadaną kategorie
case 'show_cat': show_cat($catid);break;
//wyświetlamy pliki
case 'list_files': list_files($catid);break;
//a w kazdym innym wypadku wyswietlamy kategorie
//nadrzędne
default:
show_cat(0);
![]()
}
![]()
Podsumowanie
Powyższy skrypt jest dosyć prosty. Dodawanie, edycja czy usuwanienowych kategorii polega na dodaniu, zmianie bądź usunięciu odpowiedniej liczby rekordów. Jeżeli nie wiesz jak możesz zarządzać danymi w bazie MySQL polecam zajrzenie do działu SQL.










