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(); htmlMessage += "</div>"; // 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>' . } // 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