Jump to content
Rodrigo Graça

Como saber se um ficheiro foi acedido

Recommended Posts

Rodrigo Graça

Bom dia, não estou certo se esta será a melhor categoria para o que quero mas pareceume a mais próxima. Eu gostaria de saber como faço para saber se uma imagem foi acedida no meu servidor web. Ou seja meto lá uma imagem e coloco um código igual o que está abaixo numa página.

<img height="95" width="275" style="padding-top:136px;border-width:0" onload="window.lol&&lol()" id="hplogo" src="logos/classicplus.png" alt="Google">

Como eu posso contar as vezes que esta imagem foi pedida ao servidor?

Share this post


Link to post
Share on other sites
IvanGS

mete-lhes um contador...

metes um campo na BD, e a cada visualização da imagem acrescenta um lá...

ou crias uma nova tabela, com o ID da imagem como chave primária, e metes lá o valor..

Share this post


Link to post
Share on other sites
Rodrigo Graça

Sim isso eu já sabia mas antes de contar como eu vejo que a abriram para contar mais um?

O código não pode ser na página tem de ser mesmo no servidor ou algo assim que detecte quantas vezes é feito o pedido daquela imagem.

Share this post


Link to post
Share on other sites
IvanGS

na pagina onde mostras a imagem, fazes uma query a tabela, vais buscar o campo que te guarda as visualizações dessa imagem, depois e so acrescentares mais 1....

Share this post


Link to post
Share on other sites
joao.lucas.89

O pessoal aqui é uma desgraça, não sabem, e ainda por cima só falam asneira, em vez de ajudar só sabem complicar.

Bom vamos ao que interessa

<!-- begin image -->
<img src="viewimage.php?vcode=xxx">
<!-- end image-->

Php

// Página nome : viewimage.php
// Começaria por cria um header da imagem para visualizar na tag img -> Pesquise por headers de imagem no google .
header('Content-Type: image/gif'); # Gif
header('Content-Type: image/jpg'); # Jpg
header('Content-Type: image/png'); # Png
// Conectar no banco de dados para adicionar o contador como foi sugerido pelo nosso amigo Ivangs -> php.net mysql no google

$_GET = array_map('mysql_real_escape_string', $_GET); # Anti injection
$sql = mysql_connect('host','user','pass');
$qry = mysql_query('update image set views = views + 1 where id_image = '.$_GET['vcode'].'');
// Ler a imagem -> google e escreve php imagejpeg, imagepng, imagegif, há funções em php que fazem isso.

Não vou disponibilizar o código porque o certo não é dar o código e sim ajudar. Se és bom programador vais conseguir :thumbsup:

ou qq dúvida. joao.lucas.89@hotmail.com


Entrem no meu websiteQuem sabe os meus conhecimentos podem te ajudarhttp://luquinhas.com/

Share this post


Link to post
Share on other sites
brunoais

Vê o comentário q meti no código.

...
// Conectar no banco de dados para adicionar o contador como foi sugerido pelo nosso amigo Ivangs -> php.net mysql no google

$_GET = array_map('mysql_real_escape_string', $_GET); // <- Que é isto?!?!?!? Isto é um atentado à performance! Limpa só o que intessa e não tudo o q vem à tua frente! É códigos como esse que criam páginas que abusam no processamento
$sql = mysql_connect('host','user','pass');
$qry = mysql_query('update image set views = views + 1 where id_image = '.$_GET['vcode'].'');
// Ler a imagem -> google e escreve php imagejpeg, imagepng, imagegif, há funções em php que fazem isso.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Rodrigo Graça

Boas pessoal, tópico encerrado, consegui o que queria. Não conhecia estas coisas dos headers. Acavei por optar por mandar um E-mail em vez de fazer uma contagem visto que isso implicava criar uma tabela e etc assim fica mais fácil. Assim sempre que a imagem for aberta recebe-se um E-mail de aviso

Vou deixar aqui o código para quem desejar e for útil.

Já agora alguem me sabe dizer se as hospedagems free suportam a função mail do PHP?

<?php

/*
  Name: Rodrigo Graça
  Copyleft: Rodrigo Graça
  Author: Rodrigo Graça
  Date: 16-07-2011
  Description: código que envia um alerta quando certa imagem for aberta. Para utilizar este código bastas defenir as variaveis abaixo e colocar o seguinte código no sitio requerido
  <img class="aligncenter" title="lol" src="???" alt="" width="500" height="300" />
  onde se encontra "???" devem colocar o caminho para o ficheiro. Exemplo: src="http://www.site.com/ficheiro.php"
*/

// Este produto é abrangido pela versao 3 da licenca GPL.
// Se existir algum erro neste produto por favor contacte o programador
// ou visite a sua página: www.rodrigograca.com ou blog www.blog.rodrigograca.com

// ! #include <bugs.h>


