Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
esta registrando no BD esta apagando as msg a cada um minuto, mas nao esta pegando as msg que mandamos quem poder falar qual seria a linha ?
sera mais um ganho para todos vamos la amigos.
<?php
// Conecta
include_once('../conectar_bd.php');
// Cria a tabela de chat, caso ainda não exista
$stmt = $dsn->prepare("
CREATE TABLE IF NOT EXISTS chat (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
mensagem VARCHAR(400) NOT NULL,
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=MEMORY
");
$stmt->execute();
var_dump($mensagem);
// Salva a mensagem se ela estiver sendo postada
if(isset($_POST['mensagem'])){
// Limpa mensagens antigas
$stmt = $dsn->prepare("DELETE FROM chat WHERE timestamp < NOW() - INTERVAL 1 MINUTE");
$stmt->execute();
// escapa a string
$mensagem = mysql_real_escape_string($_POST['mensagem']);
// insere na tabela chat
$stmt = $dsn->prepare("INSERT INTO chat(mensagem) VALUES ('$mensagem')");
$stmt->execute();
// pára o processamento
exit;
}
// Cliente quer receber mensagens mais novas que o id fornecido
elseif(isset($_GET['ultimo_id'])){
// desabilita o time limit porque queremos um loop infinito logo abaixo
set_time_limit(0);
// prepara o número para a query
$ultimo_id = (int)$_GET['ultimo_id'];
// mensagens que serão retornadas ao cliente
$mensagens = array();
// vai tentando achar mensagens até conseguir
while(true){
// pega as últimas 10 mensagens
$stmt = $dsn->prepare("SELECT id, mensagem FROM chat WHERE id > $ultimo_id ORDER BY id DESC LIMIT 10");
$stmt->execute();
$obj = $stmt->rowCount();
// se achar alguma mensagem
if($obj){
// preenchemos o array com as mensagens
$row = $stmt->fetchAll();
foreach($row as $ver)
{
$mensagens[] = $ver;
}
// coloca as mensagens em ordem, já que fizemos order by id DESC
$mensagens = array_reverse($mensagens);
// pára o loop infinito
break;
}
// se não tiver mensagem nova ainda
else{
// pausa o loop infinito um pouquitinho
usleep(250);
}
}
// chegando até aqui, podemos retornar o array $mensagens como json
echo json_encode($mensagens);
// e terminar esta requisição pro cliente poder ler o json
exit;
}
// se chegamos até aqui, o cliente simplesmente quer usar o chat boladão
// envia header com encoding utf-8
header("Content-type: text/html; charset=utf-8");
?><html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>chatildis!</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="author" content="garotosopa"/>
<script type="text/javascript">// variável que vai guardar o id da última mensagem que recebemos
var ultimo_id = 0;
// variável que será o elemento da div das mensagens
var chat;
// variável que será o elemento da caixa de texto de mensagem
var mensagem;
// variável que será o objeto XHR das mensagens recebidas
var xhr_chat;
// montamos o xhr que recebe mensagens em browsers bacanas
if( window.XMLHttpRequest ){
xhr_chat = new XMLHttpRequest();
}else if ( window.ActiveXObject ){
xhr_chat = new ActiveXObject("Microsoft.XMLHTTP");
}
// função callback para qualquer novidade na requisição de mensagens
function processar(){
// quando a requisição estiver completa
if ( xhr_chat.readyState == 4 ) {
// se houve sucesso na requisição
if ( xhr_chat.status == 200 ) {
// transforma o texto retornado em json
var json = eval('(' + xhr_chat.responseText + ')');
// le cada item do array retornado por json
for (i in json) {
// acessa a mensagem da iteração atual
var mensagem = json[i];
// caso não tenha mensagens validas
if( ! mensagem.mensagem ){
// não queremos ter erro de javascript
return;
}
// escapa tags html da mensagem recebida
var texto = mensagem.mensagem.replace(/</g, '<');
texto = texto.replace(/>/g, '>');
// criamos um parágrafo pra cada mensagem retornada
var p = document.createElement('p');
p.innerHTML = texto;
// adicionamos o parágrafo na div de mensagens
chat.appendChild(p);
};
// id da última mensagem para depois pegar apenas as mais novas
if ( json[json.length-1] ){
// pega a propriedade id da última mensagem
ultimo_id = json[json.length-1].id;
}
// coloca a barra de rolagem no final
chat.scrollTop = chat.scrollHeight;
}
// sempre que completar a requisição, criaremos uma nova
setTimeout(atualizar, 250);
}
};
// função que pede as mensagens mais novas que o id que temos
function atualizar(){
// enviaremos para o próprio arquivo e acrescentamos o ultimo id
xhr_chat.open('GET', location.pathname + '?ultimo_id=' + ultimo_id, true);
// associamos nossa função de callback
xhr_chat.onreadystatechange = processar;
// e então enviamos a requisição sem nenhum parâmetro extra
xhr_chat.send(null);
}
// espera carregar a página
window.onload = function(){
// guarda o elemento da div das mensagens
chat = document.getElementById('chat');
// guarda o elemento da caixa de texto de mensagem
mensagem = document.getElementById('mensagem');
// adiciona evento ao formulário para fazer o envio por ajax
document.getElementById('envio').onsubmit = function(){
// pega o texto digitado
var texto = mensagem.value;
// tira os espaços do início e fim
texto = texto.replace(/^\s*/, '');
texto = texto.replace(/\s*$/, '');
// se o texto estiver vazio, nem envia
if( texto == '' ){
return false;
}
// montamos o xhr para enviar mensagem por browsers joinhas
if( window.XMLHttpRequest ){
var xhr_envio = new XMLHttpRequest();
// ou montamos o xhr para enviar mensagem pelo internet explorer
}else if ( window.ActiveXObject ){
var xhr_envio = new ActiveXObject("Microsoft.XMLHTTP");
}
// enviaremos a mensagem por post para nós mesmos, assincronamente
xhr_envio.open("POST", location.pathname, true);
// definimos a requisição como envio de formulário
xhr_envio.setRequestHeader
('Content-Type', 'application/x-www-form-urlencoded');
// e então escapamos e enviamos o texto
xhr_envio.send( 'mensagem=' + encodeURIComponent(texto) );
// limpa e foca a caixa de texto
mensagem.value = '';
mensagem.focus();
// não submete o formulário tradicionalmente
return false;
};
// foca a caixa de texto ao carregar a página
mensagem.focus();
// começa a consultar as atualizações
atualizar();
};</script>
<style type="text/css"> font-family: sans-serif;
font-size: 12px;
margin: 0;
}
h1 {
border-bottom: 1px solid #a4a4a4;
background: #eaeaea;
color: #333;
padding: 1em;
margin: 0;
}
#chat {
border: 1px solid #a4a4a4;
padding: 1em;
margin: 1em;
height: 25em;
overflow: auto;
}
#mensagem {
min-width: 50em;
}
label, input {
padding: 0.5em;
}
</style>
</head>
<body>
<h1>chatildis!</h1>
<div id="chat">
<p>It's only the chatildis ultimate chat ultra, baby!</p>
<p>
O único capaz de derrubar seu servidor com conexões abertas e
tabelas na memória... *sigh*
</p>
</div>
<form id="envio" method="post" action="">
<p>
<label for="mensagem">Mensagem:</label>
<input type="text" name="mensagem" id="mensagem" maxlength="380" />
<input type="submit" name="enviar" value="Enviar" />
</p>
</form>
</body>
</html>Algo lhe impede de começar de novo? nao achei nenhuma diferença visìvel comparando ao código original
Ele tem PHP e Ajax sim e eu sou um zero em Ajax.
E sobre comparação e verdade o garotosopa e muito bom em dar a ajuda que muitos tem medo.
O que vocês me dizem?
da pra ajudar ? B)
primeiro entenda q ajax eh diferente do long polling, ok? completamente diferente
segundo coloque este php num ourtro arquivo separado, você pode aumentar o processamento do jeito q esta...
terceiro depure o q o ajax esta mandando pro servidor, como fazer isso? instale o firefox, instale no firefox o firebug, ative-o e va a aba redes, recarregue a pagina e veja o ajax mandando dados pro servidor..retorne o resultado...
---------
@Igor.php
Só para constar:
Sim long polling e ajax são coisas distintas, mas podem ser usadas em conjunto. Neste caso, faz sentido usar long polling com ajax (na verdade, em chats são comumente usados em conjunto):
http://en.wikipedia.org/wiki/Push_technology#Long_polling
http://blog.perplexedlabs.com/2009/05/04/php-jquery-ajax-javascript-long-polling/
@braços e fique com Deus!
@hufersil, mas eu disse q ele esta usando apenas ajax...e q ele confundiu...
É, realmente parece não haver nenhum long pooling ali...
O que ele faz é basicamente realizar uma nova requisição a cada 250 ms...
Exemplo de Long Polling
Nossa como vocês estão proativos.
Muitos link para estudar sobre o polling, e agora eu to sabendo que isso que eu postei não é o verdadeiro polling, vou estudar e aprender.
Obrigado a todos
Pergunta, a forme de registrar as msg no BD apagar elas com time, e chamar todas na tela, não seria melhor que polling ?
quero dizer: a ideia não é a mesma?
OBS: temos um novo amigo hufersil, pelomenos para mim ele é novo.
Obrigado pela sua ajuda (hufersil), desculpe a pergunta se incomoda mas qual á origem de seu nick?
Pergunta, a forme de registrar as msg no BD apagar elas com time, e chamar todas na tela, não seria melhor que polling ?quero dizer: a ideia não é a mesma?
Ahn??? Explica isso melhor...
>
Pergunta, a forme de registrar as msg no BD apagar elas com time, e chamar todas na tela, não seria melhor que polling ?
quero dizer: a ideia não é a mesma?
de forma alguma, registrar as mensagens no db, eh uma requisicao e acao do banco de dados, o long polling eh uma forma de requisicao ao servidor, independente de ter ou nao banco de dados por tras...
isso eh long pooling ou eh ajax? ta com cara de ser ajax e nao long pooling...