Najpierw musimy zdefiniować swoje wymagania i plany. Od
systemu będziemy oczekiwać:
- łatwej obsługi (zarówno przez administratora, jak i
użytkownika),
- łatwego dostępu do plików,
- możliwości sortowania i wyszukiwania.
Do zrealizowania tych założeń wybraliśmy język PHP i
bazę danych MySQL.
Baza danych
Zanim zaczniemy tworzyć skrypty, musimy zdefiniować
strukturę bazy danych. Dane będą przechowywane w dwóch
tabelach. W pierwszej umieszczone zostaną informacje o plikach,
w drugiej - nazwy i opisy kategorii.
Tabela "pliki" będzie zawierać następujące
pola:
- id - unikatowy numer każdego pliku,
- nazwa - nazwa pliku (np. "Pajączek"),
- url - adres pliku (np. "http://www.strona.pl/pajaczek.zip"),
- opis - informacje o pliku (np. "Najlepszy
polski edytor stron WWW"),
- ilosc_pobran - liczba pobrań pliku,
- wielkosc - wielkość pliku w kB,
- data_dodania - data (kiedy plik został dodany do
bazy),
- kategoria - numer kategorii tematycznej pliku (np.
"3"),
Tabela "kategorie" będzie z kolei zawierać następujące
pola:
- id - jednoznaczny numer kategorii,
- nazwa - nazwa kategorii (np. "Programy"),
- opis - opis kategorii (np. "Bardzo dużo użytecznych
programów").
Głównym kluczem w obu tabelach jest pole "id". Będzie
się przydawać podczas odwołań zarówno do plików, jak i
kategorii. Aby stworzyć obie tabele, należy wykonać następujące
polecenia MySQL:
CREATE TABLE pliki (
id int(11) NOT NULL default '0' auto_increment,
nazwa varchar(255) NOT NULL,
url varchar(255) NOT NULL,
opis varchar(255) NOT NULL,
ilosc_pobran integer default '0',
wielkosc integer default '0',
data_dodania date default '0000-00-00' NOT NULL,
kategoria integer NOT NULL,
PRIMARY KEY (id),
UNIQUE id (id)
);
CREATE TABLE kategorie (
id int(11) NOT NULL default '0' auto_increment,
nazwa varchar(255) NOT NULL,
opis varchar(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE id (id)
);
Skrypty
Strukturę bazy mamy już gotową. Pora zająć się
skryptami PHP. Cały dział opierał się będzie na czterech
skryptach i jednym pliku dodatkowym. Plik "top.inc" będzie
zawierał "górną" część strony (<META>,
<HEAD> itp.) oraz bardzo prosty skrypt napisany w języku
Java Script.
Plik config.php:
<?
$url = "localhost"; //adres bazy danych
$login = ""; //nazwa użytkownika bazy danych
$haslo = ""; //hasło użytkownika bazy danych
$dbname = "download"; //nazwa bazy danych
mysql_connect($url,$login,$haslo);
mysql_select_db($dbname);
?>
Config.php to najkrótszy skrypt w naszym systemie. Odpowiada
jedynie za połączenie z bazą danych. Należy zdefiniować w
nim adres hosta, nazwę bazy danych oraz identyfikator i hasło
użytkownika.
Skrypt główny - download.php
Skrypt download.php jest najważniejszym elementem systemu,
odpowiedzialny za wyświetlanie kategorii oraz samych plików.
Przedstawimy go w częściach, aby ułatwić zrozumienie (w całości
znajduje się w dziale "DOWNLOAD" na Nortal.pl).
Skrypt składa się z trzech funkcji wykonujących konkretne
operacje. Pierwszą z nich jest funkcja "index()":
function index()
{
include "top.inc";
$query = "SELECT * FROM kategorie ORDER BY nazwa";
$wynik = mysql_query($query);
echo "<div ALIGN=
\"center\" class=\"tytul\"><b>
Dział download</b></div><BR><BR>\n";
view_search_form();
echo "<span class=\"kategorie\"><b>
Kategorie:</b></span><BR><BR>\n";
while($row = mysql_fetch_array($wynik))
{
echo "<a href=\"download.php?op=view&kat="
. $row['id'] . "\">" . $row['nazwa'] ."</a><br>\n";
echo "<span class=\"tekst\">" . $row['opis'] .
"</span><BR><BR>\n";
}
}
Funkcja wyświetla stronę główną działu download,
zawierającą spis wszystkich kategorii z opisami. Po kliknięciu
na nazwie kategorii użytkownik przenoszony jest do tego samego
skryptu, ale z dodatkowymi parametrami, które uaktywniają
funkcję "viewfiles":
function viewfiles($kategoria, $sort="nazwa")
{
$title = "Dział download";
include "top.inc";
$query = "SELECT nazwa
FROM kategorie WHERE id='$kategoria'";
$wynik = mysql_query($query);
$row = mysql_fetch_array($wynik);
echo "<div ALIGN=
\"center\" class=\"tytul\"><b>$title</b><br>
Kategoria: " . $row['nazwa'] . "</div><BR>";
$query = "SELECT * FROM pliki
WHERE kategoria='$kategoria' ORDER BY $sort";
$wynik = mysql_query($query);
if(mysql_num_rows($wynik)==0) {
echo "<div align=\"center\">";
view_search_form();
echo "
<span class=\"tytul\"><br><br>
W tej kategorii nie ma jeszcze żadnych plików!!!
<br><a href=\"javascript:history.back()\"><<<
Powrót</a></span></div>";
exit();
}
echo "<span class=\"tekst\"><FORM>Sortuj według:
<SELECT NAME=\"str\" OnChange=\"przenies(this)\">\n"
."<OPTION VALUE=\"nazwa\"> nazwy </OPTION>\n"
."<OPTION VALUE=\"wielkosc\"> wielkości </OPTION>\n"
."<OPTION VALUE=\"ilosc_pobran\"> ilości pobrań </OPTION>\n"
."<OPTION VALUE=\"opis\"> opisu </OPTION>\n"
."<OPTION VALUE=\"data_dodania\"> daty dodania </OPTION>\n"
."</SELECT>\n"
."</form></span> ";
view_search_form();
echo "<span class=\"tekst\">";
while($row = mysql_fetch_array($wynik)) {
echo "<br><b>Plik:</b>
<a href=\"download.php?op=getit&id=" . $row['id'] .
"\">" . $row['nazwa'] . "</a>\n";
echo "<br><b>Wielkość:</b> " . $row['wielkosc'] . " kb\n";
echo "<br><b>Pobrań:</b> " . $row['ilosc_pobran'];
echo "<br><b>Data dodania:</b> " . $row['data_dodania'];
echo "<br><b>Opis:</b> " . $row['opis'] . "<br>\n";
}
echo "</span><br><div class=\"kategorie\">
Wszystkie kategorie:<br> | ";
$query = "SELECT * FROM kategorie ORDER BY nazwa";
$wynik = mysql_query($query);
while($row = mysql_fetch_array($wynik)) {
echo "
<a href=
\"download.php?op=view&kat=
" . $row['id'] . "\">" . $row['nazwa'] . "</a> | ";
}
echo "</div>";
}
Funkcja wyświetla stronę, na której umieszczono nazwę
kategorii przeglądanej właśnie przez użytkownika oraz listę
plików z opisami i dodatkowymi danymi. Tuż pod nazwą
kategorii wyświetlana jest rozwijana lista służąca jako menu
do sortowania plików. Menu wykorzystywane jest przez skrypt z
pliku "top.inc", za pomocą którego użytkownik
przenosi się do skryptu "download.php" z dodatkowym
parametrem "$sort".
Kiedy klikniemy na nazwie pliku, skrypt odwołuję się do
funkcji "getit()", która ma postać:
function getit($id)
{
$query = "SELECT url FROM pliki WHERE id='$id'";
$wynik = mysql_query($query);
$row = mysql_fetch_array($wynik);
Header("Location: ".$row['url']);
$query =
"UPDATE pliki SET
ilosc_pobran=ilosc_pobran+1 WHERE id='$id'";
$wynik = mysql_query($query);
exit();
}
Funkcja getit() działa dość prosto. Z bazy danych
pobierany jest adres pliku o "id" pobranym ze zmiennej
"$id". Plik wysyłany jest do przeglądarki za pomocą
funkcji "Header()". Pozostaje tylko zwiększyć o
jedno pole "ilosc_pobran" (czynność wykonywana tuż
przed zakończeniem działania skryptu).
W skrypcie download.php brakuje jeszcze kodu analizującego
parametry, z którymi jest wywoływany. Na ich podstawie kod
odsyła do określonych funkcji. Najlepiej do tego wykorzystać
instrukcję "switch()":
switch($op)
{
case "view":
if($sort=="") { $sort="nazwa"; }
viewfiles($kat, $sort);
break;
case "getit":
getit($id);
break;
default:
index();
break;
}
Wyszukiwarka - plik szukaj.php
Przydatnym elementem działu download jest wyszukiwarka, która
pomoże użytkownikowi dotrzeć do pliku (niezbędna przy bardzo
rozbudowanej bazie plików). Skrypt wyszukujący jest bardzo
prosty:
<?
require "config.php";
include "top.inc";
echo "<div ALIGN=\"center\" class=\"tytul\">
<b>Dział download</b><br>Wyszukiwarka plików</div><BR>";
if(isset($q) && $q<>"")
{
$query = "SELECT * FROM
pliki WHERE nazwa LIKE '%$q%' OR opis LIKE '%$q%'";
$wynik = mysql_query($query);
$ilosc = mysql_num_rows($wynik);
if($ilosc==0)
{
echo "<div align=\"center\">";
view_search_form();
echo
"<span class=\"tytul\"><br><br>
Nie odnaleziono żadnych plików pasujących do
wyrażenia:
<b>$q</b><br><a href=\"javascript:history.back()\">
<<< Powrót</a></span></div>";
exit();
}
echo "<span class=\"tekst\">";
if($ilosc>4)
{
echo "Odnaleziono
$ilosc plików pazujących do wyrażenia: <b>$q</b><br>";
} elseif($ilosc==1)
{
echo "Odnaleziono
1 plik pasujący do wyrażenia: <b>$q</b><br>";
} else
{
echo "Odnaleziono
$ilosc pliki pasujące do wyrażenia: <b>$q</b><br>";
}
while($row = mysql_fetch_array($wynik))
{
echo "<br><b>Plik:</b> <a href=\"download.php?op=give&id="
. $row['id'] . "\">" . $row['nazwa'] . "</a>";
echo "<br><b>Wielkość:</b> " . $row['wielkosc'] . " kb";
echo "<br><b>Pobrań:</b> " . $row['ilosc_pobran'];
echo "<br><b>Data dodania:</b> " . $row['data_dodania'];
echo "<br><b>Opis:</b> " . $row['opis'] . "<br>";
}
view_search_form();
} else
{
echo "<div align=\"center\">";
view_search_form();
echo "<span class=\"tytul\"><br><br>
Nie podałeś co skrypt ma wyszukiwać!
<br><a href=\"javascript:history.back()\">
<<< Powrót</a></span></div>";
}
?>
Przeszukiwanie bazy danych odbywa się za pomocą polecenia
MySQL: "SELECT * FROM pliki WHERE nazwa LIKE '%$q%' OR opis
LIKE '%$q%'". Wyszukuje ono wszystkie krotki bazy, w których
nazwie lub opisie występuje wyrażenie zawarte w zmiennej
"$q". Znaki procentu po obu stronach zmiennej oznaczają
to samo, co "*" w systemach operacyjnych.
Ponieważ wyszukiwarkę umieścimy na pewno w wielu miejscach
działu download, najwygodniej zdefiniować odpowiednią funkcję
w pliku "config.php". Funkcja będzie wyświetlała
formularz wyszukujący i może mieć postać:
function view_search_form()
{
echo "
<span class=\"tekst\">
<FORM ACTION=\"szukaj.php\" METHOD=GET>\n"
."Szukaj pliku:
<INPUT TYPE=\"text\"
NAME=\"q\" SIZE=20> <INPUT TYPE=\"submit\"
VALUE=\"Szukaj\">\n"
."</FORM></span>\n";
}
W każdym miejscu, w którym ma się pojawić formularz
wyszukujący, wystarczy wpisać do tej funkcji ("view_search_form()").
Administracja - plik admin.php
Ostatnim elementem systemu jest skrypt administracyjny. Umożliwia
dodawanie i usuwanie plików oraz kategorii. Pełny skrypt
znajduje się w dziale download, w tekście opiszemy jedynie
fragmenty. Oto główne funkcje skryptu administracyjnego:
function del($id, $co="pliki")
{
$query = "DELETE FROM $co WHERE id='$id'";
$wynik = mysql_query($query);
view_all();
}
function new_file($nazwa, $opis, $data, $url, $wielkosc, $kategoria)
{
$query = "INSERT INTO pliki (nazwa, url, opis, wielkosc, data_dodania,
kategoria) VALUES ('$nazwa', '$url', '$opis', '$wielkosc', '$data',
'$kategoria')";
$wynik = mysql_query($query);
view_all();
}
function new_kat($nazwa, $opis)
{
$query =
"INSERT INTO kategorie (nazwa, opis) VALUES ('$nazwa', '$opis')";
$wynik = mysql_query($query);
view_all();
}
Funkcje te wykonują następujące zadania:
- del() - usuwanie plików i katalogów z bazy (w
zależności od zawartości zmiennej "$co"),
- new_file() - dodawanie nowych plików do bazy
danych,
- new_kat() - dodawanie nowych kategorii do bazy
danych.
W skrypcie jest jeszcze jedna funkcja "view_all()".
Po jej wywołaniu wyświetlane są dwie tabele. Pierwsza
zawiera dane wszystkich kategorii, a druga plików. Oto
fragmenty funkcji:
$query = "SELECT * FROM kategorie ORDER BY nazwa";
$wynik = mysql_query($query);
while($row = mysql_fetch_array($wynik))
{
$$row['id'] = $row['nazwa'];
echo "<TR>\n"
."<TD align=center>".$row['id']."</TD>\n"
."<TD align=center>".$row['nazwa']."</TD>\n"
."<TD align=center>".$row['opis']."</TD>\n"
."<TD align=center>
<a href=admin.php?op=del_k&id=".$row['id'].">Usuń</a></TD>\n"
."</TR>\n";
}
Fragment ten tworzy elementy tabeli ze spisem kategorii.
Tuż pod definicją pętli znajduje się bardzo ciekawy i
wart zapamiętania kod: "$$row['id'] = $row['nazwa'];".
Dwa znaki "$" w zmiennej powodują, że tworzona
jest nowa zmienna o nazwie odpowiadającej zawartości
"$row['id']".
Załóżmy, że zmienna "$row['id'] ma wartość
"1" a zmienna
"$row['nazwa']" - "Programy". Instrukcja
utworzy trzecią zmienną - "$1" i przypisze jej
wartość "Programy". Zmienna ta jest
wykorzystywana w dalszej części skryptu:
$query = "SELECT * FROM pliki ORDER BY $sort";
$wynik = mysql_query($query);
while($row = mysql_fetch_array($wynik))
{
echo "<TR>\n"
."<TD align=center>".$row['id']."</TD>\n"
."<TD align=center>".$row['nazwa']."</TD>\n"
."<TD align=center>".$row['url']."</TD>\n"
."<TD align=center>".$row['wielkosc']."</TD>\n"
."<TD align=center>".$row['ilosc_pobran']."</TD>\n"
."<TD align=center>".$row['data_dodania']."</TD>\n"
."<TD align=center>".$row['opis']."</TD>\n"
."<TD align=center>".$$row['kategoria']."</TD>\n"
."<TD align=center>
<a href=admin.php?op=del_p&id=".$row['id'].">Usuń</a></TD>\n"
."</TR>\n";
}
Ta część kodu wyświetla tabelę ze spisem plików. Znów
wykorzystujemy tu podwójny znak "$": "<TD
align=center>".$$row['kategoria']."</TD>\n".
Fragment ten wyświetla zawartość zmiennej o nazwie
zawartej w "$row['kategoria']". Jeśli zmienna
"$row['kategoria']" ma wartość "1", wyświetlana
jest wartość zmiennej "$1", którą utworzyliśmy
wcześniej.
Rozbudowa
Przedstawiony zestaw skryptów jest bardzo prosty. Warto pomyśleć
o jego rozbudowie. Oto kilka pomysłów:
- wprowadzenie porcjowania wyników w celu zwiększenia
szybkości ładowania strony (ważne przy dużej liczbie
plików),
- rozbudowa wyszukiwarki (wyszukiwanie kilku wyrazów itp.),
- wprowadzenie autoryzacji w skrypcie administracyjnym,
- definiowanie podkategorii.
Możliwości rozbudowy są ogromne, wystarczy tylko inwencja
twórcza i dobre chęci.
Autor: Kamil
Matysik
Światowekody.com
Artykuł pochodzi z magazynu komputerowego
@t.
Darmową prenumeratę możesz złożyć na www.at.w.pl
|