$tipo = "jpg"; //definir o tipo da imagem .?
$imagem = "ro2.jpeg"; //defenir a imagem ou caminho até ela.

header("Content-type: image/".$tipo);

$ficheiro = fopen($imagem, "r") or exit("Não consegue abrir o ficheiro!");

//le o conteúdo do ficheiro até ao limite do seu tamanho
echo fread($ficheiro, filesize($imagem));


// Subject
$subject = 'a imagem foi vista';

// Message
$message = 'AVISO! A IMAGEM FOI VISTA!';

// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: X <x@hotmail.com>' . "\r\n";
$headers .= 'From: Todos <todos@todos.com>' . "\r\n";

// Mail it
mail($to, $subject, $message, $headers);


?>

Share this post


Link to post
Share on other sites
Rodrigo Graça

Esqueci-me do agradecimento a todos os que ajudaram e em especial ao @joao.lucas.89 embora o @brunoais tenha razão em relação ao uso abusivo de processamento.

Share this post


Link to post
Share on other sites
joao.lucas.89

Vê o comentário q meti no código.

...
// Conectar no banco de dados para adicionar o contador como foi sugerido pelo nosso amigo Ivangs -> php.net mysql no google

$_GET = array_map('mysql_real_escape_string', $_GET); // <- Que é isto?!?!?!? Isto é um atentado à performance! Limpa só o que intessa e não tudo o q vem à tua frente! É códigos como esse que criam páginas que abusam no processamento
$sql = mysql_connect('host','user','pass');
$qry = mysql_query('update image set views = views + 1 where id_image = '.$_GET['vcode'].'');
// Ler a imagem -> google e escreve php imagejpeg, imagepng, imagegif, há funções em php que fazem isso.

Atentado a performance ? Tens algum problema ? Achas mesmo que o computador sente isso ? Grandes servidores são capaz de passar por bilhoes e bilhoes de registos em apenas 0.000X segundos. E tu achas que mapear o array fica lento ? Aprende php primeiro.

Ah esqueci me que és daqueles poucos cultos que gostam de escrever do tipo :

$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);
// E és capaz de fazer isso centenas de vezes 
$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);
$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);
$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);

//
// Pois como nao sabes trabalhar com php, nao sabes as funções e tals

$_GET = array_map('mysql_real_escape_string', $_GET); # Bem mais prático <<<



Esqueci-me do agradecimento a todos os que ajudaram e em especial ao @joao.lucas.89 embora o @brunoais tenha razão em relação ao uso abusivo de processamento.

Uso abusivo de um processamento ?

usar o array map é o mesmo que usar array_key_exists, in_array, asort ... Omg, estes gajso devem ter problemas a sério.


acho que até o asort é + puxado q o array map, pois o asort faz comparação e ordenação enquanto q o array map apenas aplica a função destinada. olha me esta ...


Entrem no meu websiteQuem sabe os meus conhecimentos podem te ajudarhttp://luquinhas.com/

Share this post


Link to post
Share on other sites
brunoais

Atentado a performance ? Tens algum problema ? Achas mesmo que o computador sente isso ? Grandes servidores são capaz de passar por bilhoes e bilhoes de registos em apenas 0.000X segundos. E tu achas que mapear o array fica lento ? Aprende php primeiro.

Se achas que eu estou errado, prova isso com dados concretos (possivelmente calculado pelo próprio php). Se não conseguires provar, esquece, não vais conseguir passar a mensagem.

Pensa que são enviados 100 variáveis em GET. Tu só precisas de 2. Achas q vais limpar tudo?

Já agora, porque é que achas q eles têm q fazer os servidores tão poderosos? Uma das razões é pq existem programas q usam essas metodologias que abusam dos servidores. O problema não é 1 script. O problema é 1300+ scripts num único servidor.

Ah esqueci me que és daqueles poucos cultos que gostam de escrever do tipo :

$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);
// E és capaz de fazer isso centenas de vezes 
$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);
$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);
$_GET['id'] = mysql_real_escape_string($_GET['id']);
$_GET['name'] = mysql_real_escape_string($_GET['name']);

//
// Pois como nao sabes trabalhar com php, nao sabes as funções e tals

$_GET = array_map('mysql_real_escape_string', $_GET); # Bem mais prático <<<


Na realidade não sou desses. Eu uso maneiras muito melhores. Para mim o mysql_real_escape_string() não pode ser usado mais que 1x para cada key num array do input e só deve ser usado em dados que têm que ser tratados como texto (string).

Por exemplo: Se $_GET['id'] for supostamente um id (como eu gosto), ou seja, um número identificador, o filtro é feito assim: (int)$_GET['id']. Assim este passa a ser um número e nunca poderá ser algo que irá injetar código na DB. Ao contrário do mysql_real_escape_string() o cast para int é 100% seguro e bem previsível.


Uso abusivo de um processamento ?

usar o array map é o mesmo que usar array_key_exists, in_array, asort ... Omg, estes gajso devem ter problemas a sério.

