PHP
Você está aqui: Home » PHP » Criando um contador de downloads com PHP e MySQL
Criando um contador de downloads com PHP e MySQL

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:
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
Outros artigos postados por este autor
- Passe as variaveis por valor sem ByVal
- Como aparecer no Google.
- Action Script 2.0 ( Primeira Parte )
- Buscas na internet sem mistério
- Ajax e SEO
- Cloud computing para todos
Artigos relacionados sobre PHP
- Abreviando um texto sem cortar palavras no PHP
- Criando um sistema de cache no PHP
- Encurtando URLs com o Bitly-PHP
- Criando um contador de downloads com PHP e MySQL
- Criando gráficos com a classe JPGraph (parte 1)
- Encurtando URLs no PHP utilizando a API do goo.gl
Parceiros
BR-Linux.org
Criar WEB
Regularização de Imoveis SP
Montagens de Sites
Templates de Sites
Desenvolvedor de Sites
Elaboração de Sites
Produção de Sites
Programador de Sites
Criadores de Sites
Artigos mais acessados
Desenho de Letras - Construindo fontes TTF
Criando um sistema de login
Enviando email em formato HTML em PHP
Menu Circular em 3D
Cargos e salários na área de informática
Como fazer e modificar calendários
Action Script 2.0 ( Primeira Parte )
10 dicas de Webdesign para salvar seu site
Fireworks VS Photoshop
Serviços
Desenvolvimento de Sites e Sistemas WEB
Otimização de Sites (SEO)
Loja Virtual com Sistema Pagseguro
Sistema de Compra Coletiva
Catálogo de Produtos
Parcerias e Soluções de Publicidade
Portifólio Grupo SOS Designers
Fale Conosco







