ok, vamos a ver.
Imagina que tu archivo PDF se llama miArchivo.pdf y está almacenado en una tabla de la base de datos que consta de las siguientes columnas:
tabla_archivos
idarchivo | nombrearchivo | numdescargas
1 | miArchivo.pdf | 0
Quieres saber cuántas veces se ha descargado entre otras cosas, pues bien, debes crear un archivo PHP que relacione la base de datos con el hecho de descargar el archivo. Para ello la forma más sencilla sería pasando la ID del archivo en cuestion como parámetro a esta página, esto es, paginaDescargas.php?id=1
Por lo cual el enlace que debes mostrar al cliente es <a href="paginaDescargas.php?id=1">Pincha para descargar miArchivo.pdf</a>
Ahora viene la parte que se ejecutaría dentro de paginaDescargas.php
Primero debemos compbobar que el id suministrado es un entero y que existe en la base de datos:
Código PHP :
// Convertimos el id pasado a entero por temas de seguridad
$idarchivo = (int) mysql_real_escape_string($_GET['id']);
$sql = "Select * from tabla_archivos where idarchivo=$idarchivo";
$query = mysql_query($sql);
// Si existe algún registro del archivo, realizamos las operaciones oportunas
if (@mysql_num_rows($query))
{
$datos = mysql_fetch_object($query);
$sql ="UPDATE tabla_archivos SET numdescargas=" . ($datos->numdescargas + 1)." where idarchivo=$idarchivo";
mysql_query($sql);
// Ahora provocamos la descarga del archivo en cuestion mediante un header
header("HTTP/1.1 200 OK"); //mandamos código de OK
header("Status: 200 OK"); //sirve para corregir un bug de IE (fuente: php.net)
if(isset($HTTP_SERVER_VARS['HTTP_USER_AGENT']) and strpos($HTTP_SERVER_VARS['HTTP_USER_AGENT'],'MSIE')) // Explorer
header('Content-Type: application/force-download');
else// firefox, mozilla, safari, ...
header('Content-Type: application/octet-stream');
$ruta_al_archivo = "./mi/directorio/";
header("Content-Disposition: attachment; filename=" . $datos->nombrearchivo );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($ruta_al_archivo . $datos->nombrearchivo ));
$fp = fopen($ruta_al_archivo . $datos->nombrearchivo,"r");
fpassthru($fp);
fclose($fp);
// y listo
}
Un Saludo