Eu nunca uso o array_key_exists(). Para mim, ele não tem utilidade isset() resolve isso por mim. Há q notar q existem, realmente, situações que que essa função é útil mas não para mim.

in_array(): Nunca usei, mas pode haver usos para isso.

asort(): Uso para o accept-language e qd preciso de ordenar um array por alguma razão.

Seria melhor se afirmasses de q problemas te referes.


acho que até o asort é + puxado q o array map, pois o asort faz comparação e ordenação enquanto q o array map apenas aplica a função destinada. olha me esta ...

Concordo. o asort é, se n me engano, O(nlog(n)) e array_map() é O(n).


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
taviroquai

Se não me engano... se o servidor for apache tens lá nos logs o acesso à imagem. Não precisas de php para nada... só para ler o ficheiro de logs...

Share this post


Link to post
Share on other sites
joao.lucas.89

Bom, não discuto mais, nao vale a pena perder tempo, o importante é ajudar o pessoal :)

print microtime().'<br>';

for($i=0;$i<=1300;$i++) {
    
    $_GET[] = 'iu1jfi1nfi1nfi1';
    
}

print microtime().'<br>';

$_GET = array_map('mysql_real_escape_string', $_GET);

print microtime().'<br>';

Output :

0.94581900 1310817845
0.94659500 1310817845
0.95389400 1310817845

Ui que diferença.  :cheesygrin: , isso que são milisegundos. Ao fazer isso até o meu processador QUEIMOU  :nono:


Entrem no meu websiteQuem sabe os meus conhecimentos podem te ajudarhttp://luquinhas.com/

Share this post


Link to post
Share on other sites
taviroquai

Fica engraçado mandar 1 email sempre que o ficheiro php é pedido... o que acontece se o utilizador fizer refresh 20 ou mais vezes? 20 emails???  :)

Share this post


Link to post
Share on other sites
IvanGS

@joao.lucas.89...

LOL

sabes que 99.999999% das pessoas alojam em servidores partilhados, se forem todos a pensar como tu os servidores ficam entupidos !, depois não e só o problema do processamento, é o tempo da script...

Share this post


Link to post
Share on other sites
IvanGS

pronto... aí...

é preciso ter cuidado com a performance das script's...

se poderes evitar exagerar de processamento e bom, deixa o site mais rápido...

a ideia do joao.lucas.69 é boa, nao disse o contrario...

Share this post


Link to post
Share on other sites
brunoais

O básico da limpeza de input é este e com estas prioridades:

Se for um número inteiro ou um float em que o 0 nunca acontece (como um id automático na DB), usa o cast para int.

Se for algo que irá passar por um hashing ou algo que, por defeito, altera toda a string como o md5(), sha1(), etc... Basta passar por essas funções e a string é segura para meter na base de dados.

Se for um número inteiro e há restrições em relação ao input, deve-se usar: filter_var() com o filtro para int ou float e opções apropriadas.

Se for um e-mail ou um IP ou um url usa o filter_var()

Se for uma simples string (ou até dados como uma imagem) ou se o filter_var() não existir na versão do PHP, usa uma filtragem melhor como o mysql_real_escape_string() ou um binding q seja seguro.

Nota: Executar o cast para int ou float é mais seguro que o mysql_real_escape_string(), na realidade, o output do cast para int ou para float é 100% seguro, ao contrário do mysql_real_escape_string() que não é 100% seguro. Mais! O cast é muito mais rápido que o mysql_real_escape_string(). O cast é bom mas é muito limitado, por isso, sempre que possível, deve-se usar o cast, e, quando não é possível, deve-se usar o filter_var() quando o cast não é apropriado e usar o mysql_real_escape_string() quando o filter_var() não é apropriado.

Isto é o mais importante para criar código que funcione com o equilíbrio aceitável entre o tempo de processamento do código e a dificuldade em fazer e manter o código. Há mais dicas para acelerar o código na parte do teste de inputs (o $_GET e o $_POST) mas isto chega para um bom equilíbrio.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
joao.lucas.89

@joao.lucas.89...

LOL

sabes que 99.999999% das pessoas alojam em servidores partilhados, se forem todos a pensar como tu os servidores ficam entupidos !, depois não e só o problema do processamento, é o tempo da script...

Vou ignorar isso, o gajo apenas queria uma cena, eu apenas dei 1 exemplo, e mapear 1 array, não é assim tão demorado... Não vamos discutir mais isso.


Entrem no meu websiteQuem sabe os meus conhecimentos podem te ajudarhttp://luquinhas.com/

Share this post


Link to post
Share on other sites
ribeiro55

Boas pessoal, tópico encerrado, consegui o que queria.

Sugestões dadas, pontos explicados e sinal de "tópico encerrado" fazem a matéria desta quote para a frente "off-topic".

Para questões de performance, abram por favor uma nova thread.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.