Ir para o conteúdo
AriOps

[PHP]Contador de Visitas

Mensagens Recomendadas

AriOps    0
AriOps

É necessário ter um ficheiro contador.txt na mesma pasta, de inicio com um 0.

/*********************************************
CONTADOR :: Desenvolvido por Daniel Correia
*********************************************/
$ficheiro = "contador.txt";
$abrir = fopen($ficheiro, 'r+') or die("O Ficheiro não pode ser aberto.");
$contador = fread($abrir, filesize($ficheiro));
$intcontador = (int) $contador;
$intcontador++;
rewind($abrir);
fwrite($abrir, $intcontador);
fclose($abrir);
print $intcontador;

Em Acção: http://www.ptattacks.com/contador_visitas

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AriOps    0
AriOps

não te esqueças de por lá o ficheiro contador.txt e a a tag PHP (<?php ?>) no código acima.

Como podes ver funciona, deixei aí o link.

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

Este código tem um problema grave .....

Imaginem que tem dois utilizadores a acessar ao mesmo site .

Seria algo do género :

#Processo 1

1- Abre o Ficheiro contendo o valor

#Processo 2

1- Abre o Ficheiro contendo o valor

#Processo 1

2- Lê o ficheiro contendo o valor

#Processo 2

2-Lê o ficheiro contendo o valor

#Processo 1

3-Incrementa o Valor

#Processo 2

3-Incrementa o Valor..

Ora como vocês vem.. no processo 2 o ficheiro é lido primeiro que o processo 1 faça as alterações... logo em 2 visitas o contador só vai gravar 1...

Para resolver esta situação deve ser usado um acesso exclusivo ao ficheiro através da função flock

flock(filehandle,operation);

Podem ver mais através de http://php.telepac.pt/manual/pt_BR/function.flock.php

Cumps, Gurzi :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
kingless    0
kingless

Ora como vocês vem.. no processo 2 o ficheiro é lido primeiro que o processo 1 faça as alterações... logo em 2 visitas o contador só vai gravar 1...

O contador não vai gravar só 1..... 1º porque ele incrementa logo que uma pessoa entra site, 2º é quase impossivel alguém entrar ao mesmo tempo que outra pessoa.

Contador visitas

          1

Pessoa entra no site -> Contador de Visitas

                                                    2

Outra pessoa entra -> Contador de Visitas

                                                    3

Não sei se me fiz entender...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

@kingless - se tu tiveres uma perspectiva grande em vez de sites a brincar para os teus amigos, vai chegar uma altura em que vais ter muita gente a entrar no site ao mesmo tempo, imagina o www.google.com, achas que nunca ninguem entrou ao mesmo tempo ? ...

Ora... Se tu perceberes bem isto, a verdade é que o 2º utilizador vai ler o ficheiro primeiro que o outro escreva  a sua presença logo em duas visitas só é registada uma...

Para isso se usa o flock que dá um acesso exclusivo ao ficheiro, é bom porque enquanto o processo de escrita não for completado o outro não acede ao ficheiro, mas como isto se faz em 0,00000000000000000001 milésimas de segundo ninguem nota que está à espera.

------------------------------------------------------------------------------

eis o código correcto

------------------------------------------------------------------------------

$filename = "contador.txt";
$file = @fopen($filename, "r+")
OR die("Failed to open the file");
@flock($file, LOCK_EX)
OR die("Could not lock the file");
$s = fgets($file,6);
$count = (int) $s;
$count += 1;
rewind($file);
if(@fwrite($file,$count)== -1)
die("Failed to write to file");
echo $count;
@flock($file,LOCK_UN)
OR die("Could not unlock the file");
@fclose($file);

UM abraço, Gurzi :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
kingless    0
kingless

@kingless - se tu tiveres uma perspectiva grande em vez de sites a brincar para os teus amigos, vai chegar uma altura em que vais ter muita gente a entrar no site ao mesmo tempo, imagina o www.google.com, achas que nunca ninguem entrou ao mesmo tempo ? ...

Ora... Se tu perceberes bem isto, a verdade é que o 2º utilizador vai ler o ficheiro primeiro que o outro escreva  a sua presença logo em duas visitas só é registada uma...

Para isso se usa o flock que dá um acesso exclusivo ao ficheiro, é bom porque enquanto o processo de escrita não for completado o outro não acede ao ficheiro, mas como isto se faz em 0,00000000000000000001 milésimas de segundo ninguem nota que está à espera.

vou deixar o código correcto em anexo porque o Fórum tem umas medidas de segurança um pouco weird, estando a não permitir a inserção do meu código.

UM abraço, Gurzi :)

Só se utiliza um contador de visitas em .txt em sites que entram poucas pessoas.... Agora em sites grandes como google, hotmail... tem que se criar um contador com  base de dados mysql ou outra qualquer. 

E não é aconselhado utilizar-se esse contador de visitas porque ele conta mesmo que se faça apenas refresh a página.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

Sim, mas este tópico refere-se á existência do método file , só disse que para 2 visitantes ao mesmo tempo não é concreto e real, para grandes sites usa-se o suporte a sql, óbvio

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AriOps    0
AriOps

Bem como estavam a falar em contadores por SQL, resolvi fazer este pequeno script assim muito rapidamente. qualque coisa que acham que deva mudar digam.

