Ir ao conteúdo
  • Cadastre-se
TIzeiro

Limitar numero de acessos a uma pagina

Recommended Posts

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

 

Editado por DiF
Ao postar um código, por gentileza, use o botão CODE <> localizado no painel do editor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@TIzeiro Olá, seja bem vindo de volta ao nosso Fórum do Clube do Hardware.

 

Qual a sua dúvida exatamente? Qual o erro do código? Diga-nos para que possamos ajudar! :thumbsup:

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@DiF Obrigado, irei realizar o teste com esse código, quanto a sessão, vou faze-la sim, mas como não sabia se iria dar certo, resolvi buscar diretamente o usuário.

adicionado 13 minutos depois

@DiF Bom, deu alguns erros, segue imagem com os erros:

 

UP615vp.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
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); 
?>

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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.

Editado por TIzeiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

 

 

 

Editado por DiF
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@DiF Quanto aos relacionamentos, compreendi tudo, mas em relação ao INNER JOIN, procurei ate em outros fóruns mas não consegui entender muito bem como utiliza-lo, poderia me dizer como utilizar ?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
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;
?>

 

Editado por TIzeiro

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×