[Tutorial PHP]Monitorizarea fisierelor la download

#1
Nume Tutorial:Monitorizarea fisierelor la download
Descriere:Monitorizarea fisierelor la download
Download:Nu necesita
Autor:Anonim
Sursa (Link-ul oficial):
tutorialeonline
Propria parere:Util.
Tutorialul:
De curând am avut nevoie de un script care să îmi monitorizeze numărul de download-uri făcute pentru un anumit fişier. Am început să îl scriu şi rezultatul îl prezint mai jos. Pentru început, să zicem că numele fişierului este test.zip şi că îl punem pe server în directorul download. În pagina în care facem legătura la el în mod normal scriem un link de forma:

<a href="download/test.zip">Descarca fisierul test.zip</a>

Pentru a putea fi monitorizat acest fişier, trebuie să apelam un script intermediar care să facă contorizarea şi apoi să ne returneze fişierul respectiv. Să zicem că scriptul de monitorizare se numeşte load.php Acest script va primi prin get ca parametru numele fişierului pe care dorim să îl descărcăm astfel:

<a href="load.php?cere=test.zip">Descarca fisierul test.zip</a>

Mai departe, scriptul se va ocupa cu salvarea datelor în baza de date şi returnarea fişierului cerut.
Cum face asta?
Pentru asta trebuie să existe un tabel în baza de date în care se va salva datele vizitatorului şi numele fişierului.
De ce nu se salvează doar numărul de descărcări al fişierului?
Pentru că există scripturi pe net (boţi sau spideri) care indexează fiecare pagină şi pot apela de mai multe ori pe minut acelaşi link, cum este şi linkul de download, iar dacă noi salvăm în baza de date doar numărul de accesări acest lucru nu va fi real, deoarece spiderii nu descarcă fişierul, doar accesează linkul pentru indexare. (Am păţit la un spider să îmi acceseze aceeaşi pagină şi de 20 de ori pe zi, dacă nu aveam în baza de date salvate datele nu aş fi ştiut şi aş fi crezut că a fost un record la descărcatul acelui fişier în ziua respectivă)
Tabelul în baza de date ar trebui să conţină coloanele următoare:

id - nume_fisier - data_ora - ip_vizitator - browser

Id-ul va fi int autoincrement,
numele fişierului este varchar(100) - nu cred că numele fişierului va fi mai mare de 100 de caractere nu?
data_ora - standard eu o pun datetime dar voi puteţi să o puneţi în ce format doriţi să se salveze data şi ora şi minutul (în cazul când acelaşi vizitator - ip - descarcă de mai multe ori pe zi acelaşi fişier să ştim asta şi să contorizam doar numărul de descărcări unice)
ip_vizitator - varchar(15)
browser - varchar(255) - semnăturile de browser pot fi destul de lungi...

Iată mai jos un exemplu:
CREATE TABLE `download` (
`download_id` int(11) NOT NULL auto_increment,
`file_name` varchar(100) NOT NULL,
`date_time` datetime NOT NULL,
`ip` varchar(15) NOT NULL,
`browser` varchar(255) NOT NULL,
PRIMARY KEY (`download_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 ;
Mai departe, în scriptul de monitorizare doar salvăm datele şi returnăm fişierul:

Cod:

Cod: Selectaţi tot

 <?php
 // fisierul load.php
 //    se deschide bufferul pentru a se evita problemele cu headerele
 ob_start();
 // se verifica ce fisier se cere
 if (isset($_GET['cere'])) {
    $nume_fisier = mysql_real_escape_string($_GET['cere']);
    $ip = $_SERVER['REMOTE_ADDR'];
    $browser = $_SERVER['HTTP_USER_AGENT'];
    // se salveaza cererea in baza de date
    $interogare = "INSERT INTO `download` 
       (`file_name`, `date_time`, `ip`, `browser`) VALUES <br>
       ('$nume_fisier', NOW(), '$ip', '$browser')";
    $rezultat = mysql_query($interogare)
    // se returneaza fisierul
    echo '<meta http-equiv="refresh" content="0;URL=download/'.$nume_fisier.'" />';
 }
 else {
    echo 'Nu a fost cerut nici un fisier';
 }
 // se inchide bufferul
 ob_end_flush();
 ?>
Până acum avem un fişier index.php care conţine linkul de download, apoi avem fişierul load.php cu scriptul de mai sus, şi mai avem directorul 'download' care conţine fişierul test.zip
Lipseşte scriptul care afişează numărul de descărcări efectuate. Scripul acesta poate fi inclus în index.php astfel:

Cod:

Cod: Selectaţi tot

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 <title>Untitled Document</title>
 </head>
 
 <body>
 <a href="load.php?cere=test.zip">Descarca fisierul test.zip  </a> 
 <?php
 $conectare = mysql_connect('localhost', 'root', '');
 mysql_select_db('nume_baza_date', $conectare);
 $comanda_sql = "SELECT count(*) FROM `download` GROUP BY `ip`";
 $interogare_sql = mysql_query($comanda_sql);
 $total = mysql_result($interogare_sql, 0);
 echo $total.' descarcari';
 ?>
 </body>
 </html>
Pe lângă linkul de download se va afişa şi numărul de descărcări unice efectuate (după ip). Bineînţeles că având salvările din baza de date putem face un script care să ne arate rapoarte pe zile, pe ore sau pe numele fişierului (dacă sunt mai multe fişiere).
N-am cerut la nimeni niciodata,
Chiar de-a fost sa rabd, in viata mea.
Am dat totul fara nici o plata,
Nevoind nimic sa mi se dea.

@Virgil Carianopol
Vezi-ti de treaba si retine:
"E treaba ta sa spui ce vrei si sa nu conteze pentru nimeni".

@Kazi Ploae

Înapoi la “Tutoriale PHP”

Cine este conectat

Utilizatori răsfoind acest forum: Niciun utilizator înregistrat și 1 vizitator