» wróć na stronę główną
» wróć do AM


Dział download

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