Ir ao conteúdo
  • Cadastre-se

Limitar numero de acessos a uma pagina


Posts recomendados

Boa noite amigos do Fórum, estive ausente durante muito tempo, enfim, gostaria de pedir a ajuda de vocês nesse código, acredito que muito simples, mas eu não tenho tanto conhecimento na área.

O principal objetivo do código sera limitar o numero de vezes que um usuário acessa uma pagina.

Segue o código:

<?php
include("Connections/conexao.php"); 
//Vamos supor que a pagina tem o nome "paginaExemplo" 
$limiteVisitas = 5; 
# SQL PARA PUXAR OS DADOS DO BD 
$seleciona=mysql_query("Select * from usuarios where idusu=4");
$usuario=@mysql_fetch_array($seleciona);
//Converter o valor do bd em array
$arrayVisitas=unserialize($usuario['vacessos']);
// isso é o mesmo que pegar o proprio valor e somar +1
if($arrayVisitas['vacessos'] < $limiteVisitas){
$arrayVisitas['vacessos']++;
$vacessos = serialize($arrayVisitas);
# SQL PARA ATUALIZAR O BD 
$seleciona2=mysql_query("update usuarios set vacessos='$vacessos' where idusu=4");
  echo "É a sua ".$arrayVisitas['vacessos']." visita";
}else {
  echo "Você estourou o limite de visitas";
}
?>

 

Link para o comentário
Compartilhar em outros sites

@DiF Gostaria de saber o que falta no código para que dê certo, a principio ele mostra o "É a sua 1 visita", mas se eu atualizar a pagina a contagem não aumenta, nem sequer são inseridos os dados no banco pra contagem de vezes que a pagina foi acessada.

Antes que pergunte, não fiz nenhuma sessão para identificar o login, mas acredito que ali no where usuid=4 não precisaria de uma sessão, já que o usuário já esta sendo identificado pelo idusu

Link para o comentário
Compartilhar em outros sites

  • Moderador

@TIzeiro Olá.

 

Então,  não sei por que razão você fez desta forma sem um "login com sessão". Geralmente não é informando direto o usuário.  Alí é onde entra a sessão. Bom, de qualquer forma fazer a contagem não é preciso da sessão mesmo.

Tem duas funções ali que eu não costumo usar e o plugin mysql já é defasado,  deve trocar para mysqli.

 

Basicamente eu faria deste jeito:

<?php
include "Connections/conexao.php"; 

$confereLimite = mysqli_query($conexao ,"Select vacessos from usuarios where idusu = 4");

//Põe os dados em um objeto
$usuario = mysqli_fetch_object($confereLimite);
  
 $qtdAcessos = $usuario->vacessos;

if($qtdAcessos < 5):

   //Incrementa a quantidade. é a mesma coisa que $qtdAcessos = $qtdAcessos + 1
   $qtdAcessos++;
 
   $atualiza = mysqli_query($conexao ,"UPDATE usuarios SET vacessos = $qtdAcessos where idusu = 4");
  
   //Confere se o SQL de atualização foi realizado
   if($atualiza): 
      echo "É a sua $qtdAcessos visita"; 
   endif; 
  
else:
   echo "Você estourou o limite de visitas";
endif;
?>

O código diz que:
Primeiro incluímos a conexão. Depois armazenamos a consulta ao campo que vai usar. Evite de usar o " * " porque é só o campo Vacessos que você quer trabalhar.

Cria-se uma variável para armazenar em um objeto o resultado da consulta. Nesse caso é só o valor do campo vacessos. Presume-se que este campo por natureza ele seja zerado, não nulo, mas zerado mesmo com o valor em zero para que possa haver um incremento.
Ainda sobre o campo, o TIPO dele DEVE obrigatoriamente ser INT. É possível que você tenha definido para varchar. Se for isso, troque para tipo INT tamanho 1.

Com o campo do tipo numérico você pode fazer o autoincremento.
que o $qtdAcessos++

