CompZone.Org :: Artykuły :: PHP
Pytania w drugiej edycji Testu PHP powinny być:
Trudniejsze
Łatwiejsze
Skomplikowane
Na myślenie
Do liczenia
Sonda Wyniki

Add to Google

Licznik pobrań pliku w PHP

uż nie raz szukałem w sieci jakiegoś skryptu w php. Ostatnio potrzebny mi był licznik ściągnięć pliku oparty na mySQL (no jak płacę za serwer z mySQL to dlaczego mam z niego nie korzystać.

Licznik - co będzie potrzebne?

Do napisania licznika będę potrzebować dwóch skryptów: pierwszy będzie pobierał ilość ściągnięć, a drugi będzie zapisywać do bazy, który to już raz plik został pobrany. Zacznę od pierwszego, chociaż będzie on wyglądać na taki, który działa jakoś nie logicznie.

Skrypt pierwszy - Licznik pobrań

Aby móc sprawdzić ile osób pobrało nasz program musimy najpierw połączyć się z bazą danych, a następnie pobrać ile razy został ściągnięty dany plik. Aby łatwiej było nam korzystać później korzystać z tego skryptu to zastosuję funkcje.

Funkcje nazwałem "IleRazyPobrano" do tej prawidłowego funkcjonowania potrzebować będziemy pewnych danych, czyli: nazwę pliku, nazwę tabeli z której pobieramy dane oraz nazwę bazy danych. Zminną przechowującą nazwę pliku nazwałem $plik , bazę nazwałem $baza , a nazwę tabeli $baza_zrodlo.

Funkcja teraz przedstawia się następująco:

 <?php
//...
function IleRazyPobrano($plik, $baza, $baza_zrodlo)
//...
?>

Teraz wystarczy tylko połączyć się z odpowiednią bazą danych, pobranie ilości pobrań danego pliku oraz zwrócenie wyniku. Wygląda to następująco:

 <?php
//...
mysql_select_db($baza); //wybieram bazę
$ilerazy = mysql_query("SELECT iloscpobran FROM $baza_zrodlo WHERE nazwapliku = '$plik'"); //wysyłam zapytanie do bazy o liczbę ściągnięć
$wynik = mysql_fetch_row($ilerazy); //pobieram wynik w komórki, którą otrzymałem w zmiennej $ilerazy
return $wynik[0]; //zwracam pierwszy wynik ponieważ zmienna $wynik jest typu array
?>

Cały skrypt prezentuje się następująco:

 <?php
function IleRazyPobrano($plik, $baza, $baza_zrodlo)
{
mysql_select_db($baza); //wybieram bazę
$ilerazy = mysql_query("SELECT iloscpobran FROM $baza_zrodlo WHERE nazwapliku = '$plik'"); //wysyłam zapytanie do bazy o liczbę ściągnięć
$wynik = mysql_fetch_row($ilerazy); //pobieram wynik w komórki, którą otrzymałem w zmiennej $ilerazy
return $wynik[0]; //zwracam pierwszy wynik ponieważ zmienna $wynik jest typu array
}
?>

Plik ze skryptem zapisujemy pod nazwą "pobrano.php".

Drugi skrypt już będzie bardzie skomplikowany. Będziemy musieli w nim nawiązać kontakt z bazą danych, sprawdzić czy dany plik istnieje, czy użytkownik z zewnątrz nie "kombinował" ze skryptem, dodać nazwę pliku to tabeli jeżeli nie istnieje zwiększyć ilość pobrań i zainicjować pobieranie. No więc zaczynamy :)

Skrypt drugi - Zwiększanie oraz pobieranie

Teraz zacznę od zmiennych, które będą mi potrzebne:

 <?php
//...
$plik = $_GET['plik']; //pobiera nazwę pliku, który użytkownik chce pobrać

$baza_ip = 'localhost'; //adres bazy danych (najlepiej aby był to localhost)
$baza_uzytkownik = 'userbazy'; //nazwa użytkownika bazy
$baza_haslo = 'haslousera'; //hasło dla danego użytkownika bazy
$baza = 'stronaglowna'; //nazwa bazy glównej
$baza_zrodlo = 'download'; //tabela, w której są zapisywane wpisy o ilości pobrań

$folder_z_plikami = 'download/'; //tutaj będą znajdować się pliki do pobrania
//...
?>

Co jeszcze?

Teraz przedstawię resztę kodu wraz z opisem:

 <?php
