Implementando um contador de downloads com PHP e MySQL
A idéia 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 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 [ disponível em http://www.ietf.org/rfc/rfc2616.txt ]. Depois de descoberto esses pequenos detalhes, foi bem tranquilo 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.
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 [ disponível em http://www.ietf.org/rfc/rfc2616.txt ]. Depois de descoberto esses pequenos detalhes, foi bem tranquilo 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.
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
(~18 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
(~19 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
(~21 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.