Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá, amigos!
Adaptei esse script contador de visitas para links de site. Limita a contagem a 1 a cada 24h por link. Ou deveria funcionar nos diversos links. Ocorre que, ao acessar o primeiro link, ele cria um cookie e o visitante pode passar o restante das 24h acessando outros links (notícias) que não conta visita.
Preciso modificar para que o cookie só impeça nova leitura no mesmo id. Nos demais não pode haver restrição alguma. Alguém pode me dar uma luz?
Obrigado, desde já.
<?php
require("config.php");
$id = intval($_GET['id']);
$sql = mysql_query("SELECT visitas, id FROM yt WHERE id = '$id'");
while($linha = mysql_fetch_array($sql)){
$visitas = $linha['visitas'];
}
if(!isset($_COOKIE['contador'])){
$contador_visitas = "contador_visitas";
setcookie("contador", $contador_visitas, time()+(24*3600));
$somar = $visitas + 1;
$sql = mysql_query("UPDATE yt SET visitas = '$somar' WHERE id = '$id'");
}elseif(isset($_COOKIE['contador'])){
//Teste de contagem referente a um determinado id.
echo "Existem ate agora $visitas neste link";
}
?>A dúvida é a seguinte: o script conta +1 leitura, quando o visitante acessa uma notícia. Ok. Mas, se o visitante visita outra notícia, aí não conta +1 nessa outra notícia. O cookie bloqueia a contagem +1 em todos as notícias. O certo é ele impedir nova contagem, dentro das 24h, numa mesma notícia. É para evitar que o visitante fique dando F5, por exemplo. Vou testar o script modificado por vc, Matheus. Obrigado. Já dou retorno.
Matheus, continua com o mesmo problema: se eu acessar dois links, ele conta +1 visita no primeiro e não conta no segundo, devido ao cookie.
Só utilizar SESSION ou fazer verificação por IP correspondente ao ID da notícia.
Como session ficaria mais ou menos assim o algoritmo, a cada visualização de notícia, você vai verificar se existe o determinado ID da notícia na sessão, se não existir, você atualiza as visualizações no banco, e adiciona o ID na sessão, quando o cara atualizar, já não vai contar novamente.
Acho que é por ai.
Ahhh, você quer bloquear por notícia.
Então armazene o ID da notícia dentro de um array na chave do cookie.
Depois basta verificar se existe o ID da notícia, conforme o código que já lhe passei.
Você vai precisar da função array_search e do WHERE (mysql), basicamente.
Sim, Matheus. É isso que estou tentando fazer: armazenar o id da notícia, mas meu conhecimento de PHP ainda é limitado - e não está dando certo.
Por session, Andrey, também seria bom. Mas, por IP, não, porque, no caso de uma rede, só contaria um acesso.
>
Ahhh, você quer bloquear por notícia.
Então armazene o ID da notícia dentro de um array na chave do cookie.
Depois basta verificar se existe o ID da notícia, conforme o código que já lhe passei.
Você vai precisar da função array_search e do WHERE (mysql), basicamente.
Consegui fazer funcionar o script com cookie. Agora, ele permite uma visita por notícia (id) a cada 24h. Testei reduzindo esse tempo para 30 segundos. Nesse período, acessei 3 notícias diferentes, contando 1 acessos em cada uma. Segui a lógica de armazenar o id. Abaixo, o código funcionando:
<?php
require( 'config.php' );
$id = &$_GET[ 'id' ];
$contador = &$_COOKIE[ 'contador_'.$id.'' ];
if ( !$contador ) {
$sql = mysql_query( 'UPDATE `yt` SET `visitas` = `visitas` + 1 WHERE `id` = ' . (int)$id );
setcookie( 'contador_'.$id.'', true, time() + ( 30 ) );
}
$sql = mysql_query("SELECT visitas, id FROM yt WHERE id = '$id'");
while($linha = mysql_fetch_array($sql)){
$visitas = $linha['visitas'];
}
echo "até agora neste id há $visitas";
?>Ai vai ficar pesado
Faz serialização de um array com os ID's, ai depois desmonta e verifica se determinado ID está nele.
Não entendi muito bem qual é exatamente a dúvida, mas aprimorei seu código. Teste e diga se era isso que você precisava:
Qualquer dúvida, poste.[]'s