Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodolfo Barreto

[Resolvido] Requisição repetida, setInterval

Recommended Posts

Fala amigos desenvolvedores, sou novato aqui no forum mas espero que possam me ajudar nesse bug.

Trabalho com desenvolvimento web a uns anos e estou desenvolvendo um site de leilão.Como todos sabem um sistema de leilão tem um cronometro, esse cronometro é cadastrado pela área administrativa determinando o tempo máximo. Quando o sistema inicia o cronometro diminui até zero, se chegar a zero o produto é arrematado.

Até ai tudo muito bonito, o meu sistema funcionou porém quando outros usuários acessam o mesmo leilão o cronometro desconta a cada usuário "online" no site.

 

Ex: Um usuário = cronometro normal, dois usuários: diminui de dois em dois, três usuários: diminui de três em três

Fiz as requisições ao banco usando jquery e exibo para o usuário através do JSON, algo mais ou menos assim:

 

window.setInterval(atualizar_leilao,1000);

function atualizar_leilao(){
  $.post('atualizar_leilao.php',function(json){
     $('#cronometro').text(json.cronometro);
  });
}

 

 

Queria a ajuda de vocês para tentar fazer com que não exista esse bug de toda vez que um usuário acessar o site o cronometro correr duplicado ou triplicado dependendo da quantidade de usuários..

 

Acredito que esteja ocorrendo um chamado na função toda vez que o site é carregado, mas mesmo assim não faz muito nexo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, vamos por parte.

Se fosse eu, faria dessa forma, alteraria a tabela do produto e jogaria um tempo para o Produto ao lado.

 

- Por que eu faria isso?

 

É porque para atualizar os dados de todos os usuários em tempo real, mas acredito que você já deve fazer isso com JSON.

 

Pode postar a estrutura do Objeto JSON?

 

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O JSON fica assim

 

{"usuarios":["rodolfo","marcelo","rodrigo"],"tempo":"28","valor":"59"}

 

Di você quis dizer que se fosse você, você criaria outra tabela para armazenar o tempo ?

 

<?php
header('Content-type: application/json');

# recebe a id do produto
$id_produto = $_GET['id'];

# verifica se a id é inteira
if(filter_var($id_produto,FILTER_VALIDATE_INT)){
   require_once("../configs/banco.php");

   # recupera o leilão do banco
   $sql_leilao = mysql_query("SELECT id_produto,data,tempo_max,tempo_real,valor FROM leilao WHERE id_produto = '$id_produto'");

   # exibe as informações
   $result_leilao = mysql_fetch_assoc($sql_leilao);

   # verifica se o leilão já foi arrematado
   if($result_leilao['tempo_real'] != "Arrematado"){

       # desconta um segundo do tempo
       $desconto_tempo = $result_leilao['tempo_real']-1;

       # atualiza no banco de dados
       $update_leilao = mysql_query("UPDATE leilao SET tempo_real = '$desconto_tempo' WHERE id_produto = '$id_produto'");

       # prepara o array para o json
       $json = array("tempo"=>$result_leilao['tempo_real']);

       # envia para o javascrit o resultado em json
       echo json_encode($json);
   }
}

?>

 

 

Tentei colocar um "LIMIT 1" mas não mudou, ou seja só está vindo uma id.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok.

Olha para essa linha:

 

if($result_leilao['tempo_real'] != "Arrematado"){

 

Quando ela vai dar "arrematado"?

 

Eu acredito que um while dentro do if e uma ação de decremento. Você jogou em JSON, correto? Passa o valor do tempo para uma outra página. Exemplo...

Ele vai passar o valor de 59 segundos para outra página, correto? Ai você poe um while , mas precisamente um contador de decremento.

 

window.setInterval(atualizar_leilao,1000);

function atualizar_leilao(){
  $.post('atualizar-json.php',function(json){
     $('#cronometro').text(json.cronometro);
  });
}

 

Entendeu a lógica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodolfo Barreto.

Você não está retirando o dado do tempo e passando para um bloco de dados em JSON?

 

Ao invez de você por dentro do loop do setInterval a mesma página, vai dar bug. Mas se você pegar esse valor do tempo retornado do...

 

$json = array("tempo"=>$result_leilao['tempo_real']);

 

em outras página, é melhor. Entendeu?

 

Ai trabalha com o loop baseado nesse dado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha como está a minha função javascript que chama os dados do leilão

 

setInterval(atualizar_leilao,1000); 

function atualizar_leilao(){    
   id_produto = window.location.href;
   id_produto = id_produto.split('=');
   id_produto = id_produto[2];

   $.ajax({
       type:'GET',
       url:'php/scripts/atualizar_leilao.php',
       data:{id:id_produto},
       dataType:'json',
       success:function(json){
           $('#contador-box-produto-max').text(json.tempo);
       }
   });
}

 

<?php
header('Content-type: application/json');

# recebe a id do produto
$id_produto = $_GET['id'];

# verifica se a id é inteira
if(filter_var($id_produto,FILTER_VALIDATE_INT)){
   require_once("../configs/banco.php");

   # recupera o leilão do banco
   $sql_leilao = mysql_query("SELECT id_produto,data,tempo_max,tempo_real,valor FROM leilao WHERE id_produto = '$id_produto'");

   # exibe as informações
   $result_leilao = mysql_fetch_assoc($sql_leilao);

   # verifica se o leilão já foi arrematado
   if($result_leilao['tempo_real'] != "Arrematado"){

       # desconta um segundo do tempo
       $desconto_tempo = $result_leilao['tempo_real']-1;

       # atualiza no banco de dados
       $update_leilao = mysql_query("UPDATE leilao SET tempo_real = '$desconto_tempo' WHERE id_produto = '$id_produto'");

       # prepara o array para o json
       $json = array("tempo"=>$result_leilao['tempo_real']);

       # envia para o javascrit o resultado em json
       echo json_encode($json);
   }
}

?>

 

O problema Dii é que se eu fizer outro loop com outro arquivo php vai dar o mesmo bug porque o problema está nas chamadas setInterval.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu, sinceramente, não vejo problema algum no setInterval. Ele parece estar correto, eu acredito que o problema esta mesmo na página PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi galera !

 

Problema: Eu fazia a diminuição do cronometro no php

Solução: Fazer a diminuição do cronometro pelo javascript

 

tempo = $('#contador-box-produto-max').text();

 

tempo--;

 

$.ajax({

url:'php/scripts/atualizar_leilao.php',

type:'GET',

global:false,

data:{id:id_produto,tempo:tempo},

dataType:'json',

success:function(json){

$('#contador-box-produto-max').text(json.tempo);

}

});

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.