Implementando um contador de downloads com PHP e MySQL
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:
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
http://www.vivaolinux.com.br
<?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 aqui</a>
Conclusão: uau, isso é mais divertido que tomar sorvete no shopping !
Atenciosamente,
Fábio Berbert de Paula
fabio@vivaolinux.com.br
http://www.vivaolinux.com.br
Ola meu script ficou assim
bom alterei a conexão com o DB .. apenas e os nomes de Tabela e de campos e tal .. mais ... no entanto esta td ok ...
mais ele nao ... adiciona ... ao meu banco de dados .. q foi feito mais 1 download
e nem ... faz o download
acrecentei tb ... mais headers apenas .. para garantir .. o down do tipo de arquivo q estou postando ... mais mesmo assim nao funfa nada
se alguem puder dizer em q estou errando agradeço :)
<?php
chdir('./musicas'); // entrar no diretório público
if (!is_file($arquivo)) { // se o arquivo não é arquivo ...
echo "Erro: arquivo $arquivo não encontrado !";
exit; // ... aborte o programa
}
require("conecta.php");
$consulta = "SELECT nome,down FROM musicas WHERE nome='$arquivo'";
$res = mysql_query($consulta,$conexao);
/*
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 musicas SET down=$hit WHERE nome='$arquivo'";
mysql_query($update,$con); // atualize o registro
} else {
$insert = "INSERT INTO musicas (nome) 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-Type: application/octet-stream');
header('ContentType = audio/wav');
header('ContentType = audio/mpeg3');
header('ContentType = video/mpeg');
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);
?>
bom alterei a conexão com o DB .. apenas e os nomes de Tabela e de campos e tal .. mais ... no entanto esta td ok ...
mais ele nao ... adiciona ... ao meu banco de dados .. q foi feito mais 1 download
e nem ... faz o download
acrecentei tb ... mais headers apenas .. para garantir .. o down do tipo de arquivo q estou postando ... mais mesmo assim nao funfa nada
se alguem puder dizer em q estou errando agradeço :)
19/01/2011 7:25pm
(~14 anos atrás)
O meu não deu certo ele diz q o arquivo não existe...
e está tudo certo, eu acho.
mudei apenas o diretório para "./arquivos" e naõ funcionou, vou tentar denovo do seu jeito..
e está tudo certo, eu acho.
mudei apenas o diretório para "./arquivos" e naõ funcionou, vou tentar denovo do seu jeito..
09/06/2006 5:52am
(~19 anos atrás)
Hm... Mas peraí. Se a variável arquivo tá sendo passada via GET para o script e lá ele recebe criando dinamicamente: $arquivo
Não tem uma grande falha nisso? Não seria melhor tratar a variável que vem de lá? Como por exemplo dar um explode pra saber se tem extensão. Porque a variavel ta sendo criada direto no script, nem verifica se ela vem vazia.
Mesmo sabendo que o script no inicio verifica se existe o arquivo, não seria possível burlar isto?
Ao criador, o que você faria pra implementar na hora de receber esta variavel? Ou você confia nesta forma globalzona?
Não tem uma grande falha nisso? Não seria melhor tratar a variável que vem de lá? Como por exemplo dar um explode pra saber se tem extensão. Porque a variavel ta sendo criada direto no script, nem verifica se ela vem vazia.
Mesmo sabendo que o script no inicio verifica se existe o arquivo, não seria possível burlar isto?
Ao criador, o que você faria pra implementar na hora de receber esta variavel? Ou você confia nesta forma globalzona?
20/08/2005 10:48am
(~19 anos atrás)
Como eu faço para limitar o número de registro na consulta. ex: minha tablela possui mais de 10.000 registro eu quero listar apenas os 100 registros que tiverem mais downloads e paginálos de 15 em 15, como segue abaixo.
"SELECT * FROM arquivos ORDER BY downloads DESC, nome LIMIT 0,15";
Valeu.
"SELECT * FROM arquivos ORDER BY downloads DESC, nome LIMIT 0,15";
Valeu.
01/07/2005 12:11pm
(~20 anos atrás)
Só 1 pergunta...
Como posso saber se o arquivo foi baixado com sucesso ?
Como posso saber se o arquivo foi baixado com sucesso ?
05/11/2004 5:56pm
(~20 anos atrás)
Só serve pra contar 1 arquivo que está no diretório público?
E se eu quizer fazer este sistema pra vários arquivos, tenho que fazer 1 tabela pra cada um???
E se eu quizer fazer este sistema pra vários arquivos, tenho que fazer 1 tabela pra cada um???
21/01/2004 1:53pm
(~21 anos atrás)
Beto, a resposta está um pouco atrasada, talvez você já tenha encontrado a solução. De qualquer forma o que acontece é o seguinte: os headers devem ser a primeira coisa enviada para o browser. Verifique se o seu arquivos está mandando alguma coisa antes. Quanto ao código estranho que você cita acima não é nada mais do que a imagem do arquivo .exe que você está tentando fazer o download. Se você mandar os headers corretamente ele não aparererá mais.
12/10/2003 10:36pm
(~21 anos atrás)
Em Netscape e Mozila o arquivo é salvo com extensão PHP.
Ex.:
nome do arquivo: teste.txt
nome sugerido: teste.txt.php
há como resolver?
PS: em Opera ele nem abre, o navegador simplismente exibe o conteúdo na tela
Ex.:
nome do arquivo: teste.txt
nome sugerido: teste.txt.php
há como resolver?
PS: em Opera ele nem abre, o navegador simplismente exibe o conteúdo na tela
02/05/2003 9:51am
(~22 anos atrás)
<a href='download.php?arquivo=".$linha['nome']."'><img border='0' src='img/down.png' width='20' height='20' alt='Baixar' /></a>
pois estou listando varios arquivos ai ele pega a linha pela id e da o nome do arquivo ai .. no browser ele ta postando certinho assim
<a href='download.php?arquivo=nome do arquivo.mp3'><img border='0' src='img/down.png' width='20' height='20' alt='Baixar' /></a>
tipo ta certinho n sei o q acontece. Me ajudem pleaseee.