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
  1. /* chatURL - URL do aktualizacji wiadomości */
  2. var pzdURL = "http://localhost/Strona klasy 1B/pzd.php";
  3. /* getColorURL - URL do pobrania wybranego koloru RGB */
  4. /* tworzy obiekty XMLHttpRequest, które zaktualizują wiadomości rozmowy i pobiorą wybrany kolor*/
  5. var xmlHttpGetMessages2 = createXmlHttpRequestObject2();
  6. /* zmienna, która określa jak często łączyć się z serwerem*/
  7. var updateInterval2 = 1000; // w milisekundach
  8. // ustawione na true, wyświetla szczegółowy komunikat o błędach
  9. var debugMode = true;
  10. var cache2 = new Array();
  11. var lastMessageID = -1;
  12.  
  13. //funkcja inicjująca
  14. // funkcja, która zapewnia, że użytkownik dostanie nazwę, choćby generowaną automatycznie
  15. function checkUsername2()
  16. {
  17. // zapewnia nadanie użytkownikowi nazwy (np. generowanej automatycznie)
  18. var oUser=document.getElementById("userName2");
  19.  
  20. }
  21. /* funkcja wywołana po wciśnięciu przycisku "Wyślij"*/
  22. function sendMessage2()
  23. {
  24. // zachowuje wiadomość w zmiennych lokalnych i czyści okienko tekstowe
  25. var oCurrentMessage = document.getElementById("messageBox2");
  26. var currentUser = document.getElementById("userName2").value;
  27. // nie wysyła pustych wiadomości
  28. if (trim(oCurrentMessage.value) != "" &&
  29. trim(currentUser) != "")
  30. {
  31. // jeśli musimy wysłać i pobrać wiadomość
  32. params2 = "mode=SendAndRetrieveNew2" +
  33. "&id=" + encodeURIComponent(lastMessageID) +
  34. "&name=" + encodeURIComponent(currentUser) +
  35. "&message=" + encodeURIComponent(oCurrentMessage.value);
  36. // dodaje wiadomość do kolejki
  37. cache2.push(params2);
  38. // czyści okno tekstowe
  39. oCurrentMessage.value = "";
  40. }
  41. }
  42.  
  43. /* funkcja wywołana po wciśnięciu przycisku "Usuń wszystko" */
  44.  
  45. function display2($message)
  46. {
  47. // pobiera odwołanie do elementu <div> na stronie
  48. myDiv = document.getElementById("myDivElement2");
  49. // wyświetla komunikat
  50. myDiv.innerHTML = $message + "<br/>";
  51. }
  52. /* wysyła asynchroniczne żądanie, aby pobrać nowe wiadomości, wysłać je lub usunąć*/
  53. function requestNewMessages2()
  54. {
  55. // pobiera nazwę użytkownika i kolor ze strony
  56. var currentUser = document.getElementById("userName2").value;
  57. // kontynuuje jeśli xmlHttpGetMessages2 nie jest pusty
  58.  
  59. if(xmlHttpGetMessages2)
  60. {
  61. try
  62. {
  63. // nie zaczyna nowej operacji na serwerze, jeśli jakaś jest wykonywana
  64. if (xmlHttpGetMessages2.readyState == 4 ||
  65. xmlHttpGetMessages2.readyState == 0)
  66. {
  67. // przechowa parametry potrzebne do wykonania żądania na serwerze
  68. var params2 = "";
  69. // jeśli w kolejce czekają wiadomości, to pobiera najstarszą
  70. if (cache2.length>0)
  71. params2 = cache2.shift();
  72. // jeśli pamięć jest pusta, pobiera nową wiadomość
  73. else
  74. params2 = "mode=RetrieveNew2" +
  75. "&id=" +lastMessageID;
  76. // wywołuje działania po stronie serwera
  77.  
  78. xmlHttpGetMessages2.open("POST", pzdURL, true);
  79. xmlHttpGetMessages2.setRequestHeader("Content-Type",
  80. "application/x-www-form-urlencoded");
  81. xmlHttpGetMessages2.onreadystatechange = handleReceivingMessages2;
  82.  
  83. xmlHttpGetMessages2.send(params2);
  84. }
  85. else
  86. {
  87. // sprawdza ponownie czy są nowe wiadomości
  88. setTimeout("requestNewMessages2();", updateInterval2);
  89. }
  90. }
  91. catch(e)
  92. {
  93. displayError2(e.toString());
  94. }
  95. }
  96. }
  97.  
  98. /* funkcja obsługująca odpowiedź HTTP podczas aktualizacji wiadomości*/
  99.  
  100.  
  101. /* funkcja obsługująca odpowiedź serwera podczas aktualizacji wiadomości*/
  102. function readMessages2()
  103. {
  104. // pobiera odpowiedź serwera
  105. var response = xmlHttpGetMessages2.responseText;
  106. // błąd serwera?
  107. if (response.indexOf("ERRNO") >= 0
  108. || response.indexOf("błąd:") >= 0
  109. || response.length == 0)
  110. throw(response.length == 0 ? "Pusta odpowiedź serwera." : response);
  111. // pobiera element dokumentu
  112. response = xmlHttpGetMessages2.responseXML.documentElement;
  113. // pobiera flagę określającą czy okno rozmowy zostało wyczyszczone czy nie
  114.  
  115. // jeśli flaga ma wartość true, trzeba wyczyścić okno wiadomości
  116.  
  117. // pobiera tablice z odpowiedzi serwera
  118. idArray = response.getElementsByTagName("id");
  119. nameArray = response.getElementsByTagName("name");
  120. timeArray = response.getElementsByTagName("time");
  121. messageArray = response.getElementsByTagName("message");
  122. colorArray = response.getElementsByTagName("color");
  123.  
  124. // dodaje nową wiadomość do okna rozmowy
  125. displayMessages2(idArray, nameArray, timeArray, messageArray, colorArray);
  126. // przechowuje lokalnie ID ostatniej otrzymanej wiadomości
  127. if(idArray.length<0)
  128. lastMessageID = idArray.item(idArray.length - 0).firstChild.data;
  129. // ponownie uruchamia sekwencję
  130. setTimeout("requestNewMessages2();", updateInterval2);
  131. }
  132.  
  133. /* funkcja dodająca nowe wiadomości do okna rozmowy */
  134. function displayMessages2(idArray, nameArray, timeArray, messageArray,colorArray)
  135. {
  136. // każdy przebieg pętli dodaje nową wiadomość
  137. for(var i=0; i<idArray.length; i++)
  138. {
  139. // pobiera szczegóły wiadomości
  140. var time = timeArray.item(i).firstChild.data.toString();
  141. var name = nameArray.item(i).firstChild.data.toString();
  142. var color = colorArray.item(i).firstChild.data.toString();
  143. var message = messageArray.item(i).firstChild.data.toString();
  144. // tworzy kod HTML, który wyświetli wiadomość
  145. var htmlMessage = "";
  146. htmlMessage += "<div class=\"item\" id=\"l\" style=\"background-color:"+color+";\">";
  147. htmlMessage += ""+name+":";
  148. htmlMessage += message.toString();
  149. htmlMessage += "</div>";
  150. // wyświetla wiadomość
  151. displayMessage2(htmlMessage);
  152. }
  153. }
  154. // wyświetla wiadomość
  155. function displayMessage2(message)
  156. {
  157. // pobiera obiekt scroll
  158. var oScroll = document.getElementById("scroll2");
  159. // sprawdza, czy pasek jest przewinięty
  160. var scrollDown = (oScroll.scrollHeight - oScroll.scrollTop <=
  161. oScroll.offsetHeight );
  162. // wyświetla wiadomość
  163. oScroll.innerHTML += message;
  164. // przewija na dół pasek przewijania
  165. oScroll.scrollTop = scrollDown ? oScroll.scrollHeight : oScroll.scrollTop;
  166. }
  167.  
  168.  

