[PHP] Contatore di download di file

Rispondi
Roberto
Amministratore
Messaggi: 160
Iscritto il: 19/12/2009, 19:30

[PHP] Contatore di download di file

Messaggio da Roberto »

Livello Difficolta': Medio

Vi sara' sicuramente capitato di imbattervi nel problema di voler contare quante volte vengono scaricati i file che avete messo a disposizione di download sul vostro sito internet (homepage o portale che sia). Da una rapida ricerca sui piu' comuni motori di ricerca (Google, Msn, Bing, Altavista, Yahoo, etc... etc...) avrete notato che per quanto riguarda PHP vi vengono segnalati risultati del tipo Contatore di Download, Contatore di accesso, Contatore di visite e refer, Click counter, Download counter, Hit counter, Contatore di contatti, etc... etc... che non portano ad una rapida risoluzione del vostro problema.

Ecco che vi mostro una rapida soluzione combinata tra PHP e MySQL.

1) Create una tabella avente i seguenti attributi:
  • id, di tipo contatore numerico che sara' anche chiave primaria della vostra tabella;
  • nome_file, di tipo carattere (serve ad identificare il file);
  • contatore, di tipo numerico (serve a memorizzare il numero di download del file).
2) Create un file PHP in cui c'e' l'elenco di tutti i file che avete messo a disposizione per il download dal vostro sito:

Codesto file (per esempio PAGINA1.PHP) oltre al normale codice HTML dovra' contenere una semplice query per stampare l'elenco di tutti i file che sono contenuti all'interno della tabella creata al punto 1. A questo punto si dovra' sostituire la classica stringa html per il dowload

Codice: Seleziona tutto

<a href="NOME_FILE">NOME FILE</a>
con la seguente

Codice: Seleziona tutto

<a href="PAGINA2.php?id=<?php echo $row['id'] ?>">NOME FILE</a>
Il codice appena inserito non fa altro che inviare la richiesta di download tramite l'ID del file.

3) Create un file PHP che serve ad inviare il file da scaricare e ad aggiornare il contatore:

Codesto file (per esempio PAGINA2.PHP) innanzitutto recupera l'id del file da scaricare

Codice: Seleziona tutto

$id_file=$_GET['id'];
e successivamente effettua una query per recuperare il nome del file da trasferire

Codice: Seleziona tutto

$sql = "SELECT nome_file
	FROM TUATABELLA
	WHERE id=" . $id_file;
A questo punto non rimane altro da fare che aggiornare la variabile contatore con un'altra query

Codice: Seleziona tutto

$sql = "UPDATE TUATABELLA
	SET contatore = contatore + 1
	WHERE id=" . $id_file;
ed inviare infine il file da scaricare all'utente attraverso l'utilizzo delle funzioni PHP di header

Codice: Seleziona tutto

$directory = "PERCORSO_CARTELLA_CONTENENTE_FILE";
header('Content-Disposition: attachment; filename="'.$row["nome_file"]);
readfile($directory.$row["nome_file"]);
Rimango a disposizione di chiunque abbia dei problemi a realizzare la seguente applicazione o abbia voglia di approfondire alcuni aspetti.
Roberto
Amministratore
Messaggi: 160
Iscritto il: 19/12/2009, 19:30

Re: Contatore di download di file

Messaggio da Roberto »

Un modo intelligente per la gestione di errori che potrebbero capitare e' quello di inserire un controllo prima dell'invio del file per verificare che il file richiesto esista; in caso contrario si puo' pensare oltre a far apparire un messaggio d'errore personalizzato, anche di avvisare l'amministratore del sito via email.

Dopo aver effettuato la query per recuperare il nome del file, basta quindi inserire il controllo sopracitato:

Codice: Seleziona tutto

if (file_exists("$row["nome_file"]")) {
     $directory = "PERCORSO_CARTELLA_CONTENENTE_FILE";
     header('Content-Disposition: attachment; filename="'.$row["nome_file"]);
     readfile($directory.$row["nome_file"]);
} else {
     $today = date("j F Y G:i");
     $user_ip = "$_SERVER[REMOTE_ADDR]";
     $to = "tuaemail@tuosito.xxx";
     $subject = "Download non trovato";
     $body = "$user_ip il giorno $today non ha trovato il file $row["nome_file"]";
     @mail("$to","$subject","$body");
     echo "Il file richiesto non &egrave; disponibile per il download.<br>Riprova pi&ugrave; tardi.";
}
Rispondi