Předem bych chtěl říct, že tohle řešení je vhodné spíš pro weby s větším počtem souborů ke stažení, např. databáze hudby v mp3 apod. (kde jsou odkazy na soubory uložené v databázi). Pokud chcete počítat stažení jen jednoho (nebo prostě velmi malého množství) souboru, je lepší použít zápis do souboru, databáze je v takovém případě zbytečná.
Finta spočívá v tom, že do stránky nedáme přímo link na cílový soubor, ale link na "mezisoubor"(+ parametr obsahující číslo souboru v databázi), který nám přičte stažení a pak uživatele hned přesměruje na cílový soubor. Celé to proběhne tak rychle, že uživatel vůbec nepozná, že se mezi něj a soubor vložil nějaký skript (maximálně podle adresy odkazu na stránce).
Máme tedy tabulku se soubory, pojmenovanou třeba (nenápadně) "files".
Příkaz pro její vytvoření by pro představu vypadal asi takhle:
CREATE TABLE files (id INTEGER AUTO_INCREMENT PRIMARY KEY, // id záznamu
filename VARCHAR(100), // jmáno souboru vypisované mezi tagy <a>..</a> do stránky
link TEXT, // odkaz na soubor, na který bude skript přesměrovávat
downloads INTEGER, // počet stažení
) CHARACTER SET latin2 COLLATE latin2_general_ci; // nepovinné, nastavení znakové sady
Náš mezisoubor pojmenujeme třeba "get.php" a umístíme do něj tento kód:
<?php
$connection = mysql_connect("server", "jmeno", "heslo") or die("<font color=red size=2 face=Verdana><center>Nepodařilo se připojit k databázi</center><br></font>");
mysql_select_db("databaze") or die("<font color=red size=2 face=Verdana><center>Databáze pravděpodobně neexistuje</center><br></font>");
mysql_query("SET NAMES 'latin2'"); // nepovinné, nastvuje znakovou sadu pro komunikaci se serverem
$id = $_GET['id'];
if(is_numeric($id)){ // zkontrolujeme, jestli proměnná id neobsahuje nějakou blbost
$get_query = mysql_query("SELECT link FROM files WHERE id = '$id'");
if(mysql_num_rows($get_query) == 0){$error_code = "chyba, neplatné ID";};
// ale přesto i pokud je proměnná id platná, zkontrolujeme, jestli není podstrčená a soubor s daným číslem existuje
}else{
$error_code = "chyba, neplatné ID";
};
if(empty($error_code)){
mysql_query("UPDATE files SET downloads = downloads + 1 WHERE id = '$id'");
$get_link = mysql_fetch_array($get_query, MYSQL_ASSOC);
header("Location: {$get_link['link']}"); // funkce pro přesměrování, vysvětlena je níže
}else{
?>
<html>
<title>ERROR 404</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
<meta http-equiv="Cache-control" content="no-cache">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
</head>
<body>
<center>
<p><span style="font: normal 14px Verdana; color: red;"><?php echo $error_code; ?></span></p>
<p>[ <a xhref='javascript:void()' onclick='window.close()' style="font: normal 12px Verdana; color: black; decoration: none;">zavřít</a> ]</p>
</center>
</body>
</html>
<?php
};
?>
Na řadě je vysvětlení fce header: Tato funkce slouží k odeslání HTML hlaviček a musí být volána před jakýmkoliv výstupem do stránky, jinak nám skript vyhodí chybu a o nějakém přesměrování si můžeme nechat jenom zdát. Hodnot parametru pro fci header je mnoho (jako HTML hlaviček), nás však zajímá "Location:". To fci header říká, jakou hlavičku má poslat, tato nám zajistí přesměrování na URL za dvojtečkou. Správně by měla být uváděna absolutně, ale mám pocit, že pochopí i relativní odkazy.
Odkaz na stránce bude vypadat zhruba takhle:
<a xhref="get.php?id=29" target="_blank">nazev_souboru</a>
Kliknutím na odkaz se otevře nové okno a pokud je vše v pořádku, přičte se stažení a okamžitě potom přesměruje skript uživatele na požadovaný soubor.

