BuscaPé, líder em comparação de preços na América Latina
Desenvolvimento de sites , portais ,logomarcas e trabalhos gráficos. Downloads de Apostilas de html, , dreamweaver , flash , php , asp ,  programas, scripts asp , php , cgi , javascript , coldfusion e muitos outros

Saiba onde tem o melhor preço antes de comprar

Criando um contador de downloads com PHP e MySQL


Leituras: 21226 -



Introdução

A idéia de criar um contador de downloads surgiu quando quis medira popularidade dos scripts que disponibilizava em meu web site. Com certeza a curiosidade é o que faz evoluir qualquer programador, eu não fazia idéia sobre como começar o programa.

Precisei descobrir como o servidor web forçava o browser do usuário a abrir uma janela para salvamento de arquivo e para isso foram gastas algumas horas lendo a RFC do protocolo HTTP. Depois de descoberto esses pequenos detalhes, foi bem tranqüilo finalizar o script.

Resolvi escrever este artigo pois sei da utilidade do script e também sei como é difícil iniciar sua programação à partir do zero, sem nenhum ponto de referência.

Neste artigo não vou me aprofundar no gerenciamento do MySQL, vou partir do princípio que você é capaz de criar a tabela usada no script

.

Criação do banco de dados

Antes de iniciarmos a programação do script, vamos preparar seu ambiente de execução. O primeiro passo será o de criar o banco de dados que será acessado pelo script. Assumindo que você já esteja conectado ao shell do MySQL, vamos à seguinte seqüência de comandos:

mysql> create database phpdownload;
Query OK, 1 row affected (0.06 sec)

mysql> connect phpdownload;
Connection id: 158
Current database: phpdownload

mysql> CREATE TABLE contador (
-> arquivo VARCHAR(100) PRIMARY KEY NOT NULL,
-> hits INT DEFAULT 1
-> );
Query OK, 0 rows affected (0.12 sec)

Nas linhas acima, criamos o banco de dados phpdownload e em seguida a tabela contador, que será usada para armazenar o nome do arquivo e o número de vezes que ele foi clicado. Em seguida, vamos criar um usuário no banco de dados que será usado pelo script para se conectar ao MySQL:

mysql> GRANT ALL PRIVILEGES ON phpdownload.* TO phpdown@localhost
-> IDENTIFIED BY 'uaubaby' WITH GRANT OPTION;
Query OK, 0 rows affected (0.12 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.17 sec)

Elaborando o script

Neste exemplo, criei um diretório central onde estarão armazenados todos os arquivos disponíveis para download no site. Se quiser seguir outro padrão,basta adaptar o script que será apresentado. Sendo assim, no mesmo diretório onde será encontrado o programa download.php existe um diretório com o nome publico.

Nosso programa sempre receberá um argumento, o nome do arquivo que está dentro do diretório publico. O primeiro bloco de código vai entrar neste diretório e verificar se o arquivo solicitado existe:

<?
chdir('./publico'); // entrar no diretório público

if (!is_file($arquivo)) { // se o arquivo não é arquivo ...
echo "Erro: arquivo $file não encontrado !";
exit; // ... aborte o programa
}
?>

Agora que sabemos que o arquivo existe, vamos conectar ao banco de dados e adicionar um hit ao número de vezes que clicaram sobre o mesmo.

<?
$con = mysql_connect('localhost','phpdown','uaubaby');
mysql_select_db('phpdownload');

$consulta = "SELECT arquivo,hits FROM contador WHERE arquivo='$file'";
$res = mysql_query($consulta,$con);
/*
certificar se o arquivo já foi clicado alguma vez. Se o arquivo ainda
não consta em nossa tabela, vamos inserir um novo registro, caso contrário
vamos somar um hit ao registro existente
*/

if ($saida = mysql_fetch_array($res)) { // registro existe
$hit = ++$saida[1]; // some 1 (um) ao número de cliques
$update = "UPDATE contador SET hits=$hit WHERE arquivo='$arquivo'";
mysql_query($update,$con); // atualize o registro
} else {
$insert = "INSERT INTO contador (arquivo) VALUES ('$arquivo')";
mysql_query($insert,$con); // insira o novo arquivo na tabela. O valor padrão
// de hit é 1 (um)
}
?>


Agora que já fizemos todo o processamento necessário, vamos enviar o arquivo em forma de stream binário para o navegador do usuário:

<?
$tamanho = filesize($arquivo); // pega o tamanho do arquivo em bytes

// enviar os cabeçalhos HTTP para o browser
header("Content-Type: application/save");
header("Content-Length: $tamanho");
header("Content-Disposition: attachment; filename=$arquivo");
header("Content-Transfer-Encoding: binary");

// abrir e enviar o arquivo
$fp = fopen("$arquivo", "r");
fpassthru($fp);
fclose($fp);
?>

Viram só, um contador de download não é nenhum bicho de sete cabeças. Vamos juntar nossas partes do programa e mostrar a versão final do script:

<?
chdir('./publico'); // entrar no diretório público

if (!is_file($arquivo)) { // se o arquivo não é arquivo ...
echo "Erro: arquivo $file não encontrado !";
exit; // ... aborte o programa
}

$con = mysql_connect('localhost','phpdown','uaubaby');
mysql_select_db('phpdownload');

$consulta = "SELECT arquivo,hits FROM contador WHERE arquivo='$arquivo'";
$res = mysql_query($consulta,$con);
/*
certificar se o arquivo já foi clicado alguma vez. Se o arquivo ainda
não consta em nossa tabela, vamos inserir um novo registro, caso contrário
vamos somar um hit ao registro existente
*/

if ($saida = mysql_fetch_array($res)) { // registro existe
$hit = ++$saida[1]; // some 1 (um) ao número de cliques
$update = "UPDATE contador SET hits=$hit WHERE arquivo='$arquivo'";
mysql_query($update,$con); // atualize o registro
} else {
$insert = "INSERT INTO contador (arquivo) VALUES ('$arquivo')";
mysql_query($insert,$con); // insira o novo arquivo na tabela. O valor padrão
// de hit é 1 (um)
}
$tamanho = filesize($arquivo); // pega o tamanho do arquivo em bytes

// enviar os cabeçalhos HTTP para o browser
header("Content-Type: application/save");
header("Content-Length: $tamanho");
header("Content-Disposition: attachment; filename=$arquivo");
header("Content-Transfer-Encoding: binary");

// abrir e enviar o arquivo
$fp = fopen("$arquivo", "r");
fpassthru($fp);
fclose($fp);
?>


Para usar o mesmo, sempre que for criar um link para download, copie o arquivo para o diretório ./publico e defina a referência para./download.php?arquivo=nome_do_arquivo:

Clique aqui

Conclusão: uau, isso é mais divertido que tomar sorvete no shopping !

Atenciosamente,
Fábio Berbert de Paula
fabio@vivaolinux.com.br
Fonte:www.vivaolinux.com.br