Ir para conteúdo

POWERED BY:

Arquivado

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

Anderson Nunes

Problema com Select - Atendimento on Line

Recommended Posts

Olá, estou tentando desenvolver um sistema de atendimento on line em php e mysql, acontece que para verificar se a mensagem ja foi impressa na tela eu faço um select verificando se o campo "chat_ok" = 0, se for leio os dados e em seguida seto como "chat_ok" =1, acontece que as vezes o servidor apenas faz o select e falha na instrução de setar como 1 o campo. Isso faz com que a mensagem se repita duas ou tres vezes na tela, ou ainda, ele falha na primeira intrução e executa apenas a segundo, setar o campo = 1, fazendo com que a mensagem nem apareça na tela. Como posso contornar isso? Da pra fazer um select e update no mesmo comando e ainda pegar os dados que retornaram da consulta? Grato..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu script para baixar as mensagens se resume nisto.

 

<?

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

$msg[0] = "Conexo com o banco falhou!";
$msg[1] = "No foi possvel selecionar o banco de dados!";

$conexao = mysql_pconnect($host,$user,$pas)or die($msg[0]);
mysql_select_db($database,$conexao) or die($msg[1]);

$id_chat = $_REQUEST['codigo_sessao'];//id do chat em andamento

$query = "SELECT * FROM chat_mensagens where id_chat = '$id_chat' and baixada = 0 ORDER BY Id DESC";//busco as mensagens que não foram baixadas.

$resultado = mysql_query($query,$conexao);
while ($linha = mysql_fetch_array($resultado)) {
$mensagem = $linha['mensagem'];
$id_linha = $linha['Id'];
$nome_usuario = $linha['operador'];
//seto como baixada para não se repetir.
$query = mysql_query("UPDATE chat_mensagens SET baixada=1 WHERE Id = '$id_linha'"); 
}
//envio para o flex as mensagens.
print "<busca>\n";
   print "<mensagem_n><mensagem>".$mensagem."</mensagem><operador>".$nome_usuario."</operador><hora>".date('h:i:s')."</hora></mensagem_n>\n";
print "</busca>";


mysql_close($conexao);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Execute a consulta verificando se não ocorreu erro:

 

mysql_query( consulta aqui ) or exit( mysql_error() );

Provavelmente o problema esteja nas aspas que envolve a variável $id_linha. SSe o campo for numérico, não use aspas. Apenas as use se for campo de string

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça com AJAX e settimeout()

 

Estou usando o Flex e Action Script 3.0, php e mysql. Acho que não quero usar ajax(até pq não tenho conhecimento). Obrigado pela dica.

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça os registros com Logs e a conversa com arquivos temporários então, você dispensa o 'chat_ok=1'

 

o Log é sequencial, como um histórico. Além dele você pode manter um arquivo "lastMSG.txt" por exemplo.

 

de tempos em tempos seu script checa este lastMSG.txt que vai ser escrito num formato

 

[user] [msg] e verifica se o [user] é igual ao usuário que está checando (sinal que a última mensagem é própria)

 

se falso, adiciona no painel de chat. Consome muito menos processamento e dependendo da configuração do servidor (leia-se locaweb e semelhantes) também economiza banda.

 

por questões de segurança, você pode adicionar um IDentificador no nome do handler do chat ex:

 

lastMSG_18022010_1405_001.txt

 

 

 

 

 

Existe também a possibilidade de abrir 2(ou mais) handlers para cada chamado.

Exemplo vamos identificar o chamado como no formato anterior [data_hora] mas vamos dispensar o lastMSG e ao invés de 001 a variação será o nome dos envolvidos

 

Estamos eu e você num chat, são abertos dois manipuladores

18022010_1405_evandro.txt

18022010_1405_anderson.txt

 

o seu lado da aplicação, fica lendo o meu arquivo de tempos em tempos e, analogamente, pro lado de cá

 

a aplicação pode se orientar pelo horário da última msg

 

18022010_1405_evandro.txt

[14:05:33] Oi.

18022010_1405_anderson.txt

[14:06:12] Olá.

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.