Ir para conteúdo

POWERED BY:

Arquivado

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

Fr4nK

[Resolvido] problema resposta ajax

Recommended Posts

eu tenho um formulario de cadastro que tem o campo nome e eu verifico no banco se aquele nome existe.

 

uso o seguinte função ajax (chamada pelo evento onBlur):

 

 

function ajaxNome()
	{
		
		var objajax;
		var a = fest.nome.value;
		try
		{
		objajax = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (err)
		{
			alert ("nao conseguiu criar");
		}
		objajax.onreadystatechange=function()
			{
				if (objajax.readyState==4)
				{
					var texto = objajax.responseText;
					document.getElementById("img").innerHTML= texto;
				}
			}
		if (objajax)
		{
			document.getElementById("img").innerHTML= "<img src = '../img/ajax-loader.gif' style = 'position:absolute;left:450px;top:100px'>";
			objajax.open("GET","../ajax/critica.php?nome="+a+"&tabela=dadosestacao",true);
			objajax.send(null);	
		}
	}

critica.php que o ajax chama

<?php
include ('../mysql.php');
$nome = $_GET["nome"];
$banco = $_GET["tabela"];
$res = mysql_query("SELECT nome FROM $banco WHERE nome = '$nome'");
$rows = mysql_affected_rows();
if ($rows == 0)
{
     echo "<img src = '../img/v.jpg' style = 'position:absolute;left:450px;top:50px'>";
}
else 
{
     echo "<img src = '../img/f.jpg' style = 'position:absolute;left:450px;top:50px'>";
}	
?>

 

está tudo funcionando corretamente, so que eu encontrei um bug, digamos que eu tenha cadastrado o 'joao' essa funcao ajaxNome() vai verificar no banco que esse usuario nao existe e libera o cadastro, so que sem fechar o navegador eu comece a cadastrar outra pessoa que tambem se chama 'joao', so q n sei pq ele n vai ao banco, como ele ja verificou antes esse nome, libera o cadastro como se esse nome nao existisse... resumindo fica com 2 joaos cadastrados justamente o que eu queria evitar....

 

obs: esse bug nao acontece caso eu feche o navegador e abra de novo.

 

se alguem puder da uma luz do pq q ocorre isso ou uma solução fico grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

mude um pouco a lógica da coisa..

 

e verifique também antes de fazer o INSERT.. assim você blinda um pouco a sua aplicação... e não vai conseguir cadastrar 2 repetidos, já que na hora do INSERT, você vai impedir isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi William obrigado pela resposta... fazer aquela parte do INSERT como você disse eu ate concordo e nao teria duvidas ja q seria pelo php, so que ja na parte do ajax eu nao me garanto ^^ sou iniciante, so que queria usar essa liberdade que o ajax da de consultar o banco sem atrapalhar no carregamento da pagina... alguma ideia de como eu poderia ajustar melhor essa lógica??

Compartilhar este post


Link para o post
Compartilhar em outros sites

so que sem fechar o navegador eu comece a cadastrar outra pessoa que tambem se chama 'joao', so q n sei pq ele n vai ao banco

 

não entendi essa parte cara..

 

tem vários ajustes que podem ser feitos para melhorar teu script.. mas esse trecho ai do que acontece, eu realmente boiei..

 

se você abrir uma nova aba ?

se você der onblur uma vez dá certo, na segunda a requisição não é feita ?

 

veja no Ctrl + Shift + J do FireFox, se aparece algum erro de execução no teu script.

 

 

 

pontos a melhorar:

var objajax; //deveria ser uma variavel global, para que você pudesse reutilizar mais

objajax = new ActiveXObject("Msxml2.XMLHTTP"); //muito fraco esse instaciamento.. teu código não vai funcionar no Firefox por exemplo

var a = fest.nome.value; //prefira usar DOM, getElementById()..

Compartilhar este post


Link para o post
Compartilhar em outros sites

se você abrir uma nova aba ?

se você der onblur uma vez dá certo, na segunda a requisição não é feita ?

 

 

 

se você abrir uma nova aba ?

R:se eu abrir uma nova aba a requisicao e feita, se eu estiver usando a aba antiga a requisicao nao eh feita.

 

se você der onblur uma vez dá certo, na segunda a requisição não é feita ?

R: isso!

 

 

veja no Ctrl + Shift + J do FireFox, se aparece algum erro de execução no teu script.

 

n tem erro!

Compartilhar este post


Link para o post
Compartilhar em outros sites

simplificando o server-side, para melhorar teu script js

critica.php

<?php
	
	if( $_GET['campo']=='Bruno' )
		echo 'Ja Existe!';
	else
		echo 'Tudo bem!';

se você tentar colocar Bruno no campo, vai voltar 'Ja existe', sempre.. mesmo que você altere, sempre que você der um onblur nesse campo, a requisição será disparada

 

<html>
<head>
	<title></title>
<script type="text/javascript">
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) {}
		}
	}
}
var xmlHttp = getHTTPObject();
function verifica_campo( valor )
{
	
	id('resposta').innerHTML = 'Carregando...';
	xmlHttp.open( "GET", "critica.php?campo="+valor, true );

	xmlHttp.onreadystatechange = function()
	{
		if ( xmlHttp.readyState==4 )
		{
			id('resposta').innerHTML = xmlHttp.responseText;
		}
	}
	xmlHttp.send( null );   
}
function id( el ){
	return document.getElementById( el );
}
window.onload = function()
{
	id('nome').onblur = function()
	{
		verifica_campo( this.value );
	}
}
</script>

</head>
<body>
	<form action="" method="">
		<label>Nome: <input type="text" name="nome" id="nome" /></label>
	</form>
	
	<div id="resposta"></div>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa! chegou o fds acabei n respondendo... mas continuemos! resolvi fazer um teste com o que você acabou de me mandar e no critica.php so fiz algumas alteracoes pra realidade que eu quero, nada de mais, veja só.

 

<?php
include ('mysql.php');
$nome = $_GET['campo'];
$res = mysql_query("SELECT nome FROM tabela1 WHERE nome = '$nome'");
$rows = mysql_affected_rows();
if ($rows == 0)
	echo 'Tudo bem!';
else
	echo "ja existe!"
?>

 

fiz o mesmo teste de antes, na tabela1 ja tinha cadastrado o nome 'joao' e ao sair do foco o evento onBlur é disparado ele faz a consulta e exibe a msg "ja existe", perfeito! até ai está funcionando... agora fui fazer o teste de antes fui no banco executei a query "DELETE FROM tabela1 WHERE nome = 'joao'", pronto deletado o registro, voltei ao navegador apaguei a caixa de texto e digitei 'joao' novamente, ai que vem o bug, ele exibe a msg 'ja existe'... bom descartando o problema no codigo, o que me faz pensar é que existe algum cache no navegador (IE7) ou no Apache que interpreta que essa requisicao ja foi feita e emite a resposta sem processar a informação. Vou pesquisar sobre isso e caso descubra uma resposta posto aqui. Desde já William agradeço por ajudar, flw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Senhores, acrescentando essas duas linhas de header no script resolvi o problema.... o/

 

header("Cache-Control: no-cache, must-revalidate");

header("Pragma: no-cache");

 

critica.php

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
include ('mysql.php');
$nome = $_GET['campo'];
$res = mysql_query("SELECT nome FROM tabela1 WHERE nome = '$nome'");
$rows = mysql_affected_rows();
if ($rows == 0)
        echo 'Tudo bem!';
else
        echo "ja existe!"
?>

 

o problema era o cache mesmo, pode considerar resolvido... Abraços!

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.