$server = "localhost";
$bd = "contador";
$tabela = "visitas";
$user = "root";
$pass = "";

$ligar = mysql_connect("$server", "$user", "$pass");
mysql_select_db($bd);
$sql = "SELECT * FROM $tabela ORDER BY ID DESC LIMIT 0 , 1";
$query = mysql_query($sql) or die(mysql_error());
$fetch_query = mysql_fetch_assoc($query);

$visita_actual = $fetch_query{'ID'} + 1;
$data = date("Y-m-d") ." ". date("H:i:s");
$ip = $_SERVER['REMOTE_ADDR'];
$sql_inserir = "INSERT INTO $tabela (`IP`,`Data`) VALUES ('$ip', '$data')";
mysql_query($sql_inserir) or die(mysql_error());
echo $visita_actual;

Criar tabela:

CREATE TABLE `visitas` (
  `ID` int(11) NOT NULL auto_increment,
  `IP` varchar(20) NOT NULL,
  `Data` datetime NOT NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Este é para mysql, daqui a bocado deixo um para o Sybase ASE :)

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
karva    0
karva

$data = date("Y-m-d") ." ". date("H:i:s");

aqui eu acho que punha a funcao time, que devolve a data e hora em segundos, tudo numa, e dps pra ver usava a funcao date()

// $date_auto, e a data em segundos, dps de tirada da base de dados
$show_date = date ("H:i:s m/d/Y", $date_auto);

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AriOps    0
AriOps

Bem aqui está a minha versão para o Sybase ASE:

<?php
$server = "dcserver";
$bd = "contador";
$tabela = "visitas";
$user = "sa";
$pass = "";

$ligar = sybase_connect("$server", "$user", "$pass");
sybase_select_db($bd, $ligar);
$sql = "SELECT * FROM $tabela ORDER BY ID DESC SET ROWCOUNT 1";
$query = sybase_query($sql);
$fetch_query = sybase_fetch_assoc($query);

$visita_actual = $fetch_query{'ID'} + 1;
$data = date("Y-m-d") ." ". date("H:i:s");
$ip = $_SERVER['REMOTE_ADDR'];
$sql_inserir = "INSERT INTO $tabela (IP,Date) VALUES ('$ip', '$data')";
sybase_query($sql_inserir);
echo $visita_actual;
?>

Criação da BD e da tabela, mudar o device conforme as necessidades

<?php
/***********
Criar BD e tabela
*********************/
$ligar = sybase_connect("dcserver", "sa", "");
sybase_query("USE master CREATE DATABASE contador ON principal = 3", $ligar) or die("erro1");
$sql2 = "USE contador
	CREATE TABLE dbo.visitas (    		
	ID	      numeric(38,0) IDENTITY,
	IP 	      varchar(20)   NOT NULL,
	Date      datetime      NOT NULL,
	)";
sybase_query($sql2, $ligar) or die("erro2");
echo "Criados com sucesso";
?>

karva vou ver se faço isso :)

Cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
AriOps    0
AriOps

Com base na sugestão do karva:

MySQL:

<?php
$server = "localhost";
$bd = "contador";
$tabela = "visitas";
$user = "root";
$pass = "";

$ligar = mysql_connect("$server", "$user", "$pass");
mysql_select_db($bd);
$sql = "SELECT * FROM $tabela ORDER BY ID DESC LIMIT 0 , 1";
$query = mysql_query($sql) or die(mysql_error());
$fetch_query = mysql_fetch_assoc($query);

$visita_actual = $fetch_query{'ID'} + 1;
$data_seg = time();
$data = date ("Y/m/d H:i:s", $data_seg);
$ip = $_SERVER['REMOTE_ADDR'];
$sql_inserir = "INSERT INTO $tabela (`IP`,`Data`) VALUES ('$ip', '$data')";
mysql_query($sql_inserir) or die(mysql_error());
echo $visita_actual;
?>

Sybase ASE:

<?php
$server = "dcserver";
$bd = "contador";
$tabela = "visitas";
$user = "sa";
$pass = "";

$ligar = sybase_connect("$server", "$user", "$pass");
sybase_select_db($bd, $ligar);
$sql = "SELECT * FROM $tabela ORDER BY ID DESC SET ROWCOUNT 1";
$query = sybase_query($sql);
$fetch_query = sybase_fetch_assoc($query);

$visita_actual = $fetch_query{'ID'} + 1;
$data_seg = time();
$data = date ("Y/m/d H:i:s", $data_seg);
$ip = $_SERVER['REMOTE_ADDR'];
$sql_inserir = "INSERT INTO $tabela (IP,Date) VALUES ('$ip', '$data')";
sybase_query($sql_inserir);
echo $visita_actual;
?>

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
kingless    0
kingless

cookies são facilmente manipuláveis...:D

mas se quiseres dar um exemplo, força :)

Cumps O0

Não vejo nenhum mal em manipular as cookies quem quiser manipular que manipule não vai ganhar nada com isso... Quanto ao exemplo não vou dar quero ver o teu trabalho :)

EDIT: Acho que utilizar cookies é quase a mesma coisa que fazer isso ($ip = $_SERVER['REMOTE_ADDR'];  $sql_inserir = "INSERT INTO $tabela (`IP`,`Data`) VALUES ('$ip', '$data')") por isso acho que não é preciso utilizar cookies neste caso...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade