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:
![]()
//...
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:
![]()
//...
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:
![]()
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:
![]()
//...
$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:
![]()
//....
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.