Contnuando a explicação do código, a variável $qtdAcessos armazena o valor do campo vacessos.  $usuario->vacessos

Com o valor em mãos, testamos em uma condição IF onde SE ele for menor que 5(o limite) adiciona-se + 1 ao valor de $qtdAcessos.

Depois disso, a variável $atualiza recebe a query de UPDATE para justamente atualizar o valor do campo vacessos no banco.
Perceba que não foi usado aspas no SET vacessos = $qtdAcessos justamente porque o campo PRECISA ser numérico e apas usamos apenas quando estamos passando uma String.

Após testamos a atualização com um IF, SE executou o UPDATE, mostra em tela a quantidade de acessos.
Um IF não necessariamente precisa ter um ELSE!

E por fim, o bloco do ELSE do primeiro IF na qual você testa a quantidade de acessos, SE for maior do que 5, mostra a mensagem de estourou o limite.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Moderador

@TIzeiro A princípio o erro diz que a função mysqli_query() espera dois parâmetros.  No caso a sintaxe é 

 

mysqli_query(variável da conexão, "Consula SQL")

 

o que pode estar havendo aí, é algo que você possa ter esquecido. Como está o código de conexão contido em  conexao.php?

 

Não sei se pode ser um erro de configuração no Vertrigo.. particularmente não uso este programa..  Uso e recomendo usar o EasyPHP, por ser mais amigável tanto nas configurações quanto no manuseio dele.

 

Mas a questão do erro é isso..  pode ter esquecido de algo, a variável pode estar errada.. e etc.. poste aqui do jeito que você deixou o código. Tanto o conexao.php   e o  edm.php

Link para o comentário
Compartilhar em outros sites

@DiF

edm.php

<?php
include "Connections/conexao.php"; 

$confereLimite = mysqli_query($conexao ,"Select vacessos from usuarios where idusu = 4");

//Põe os dados em um objeto
$usuario = mysqli_fetch_object($confereLimite);
  
 $qtdAcessos = $usuario->vacessos;

if($qtdAcessos < 5):

   //Incrementa a quantidade. é a mesma coisa que $qtdAcessos = $qtdAcessos + 1
   $qtdAcessos++;
 
   $atualiza = mysqli_query($conexao ,"UPDATE usuarios SET vacessos = $qtdAcessos where idusu = 4");
  
   //Confere se o SQL de atualização foi realizado
   if($atualiza): 
      echo "É a sua $qtdAcessos visita"; 
   endif; 
  
else:
   echo "Você estourou o limite de visitas";
endif;
?>

conexao.php

<?php
error_reporting (E_ALL & ~ E_NOTICE & ~ E_DEPRECATED);
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_conexao = "localhost";
$database_conexao = "edm";
$username_conexao = "root";
$password_conexao = "vertrigo";
$conexao = mysql_pconnect($hostname_conexao, $username_conexao, $password_conexao) or trigger_error(mysql_error(),E_USER_ERROR); 
?>

 

Link para o comentário
Compartilhar em outros sites

  • Moderador

@TIzeiro O erro praticamente está na sua conexão com banco de dados. Porque agora você está usando o mysqli e não mais o mysql antigo.

 

Passe a usar esta sintaxe para a conexão:

<?php
    $conexao = mysqli_connect("localhost", "root", "vertrigo","edm");
?>

Esta é a sintaxe do novo plugin mysqli que é altamente recomendado.

mysqli_connect(host, usuário, senha,  nome do banco de dados)

 

Não use o error_reporting() pois ele só mascara os erros dificultado entender o que deu de errado.

Link para o comentário
Compartilhar em outros sites

@DiF Tudo funcionando, uma ultima pergunta, irei utilizar esse codigo em diversas paginas, vamos supor:

aula1.php

aula2.php

aula3.php

Todas com limite de 5 acessos, teria que usar array pra diferenciar uma pagina da outra ? Porque fica totalmente fora de possibilidade criar campos no bd que se refiram as paginas, seria melhor trabalhar com Arrays, certo ?

