• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

AriOps

[PHP]Contador de Visitas

36 mensagens neste tópico

É 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pá não me consigo ligar ao teu server, mas diz-me lá o erro que te dá sff.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não dá erro! Fica tudo branco :S!

EDIT

Então ninguem para explicar  :thumbdown:?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso porque é inexplicável se não se sabe o que se passa...

Se fizeste tudo o que eu disse tem de dar...

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem me parecia ;)

Cumps

Tipo eu tinha adaptado o teu código e tava a faltar uma entrada. Ele abre a extensão que eu criei .skin

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@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 :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Gurzi podes postar o código se não meteres a tag <?php ?>.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

$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);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

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

Cumps O0

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é Bem aqui está a minha versão para o Sybase ASE: ??

Sybase ASE ?

0

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