Ir para conteúdo

Posts Recomendados

Implementando um contador de downloads com PHP e MySQL



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

 

Foi descoberto 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 [ disponível em http://www.ietf.org/rfc/rfc2616.txt ]. Depois de descoberto esses pequenos detalhes, foi bem tranquilo finalizar o script.

 

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

 

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 sequê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)

 

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 de 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:

 

php

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.

 

php

$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:

 

php

$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:

 

php

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:

 

<a href="download.php?arquivo=caderninho.zip">Clique aquia>

 

Créditos: Fábio Berbert de Paula

Organização, ortográfia: Rubinho

Link para o comentário
https://xtibia.com/forum/topic/120628-implementando-um-contador-de-downloads-com-php-e-mysql/
Compartilhar em outros sites

×
×
  • Criar Novo...