Porque caso alguem acesse por exemplo a pagina aula1.php, consequentemente afetaria o limite das outras paginas.

Link para o comentário
Compartilhar em outros sites

  • Moderador

@TIzeiro Não.  

Na verdade, aí muda um pouco a estrutura da sua tabela pois não se tem controle de páginas  a não ser que coloque a tal verificação em cada página.. isso torna-se inviável. 

 

Para fazer esse controle de forma eficiente, precisas ter apenas uma página chamada  aulas.php

e nesta página você traz as informações da aula e o seu conteúdo do banco de dados.

 

Teria que retirar o Vacessos da tabela usuários e  colocar na tabela que armazena as informações de cada aula em uma relação de N:N 

 

isto já vira uma questão de modelagem de banco de dados.

 

Por exemplo:

 

Vamos supor que você tenha uma tabela chamada "aulas" e nesta tabela, você campos para título, e outras coisas.

Você tem a tabela usuarios.

No caso é criado uma terceira tabela que age de intermédio entre estas duas, este relacionamento chamamos de N:N, ou seja, muitos para muitos.

 

Esta tabela ficará responsável por controlar os acessos de cada usuário por cada aula de forma independente.

Veja esta imagem no anexo.  Quem controla os acessos será a terceira tabela  de N:N.

Nesta tabela veja que o ID é um campo auto incrementado,  o campo ID_usuario fica responsável por identificar quem é o usuário, o campo ID_aula fica responsável para identificar qual a aula que foi vista e o campo vacessos armazena a quantidade de vezes que esta pessoa viu.

 

Obviamente, para que isso dê certo é preciso fazer os relacionamentos corretamente, ter índices na tabela que informam os campos relacionados.

 

É basicamente isso.  Vai ter que mudar a estrutura da suas tabelas e fazer estes relacionamentos se quiser fazer uma verificação de visualização independente porque senão seria como você disse.. afetaria outras coisas.

 

modelagem_tabelas.png

 

Para complementar a explicação, a alguns anos eu gravei uma explicação de como fazer relacionamentos no phpmyadmin

 

Só não tem audio... mas está bem explicado via texto.

 

PS: Fazendo desta forma,  você precisará usar o INNER JOIN  para fazer as consultas baseadas em relacionamentos.

Desculpe se ficou meio massivo o post mas não teria como explicar de forma mais simples.

 

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Moderador

@TIzeiro Sim posso!

 

A cláusula INNER JOIN é usada para relacionar tabelas em uma consulta.

Vamos supor que o banco de dados constitui-se das tabelas:

 

receitas(ID auto increment, nome, ID_ingrediente, ID_chef, modoPreparo, data)

ingredientes(ID auto increment, nome)

chef(ID auto increment, nome)

 

Agora com estas 3 tabelas devidamente populadas, queremos abstrair os seguintes dados:

Nome da receita, o modo de preparo, os ingredientes utilizados por ela, o nome do chef que criou a receita e a data de quando a receita foi cadastrada no banco de dados.  Como fazemos?

 

O primeiro passo é pensar na lógica: Qual destas 3 tabelas será a principal? A tabela de receitas. Por que? Porque é nela que se encontram os ID dos ingredientes e do chef. 

 

Agora como eu faço isso? A consulta será extensa e precisa ter atenção por isso vou fazer de forma completa sem abreviar nada para você entender!  Tá mas antes,  como é a forma completa sem abreviação?

 

Simples,  "tabela.campo"

SELECT receitas.nome, 
              receitas.modoPreparo, 
              receitas.data
              ingredientes.nome,
              chef.nome  
FROM receitas
INNER JOIN ingredientes ON ingredientes.ID = receitas.ID_ingredientes
INNER JOIN chef ON chef.ID = receitas.ID_chef

 

Veja os dois INNER JOIN.  Definem qual tabela e campo chave primária está relacionado com  qual tabela e campo chave estrangeira.

 

No caso, a tabela ingredientes é a tabela, ID dela é a chave primária é relacionada com a tabela receitas, onde o campo ID_ingrediente é a sua chave estrangeira. A mesma coisa com a tabela chef.

 