//....
if ($plik != '') //sprawdzam czy zmienna plik jest pusta, jeżeli jest pusta nie wywołuję dalej kodu tylko informuję o błędzie.
{
if (!file_exists($folder_z_plikami . $plik)) //sprawdzam czy podany plik istnieje na serwerze
{
print "Podany plik: $plik nie istnieje"; //jeżeli plik nie istnieje to nie wykonuję dalszych operacji tylko wyświetlam informację o błedzie
}
else
{
@
$db = mysql_connect($baza_ip, $baza_uzytkownik, $baza_haslo);
/*
Powyższym kodem łączę się z bazą danych mySQL korzystając ze stałych zdefiniowanych na początku skryptu. Znak małpy przed zmienną $db konieczny jest ze względu na możliwość wystąpienia błędu, który jeżeli i tak zaistnieje to i tak zostanie znaleziony za chwilę.
*/

if ($db) //sprawdzam czy zostaliśmy połączeni z bazą
{ //Jeżeli tak wykonujemy poniższe czynności
mysql_select_db($baza); //ustawiam nazwę bazy danych

$result = mysql_query("SELECT * FROM $baza_zrodlo WHERE nazwapliku='$plik' "); //sprawdzam czy w tabeli $baza_zrodlo istnieje nazwa naszego pliku
$num = mysql_num_rows($result); //sprawdzam ile razy występił wpis o nazwie pliku w $plik

if($num >= 1) //jeżeli występuje jeden plik, lub więcej o tej nazwie to...
{
$ile = IleRazyPobrano($plik, $baza, $baza_zrodlo); //...poberam do zmiennej $ile ilość pobrań danego pliku <- w tym miejscy korzystam ze skryptu "pobrano.php"
$nowy = $ile+1; // dodaję jedno pobranie


//Tutaj rozpoczyna się już właściwie pobieranie pliku


header('Pragma: no-cache'); //ustawiamy: aby zawartość nie była cache'owana,
header('Content-Transfer-Encoding: binary'); //zawartość wysyłanego pliku jest binarna,
header('Content-Type: application/x-unknown'); //aplikacja odpowiedzialna za plik,
header("Content-Disposition: attachment; filename=$plik"); //nazwa pliku,
header("Location: "."/".$folder_z_plikami.$plik); //zródło pliku.

//koniec części odpowieadającej za pobieranie
mysql_query("update $baza_zrodlo set iloscpobran=$nowy where nazwapliku='$plik'"); //wysyłam do bazy prośbę o uaktualnienie wpisu ilości pobrań
}
else // jeżeli nie znaleziono pliku w tabeli o tej nazwie to...
{
mysql_query("insert into $baza_zrodlo values ('$plik', 1)"); //wysyłamy prośbę o dodanie pliku z wartością 1 ściągnięcia
//Poniższe wysyłanie jest identyczne jak w przypadku powyższym
header('Pragma: no-cache');
header('Content-Transfer-Encoding: binary');
header('Content-Type: application/x-unknown');
header("Content-Disposition: attachment; filename=$plik");
header("Location: "."/".$folder_z_plikami.$plik);
//koniec wysyłania
}
mysql_close($db); //kończę połącznie z bazą danych
}
else
{
print "Błąd: Nie mogę połączyć się z bazą danych"; //jeżeli nie można połączyć się z bazą mySQL wyświetl komunikat o błędzie
}
}
}
else
{
print "Błąd wywołania skryptu!!!"; //jeżeli zostały wysłane złe dane do skryptu wyświetl błąd
}
?>

Ustwienie bazy danych

W bazie danych będziemy potrzebować tabeli o polach: "nazwapliku" o typie VarChar i długości 30 znaków oraz pola o nazwie "iloscpobran" o typie Int i wartością domyślną "0"

Korzystanie ze skryptów

Korzystanie ze skryptów jest bardzo proste, należy jednak pamiętać aby plik "pobrano.php" znajdował się w folderze z plikami do sciągnięcia.

Korzystanie z skryptu "download.php"

Aby użyć skryptu download.php musimy go odpowiedni wywołać np. w taki sposób
twójadres.pl/download.php?plik=nazwapliku

Korzystanie z skryptu "pobrano.php"

Niestety korzystanie z tego pliku jest już trochę bardziej skomplikowane. Przykład skryptu jaki trzeba dodać do pliku html znajduje się w załączniku do artykułu dostępnego tutaj.

PcSA @ 11-07-2006 23:35

#1

NIE POLECAM KORZYSTAĆ ! TO NIE DZIAŁA ODRAZU ! POTRZEBNE SĄ ZNACZĄCE POPRAWKI ABY URUCHOMIĆ SKRYPT! JEŻELI KTOŚ CHCE POPRAWIONĄ WERSJĘ PROSZĘ O KONTAKT NA GG : 13267335 !

sakuwbarakushow @ 30-01-2011 14:32

#2

NIE POLECAM KORZYSTAĆ ! TO NIE DZIAŁA ODRAZU ! POTRZEBNE SĄ ZNACZĄCE POPRAWKI ABY URUCHOMIĆ SKRYPT! JEŻELI KTOŚ CHCE POPRAWIONĄ WERSJĘ PROSZĘ O KONTAKT NA GG : 13267335 !

sakuwbarakushow @ 30-01-2011 14:56
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!