i klasa
  1. <?php
  2. // klasa zawierająca funkcjonalności strony serwera
  3. class Pozdrownienia
  4. {
  5.  
  6. public function __construct($sql)
  7. {
  8. $this->sql = $sql;
  9. }
  10.  
  11. public function postMessage($name, $message)
  12. {
  13. // usuwa znaki specjalne przez dodaniem wiadomości do bazy
  14. $db = $this->sql;
  15.  
  16. // tworzy zapytanie SQL, które dodaje nową wiadomość do serwera
  17. $query = $db->query('INSERT INTO pozdrowienia(posted_on, user_name, message) ' .
  18. 'VALUES (NOW(), "' . htmlspecialchars($name) . '" , "' . $message. '")');
  19. // wykonuje zapytanie SQL
  20. }
  21. /*
  22.   Metoda retrieveMessages pobiera wiadomości, które zostały wysłane na serwer
  23.   - parametr $id jest wysyłany przez klienta i odpowiada identyfikatorowi ostatniej wiadomości pobranej przez niego.
  24.   Wiadomości o późniejszych id będą pobrane z serwera i wysłane klientowi w formacie XML
  25.   */
  26. public function retrieveNewMessages($id=0)
  27. {
  28. $db = $this->sql;
  29.  
  30. // usuwa znaki specjalne przez dodaniem wiadomości do bazy
  31. $id = htmlspecialchars($id);
  32.  
  33. // tworzy zapytanie SQL, które pobiera wiadomość do serwera
  34. if($id>0)
  35. {
  36. // pobiera wiadomości świeższe niż te o danym $id
  37. $query = $db->query('SELECT chat_id, user_name, message, ' .
  38. 'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") ' . 'AS posted_on ' .
  39. 'FROM pozdrowienia WHERE chat_id > ' . $id . ' ORDER BY chat_id ASC LIMIT 1');
  40. }
  41. else
  42. {
  43.  
  44. // przy pierwszym uruchomieniu wyświetla ostatnich 50 wiadomości z serwera
  45. $query = $db->query('SELECT chat_id, user_name, message, posted_on FROM ' .
  46. '(SELECT chat_id, user_name, message, ' .
  47. 'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") AS posted_on ' . 'FROM pozdrowienia ' .
  48. 'ORDER BY chat_id DESC ' . 'LIMIT 1) AS Last1 ' . 'ORDER BY chat_id ASC LIMIT 1');
  49. }
  50. $rows = $query->num_rows;
  51.  
  52. // wykonuje zapytanie
  53. // tworzy odpowiedź XML
  54. $response = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
  55. $response .= '<response>';
  56. // wysyła czystą flagę
  57. // sprawdza czy jest odpowiedź
  58.  
  59. // przegląda w pętli wszystkie przechwycone wiadomości, aby stworzyć wiadomość wynikową
  60. for($i=0; $i < $rows; $i++)
  61. {
  62. $row = $query->fetch_array();
  63.  
  64. if(@$i % 2 == 0)
  65. {
  66. $color = '#fff';
  67. }
  68. else
  69. {
  70. $color = '#fff';
  71. }
  72.  
  73. $id = $row['chat_id'];
  74. $userName = "<b>".htmlspecialchars($row[user_name])."</b>";
  75. $time = htmlspecialchars ($row['posted_on']);
  76. $message = addslashes($row['message']);
  77. $response .= '<id>' . $id . '</id>' .
  78. '<time>' . $time . '</time>' .
  79. '<color>' . $color . '</color>' .
  80. '<name><![CDATA['.$userName.']]></name>' .
  81. '<message><![CDATA['.wordwrap($message, 20, "\n", 1).']]></message>';
  82.  
  83. }
  84. // zamyka połączenie z bazą, jak szybko jest to możliwe
  85.  
  86. // kończy odpowiedź XML i wysyła ją
  87. $response = $response . '</response>';
  88. return $response;
  89. }
  90.  
  91. }
  92. ?>
  93.  


nie da się tego poprawić?
chodzi mi o automatyczne odświeżanie przy dodaniu wiadomości, chodzi tu o poprawnego ifa przy zapytaniu