Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, tenho um problema que acredito que seja simples de se resolver, mas como eu estou começando a aprender Ajax agora para mim é difícil, pois tenho muitas dúvidas para esclarecer.
Bom, primeiro explicarei como o sistema funciona, depois publcarei o código...
No banco de dados SQL tenho um campo ID, inteiro, com auto increment, ou seja, está sempre incrementando um valor de x em x segundos (1,2,3,4...). Não necessariamente ao mesmo tempo.
O sistema é composto por 2 arquivos: sql.php, que é a página onde está o sistema e outra chamada conteudo.html. O que o sistema tem de fazer é verificar no banco de dados se ouve alguma alteração nas IDs e executar a seguinte tarefa: se a ID mudar, por exemplo, passar de 2 para 3, deverá atualizar a página conteúdo.html, se não, se a ID continuar em 2, não deverá atualizar a página. Ou seja, só deverá atualizar a página conteudo.html quando houver alguma alteração no campo ID.
Para verificar se a ID foi alterada o sistema deverá fazer uma verificação com Ajax de 5 em 5 segundos, fazendo consultas no banco de dados e verificando se a última ID é diferente da que foi obtida no teste anterior, se for, deverá atualizar a página conteúdo.html. Este sistema é muito utilizado em sites que utilizam Ajax e preciso muito de entender como funciona para colocar em prática alguns projetos...
O código está quase pronto... mas estou com um probleminha nos refresh utilizando Ajax. Veja o código abaixo:
O arquivo conteudo.html contém apenas algum html só para testar... por isso não vou publicá-lo aqui.
sql.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html dir="ltr" xmlns="[http://www.w3.org/1999/xhtml">](http://www.w3.org/1999/xhtml)
<head>
<script type="text/javascript">
/ As duas funções abaixo é só para iniciar o Ajax ou documento XML de acordo com o sistema ou browser que você estiver utilizando... bla bla bla... /
function getHTTPObject()
{
if(window.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else
{
if(window.ActiveXObject)
{
var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
for(var i = 0; i < prefixes.length; i++)
{
try
{
return new ActiveXObject(prefixes[i] + ".XMLHTTP");
}
catch (e) {}
}
}
}
function ajax(url,id_conteudo )
{
var xmlHttp = getHTTPObject();
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4)
{
var retorno = xmlHttp.responseText;
document.getElementById(id_conteudo).innerHTML = retorno; /* A variavel id_conteudo aqui guarda o valor que identifica qual a DIV que deverá ser
atualizada (refresh_pag ou refresh_sql) */
}
}
xmlHttp.open("GET", url,true);
xmlHttp.send(null);
}
function atualiza_sql(ultima_id) /* Ok, vamos atualizar o sistema para verificar novamente se mudou ou não a ID. Aqui não atualizamos a página conteudo.html */
{
ajax('<?PHP echo $_SERVER["PHP_SELF"]; ?>?id='+ultima_id,'refresh_sql');
}
function atualizar_pags(atualizar,ultima_id)
{
if(atualizar == "sim") /* Se for para atualizar entra aqui */
{
ajax('conteudo.html"; ?>','refresh_pag'); /* Atualiza ou mostra a página conteudo.html entre <div id="refresh_pag"> e </div> */
ajax('<?PHP echo $_SERVER["PHP_SELF"]; ?>?id='+ultima_id,'refresh_sql'); /* Atualiza uma parte da página atual, somente o que está
entre <div id="refresh_sql"> e </div> que é o local onde está o sistema...*/
}
else
{
setTimeout(atualiza_sql(ultima_id),5000); /* Se não for para atualizar, caso em que a ID continua a mesma, então damos um tempo de
5 segundos até iniciar uma nova verifição, chamando a função atualiza_sql() lá em cima, passando agora apenas o parâmetro da ultima_id;*/
}
}
</script>
</head>
<body>
<div id="refresh_sql">
<?PHP
if($_GET["id"] == null)
{
$id_obtida = 0; // Quando a página é iniciada ele entra aqui. A variável $id_obtida irá guardar o valor da útlima ID obtida do método GET com Ajax eu zerei a ID;
}
else
{
$id_obtida = $_GET["id"];
}
// Comando SQL, aqui seria a conexão com o banco de dados
$ultima_id = $linha_ultima_id["ID"];
// Aqui eu pego o valor no banco de dados da última ID, só que desta vez o valor pode ser diferente pelo fato de já ter passado algum
tempo que pegamos este valor e guardamos na variável $id_obtida;
// Não coloquei o código da conexão ao banco de dados porque não achei necessário, visto que o problema envolve Ajax... já testei eif ($ultima_id > $id_obtida) // Agora comparamos as 2 IDs para ver se precisaremos atualizar a página conteúdo.html, se a nova ID ($ultima_id) for maior então
passamos um parâmetro "sim" para indicar que a ID é diferente da ID anterior ($id_obtida), caso em que temos de atualizar a página conteudo.html
{
echo '<script>atualizar_pags("sim",'.$ultima_id.');</script>';
}
else
{
echo '<script>atualizar_pags("nao",'.$ultima_id.');</script>'; // Aqui é o contrário... só entrará aqui quando a $id_obtida for igual ?>
</div>
<div id="refresh_pag"></div>
</body>
</html>
Coloquei comentários no código acima para evitar de eu explicar tudo denovo aqui. Bom, quando entramos na página ele faz tudo direitinho, atualiza o arquivo conteudo.html e da um refresh no sistema, iniciando uma nova verificação no campo ID.Na segunda vez que ele entra, ele pega direitinho o valor da $id_obtida anteriormente e da $ultima_id também, só que quando chega ali na parte onde tem as duas funções:
if ($ultima_id > $id_obtida) // Agora comparamos as 2 IDs para ver se precisaremos atualizar a página conteúdo.html ou não,
passando a última_id obtida e outro parâmetro (sim, nao).
{
echo '<script>atualizar_pags("sim",'.$ultima_id.');</script>';
}
else
{
echo '<script>atualizar_pags("nao",'.$ultima_id.');</script>';
}
?>
... ele entra normalmente onde tem de entrar mas não chama a função em javascript. Ou seja, quando faço o refresh do sistema que está entre <div id="refresh_sql"> e </div> somente o PHP funciona corretamente, pois na hora de chamar a função em javascript atualizar_pags() novamente ele não chama... e sim, já testei para ver se está entrando lá ou não com um alert em javascript. Ele só chega até o if else do PHP...
Lembrando que da primeira vez que o sistema é executado, ou seja, antes de ser utilizado o Ajax, ele entra na função sem problemas. Só não entra após o refresh da página com Ajax...
Carregando comentários...