Com isso  teríamos o seguinte resultado:

Citação

 

Bolo de chocolate

Misture farinha de trigo, leite, ovos fermento químico e chocolate em pó

Asse por 45 minutos em fogo médio

2016-10-23

Farinha de trigo, Leite, dois ovos, Fermento químico, Chocolate em pó

Chef Bolinho Nervoso

 

 

No exemplo acima, a consulta retornaria todos os dados de todos os chefs e receitas. Mas como faria para retornar por exemplo a receita de ID 4 e mostrar somente ela  e os dados dela?

 

No final da consulta é só adicionar a clausula WHERE ID = 4 !

Ficando assim:

SELECT receitas.nome, 
              receitas.modoPreparo, 
              receitas.data
              ingredientes.nome,
              chef.nome  
FROM receitas
INNER JOIN ingredientes ON ingredientes.ID = receitas.ID_ingredientes
INNER JOIN chef ON chef.ID = receitas.ID_chef
WHERE  ID = 4

Aí no PHP, você substitui o valor 4, por uma variável contendo o ID desejado. 

Acho que essa é a melhor explicação que posso dar no momento.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@DiF Segue imagem dos erros, código e relacionamentos:

Sem título.pngSem título.png

edm.php

<?php
include "Connections/conexao.php"; 

$confereLimite = mysqli_query($conecta, "SELECT usuario_ve_aulas.vacesso,
              usuarios.nomeusu, 
              aulas.tituloaula,
			  aulas.dataaulaaula,
			  aulas.autoraula,
FROM usuario_ve_aulas
INNER JOIN usuarios ON usuarios.idusu = usuario_ve_aulas.idusuario
INNER JOIN aulas ON aulas.idaula = usuario_ve_aulas.idaula where idusu = 11");

//Põe os dados em um objeto
$usuario = mysqli_fetch_object($confereLimite);
  
 $qtdAcessos = $usuario->usuario_ve_aulas.vacesso;

if($qtdAcessos < 5):

   //Incrementa a quantidade. é a mesma coisa que $qtdAcessos = $qtdAcessos + 1
   $qtdAcessos++;
 
   $atualiza = mysqli_query($conecta,"UPDATE usuario_ve_aulas SET vacesso = $qtdAcessos where idusu = 11");
  
   //Confere se o SQL de atualização foi realizado
   if($atualiza): 
      echo "É a sua $qtdAcessos visita"; 
   endif; 
  
else:
   echo "Você estourou o limite de visitas";
endif;
?>

 

Link para o comentário
Compartilhar em outros sites

  • Moderador

@TIzeiro Vendo sua postagem #13 com mais calma estou achando que um dos erros está na modelagem do banco.

No usuarios_ve_aula  só tem chave estrangeira. Além disso, esqueci de mencionar que antes de fazer o relacionamento precisa criar índices das os campos que serão relacionados.

Para isso tem que ir no modo estrutura e clicar em "índice +" aí você define qual campo será referenciado.

Quando fazer o relacionamento, SE aparecer uma janelinha roxa com algumas opções, escolha "CASCADE" e é sinal que deu tudo certo.

 

Aí basta popular as tabelas de acordo com relacionamento.

Eu recriei esse banco aqui  e testei a instrução SQL que já havia postado ali a cima e funcionou!.

veja os prints

 

No caso da minha estrutura a consulta que fiz foi:

 

SELECT aulas.titulo, 
           aulas.data, 
           aulas.conteudo,
           usuarios.nome as autor,
           acessos.acesso
FROM acessos
INNER JOIN aulas ON aulas.ID = acessos.ID_aula
INNER JOIN usuarios ON usuarios.ID = aulas.autor
WHERE acessos.ID_usuario = 2

No caso, informa o título da aula, a data dela, o conteúdo da aula, o nome do autor e a quantidade de acessos que o usuário tem daquela aula.

bd.PNG

bd-2.PNG

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...