Mam kod który dodaje wiadomości do bazy (działa) chcę teraz wyświetlać ostatnią (działa ale dopiero po odświeżeniu strony) chce to robić od razu. Myślę ze tu jest błąd w porównywaniu i przekazywaniu $id.
Podam klase i kod js, w razie czego moge też podać resztę.
JS
/* chatURL - URL do aktualizacji wiadomości */
var pzdURL = "http://localhost/Strona klasy 1B/pzd.php";
/* getColorURL - URL do pobrania wybranego koloru RGB */
/* tworzy obiekty XMLHttpRequest, które zaktualizują wiadomości rozmowy i pobiorą wybrany kolor*/
var xmlHttpGetMessages2 = createXmlHttpRequestObject2();
/* zmienna, która określa jak często łączyć się z serwerem*/
var updateInterval2 = 1000; // w milisekundach
// ustawione na true, wyświetla szczegółowy komunikat o błędach
var debugMode = true;
var cache2 = new Array();
var lastMessageID = -1;
//funkcja inicjująca
// funkcja, która zapewnia, że użytkownik dostanie nazwę, choćby generowaną automatycznie
function checkUsername2()
{
// zapewnia nadanie użytkownikowi nazwy (np. generowanej automatycznie)
var oUser=document.getElementById("userName2");
}
/* funkcja wywołana po wciśnięciu przycisku "Wyślij"*/
function sendMessage2()
{
// zachowuje wiadomość w zmiennych lokalnych i czyści okienko tekstowe
var oCurrentMessage = document.getElementById("messageBox2");
var currentUser = document.getElementById("userName2").value;
// nie wysyła pustych wiadomości
if (trim(oCurrentMessage.value) != "" &&
trim(currentUser) != "")
{
// jeśli musimy wysłać i pobrać wiadomość
params2 = "mode=SendAndRetrieveNew2" +
"&id=" + encodeURIComponent(lastMessageID) +
"&name=" + encodeURIComponent(currentUser) +
"&message=" + encodeURIComponent(oCurrentMessage.value);
// dodaje wiadomość do kolejki
cache2.push(params2);
// czyści okno tekstowe
oCurrentMessage.value = "";
}
}
/* funkcja wywołana po wciśnięciu przycisku "Usuń wszystko" */
function display2($message)
{
// pobiera odwołanie do elementu
<div> na stronie
myDiv = document.getElementById("myDivElement2");
// wyświetla komunikat
myDiv.innerHTML = $message + "
<br/>";
}
/* wysyła asynchroniczne żądanie, aby pobrać nowe wiadomości, wysłać je lub usunąć*/
function requestNewMessages2()
{
// pobiera nazwę użytkownika i kolor ze strony
var currentUser = document.getElementById("userName2").value;
// kontynuuje jeśli xmlHttpGetMessages2 nie jest pusty
if(xmlHttpGetMessages2)
{
try
{
// nie zaczyna nowej operacji na serwerze, jeśli jakaś jest wykonywana
if (xmlHttpGetMessages2.readyState == 4 ||
xmlHttpGetMessages2.readyState == 0)
{
// przechowa parametry potrzebne do wykonania żądania na serwerze
var params2 = "";
// jeśli w kolejce czekają wiadomości, to pobiera najstarszą
if (cache2.length>0)
params2 = cache2.shift();
// jeśli pamięć jest pusta, pobiera nową wiadomość
else
params2 = "mode=RetrieveNew2" +
"&id=" +lastMessageID;
// wywołuje działania po stronie serwera
xmlHttpGetMessages2.open("POST", pzdURL, true);
xmlHttpGetMessages2.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
xmlHttpGetMessages2.onreadystatechange = handleReceivingMessages2;
xmlHttpGetMessages2.send(params2);
}
else
{
// sprawdza ponownie czy są nowe wiadomości
setTimeout("requestNewMessages2();", updateInterval2);
}
}
catch(e)
{
displayError2(e.toString());
}
}
}
/* funkcja obsługująca odpowiedź HTTP podczas aktualizacji wiadomości*/
/* funkcja obsługująca odpowiedź serwera podczas aktualizacji wiadomości*/
function readMessages2()
{
// pobiera odpowiedź serwera
var response = xmlHttpGetMessages2.responseText;
// błąd serwera?
if (response.indexOf("ERRNO") >= 0
|| response.indexOf("błąd:") >= 0
|| response.length == 0)
throw(response.length == 0 ? "Pusta odpowiedź serwera." : response);
// pobiera element dokumentu
response = xmlHttpGetMessages2.responseXML.documentElement;
// pobiera flagę określającą czy okno rozmowy zostało wyczyszczone czy nie
// jeśli flaga ma wartość true, trzeba wyczyścić okno wiadomości
// pobiera tablice z odpowiedzi serwera
idArray = response.getElementsByTagName("id");
nameArray = response.getElementsByTagName("name");
timeArray = response.getElementsByTagName("time");
messageArray = response.getElementsByTagName("message");
colorArray = response.getElementsByTagName("color");
// dodaje nową wiadomość do okna rozmowy
displayMessages2(idArray, nameArray, timeArray, messageArray, colorArray);
// przechowuje lokalnie ID ostatniej otrzymanej wiadomości
if(idArray.length<0)
lastMessageID = idArray.item(idArray.length - 0).firstChild.data;
// ponownie uruchamia sekwencję
setTimeout("requestNewMessages2();", updateInterval2);
}
/* funkcja dodająca nowe wiadomości do okna rozmowy */
function displayMessages2(idArray, nameArray, timeArray, messageArray,colorArray)
{
// każdy przebieg pętli dodaje nową wiadomość
for(var i=0; i<idArray.length; i++)
{
// pobiera szczegóły wiadomości
var time = timeArray.item(i).firstChild.data.toString();
var name = nameArray.item(i).firstChild.data.toString();
var color = colorArray.item(i).firstChild.data.toString();
var message = messageArray.item(i).firstChild.data.toString();
// tworzy kod HTML, który wyświetli wiadomość
var htmlMessage = "";
htmlMessage += "<div class=\"item\" id=\"l\" style=\"background-color:"+color+";\">";
htmlMessage += ""+name+":";
htmlMessage += message.toString();
// wyświetla wiadomość
displayMessage2(htmlMessage);
}
}
// wyświetla wiadomość
function displayMessage2(message)
{
// pobiera obiekt scroll
var oScroll = document.getElementById("scroll2");
// sprawdza, czy pasek jest przewinięty
var scrollDown = (oScroll.scrollHeight - oScroll.scrollTop <=
oScroll.offsetHeight );
// wyświetla wiadomość
oScroll.innerHTML += message;
// przewija na dół pasek przewijania
oScroll.scrollTop = scrollDown ? oScroll.scrollHeight : oScroll.scrollTop;
}
i klasa
<?php
// klasa zawierająca funkcjonalności strony serwera
class Pozdrownienia
{
public function __construct($sql)
{
$this->sql = $sql;
}
public function postMessage($name, $message)
{
// usuwa znaki specjalne przez dodaniem wiadomości do bazy
$db = $this->sql;
// tworzy zapytanie SQL, które dodaje nową wiadomość do serwera
$query = $db->query('INSERT INTO pozdrowienia(posted_on, user_name, message) ' .
// wykonuje zapytanie SQL
}
/*
Metoda retrieveMessages pobiera wiadomości, które zostały wysłane na serwer
- parametr $id jest wysyłany przez klienta i odpowiada identyfikatorowi ostatniej wiadomości pobranej przez niego.
Wiadomości o późniejszych id będą pobrane z serwera i wysłane klientowi w formacie XML
*/
public function retrieveNewMessages($id=0)
{
$db = $this->sql;
// usuwa znaki specjalne przez dodaniem wiadomości do bazy
// tworzy zapytanie SQL, które pobiera wiadomość do serwera
if($id>0)
{
// pobiera wiadomości świeższe niż te o danym $id
$query = $db->query('SELECT chat_id, user_name, message, ' .
'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") ' . 'AS posted_on ' .
'FROM pozdrowienia WHERE chat_id > ' . $id . ' ORDER BY chat_id ASC LIMIT 1');
}
else
{
// przy pierwszym uruchomieniu wyświetla ostatnich 50 wiadomości z serwera
$query = $db->query('SELECT chat_id, user_name, message, posted_on FROM ' .
'(SELECT chat_id, user_name, message, ' .
'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") AS posted_on ' . 'FROM pozdrowienia ' .
'ORDER BY chat_id DESC ' . 'LIMIT 1) AS Last1 ' . 'ORDER BY chat_id ASC LIMIT 1');
}
$rows = $query->num_rows;
// wykonuje zapytanie
// tworzy odpowiedź XML
$response = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
$response .= '<response>';
// wysyła czystą flagę
// sprawdza czy jest odpowiedź
// przegląda w pętli wszystkie przechwycone wiadomości, aby stworzyć wiadomość wynikową
for($i=0; $i < $rows; $i++)
{
$row = $query->fetch_array();
if(@$i % 2 == 0)
{
$color = '#fff';
}
else
{
$color = '#fff';
}
$id = $row['chat_id'];
$response .= '<id>' . $id . '</id>' .
'<time>' . $time . '</time>' .
'<color>' . $color . '</color>' .
'<name><![CDATA['.$userName.']]></name>' .
'<message><![CDATA['.wordwrap($message, 20, "\n", 1).']]></message>';
}
// zamyka połączenie z bazą, jak szybko jest to możliwe
// kończy odpowiedź XML i wysyła ją
$response = $response . '</response>';
return $response;
}
}
?>
nie da się tego poprawić?
chodzi mi o automatyczne odświeżanie przy dodaniu wiadomości, chodzi tu o poprawnego ifa przy zapytaniu