Descriere:Monitorizarea fisierelor la download
Download:Nu necesita
Autor:Anonim
Sursa (Link-ul oficial): 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:
Mai departe, în scriptul de monitorizare doar salvăm datele şi returnăm fişierul: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 ;
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();
?>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>