bgcko.gif, 0 kB
Počítadlo stažení - Počítadlo stažení souborů za pomocí MySQL

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_queryMYSQL_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.

Komentáře a hlasování
Options:      B | I | U | IMG | Code | Link | FAQ



Rate: 5-Best | 0-Wrost






 
 
#1 | qip | 14/04/07 | 03:21:00| Site
pekny tut a hlavne uzitocny ... 5/5