Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][/mysql][js] chat nie działa dobrze
Forum PHP.pl > Forum > PHP
Lejto
Z książki przepisałem kod chatu wszystko działało. Zintegrowałem to z moją stroną, zmieniłem połączenie z bazą i zapytania i nie działa ;/.
plik który łączy z bazą
  1. <?
  2. include("config.php");
  3. error_reporting(E_WARNING);
  4.  
  5. class DB{
  6.  
  7. public $_lacz;
  8.  
  9. public function __construct()
  10. {
  11. $this->_lacz = @new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  12. if(mysqli_connect_errno() != 0)
  13. {
  14. echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error(). ', przepraszamy.';
  15. }
  16. }
  17. public function __destruct()
  18. {
  19. $this->_lacz->close();
  20. }
  21. public function query($sql)
  22. {
  23. return $this->_lacz->query($sql);
  24. }

index.php
  1. //
  2. include("db.class.php");
  3. $db = new DB();


działa dobrze
chat.php
  1. <?php
  2. global $db;
  3. require_once("chat.class.php");
  4. $mode = $_POST['mode'];
  5. $id = 0;
  6. $chat = new Chat($db);
  7. if($mode == 'SendAndRetrieveNew')
  8. {
  9. // pobiera parametry wysłanej wiadomości z aplikacji
  10. $name = $_POST['name'];
  11. $message = $_POST['message'];
  12. $color = $_POST['color'];
  13. $id = $_POST['id'];
  14. // sprawdza, czy podane wartości są poprawne
  15. if ($name != '' && $message != '' && $color != '')
  16. {
  17. // wysyła wiadomość do bazy danych
  18. $chat->postMessage($name, $message, $color);
  19. }
  20. }
  21. // jeżeli ma być wywołana metoda DeleteAndRetrieve
  22. elseif($mode == 'DeleteAndRetrieveNew')
  23. {
  24. // usuwa istniejące wiadomości
  25. $chat->deleteMessages();
  26. }
  27. // jeżeli ma być wywołana metoda Retrieve
  28. elseif($mode == 'RetrieveNew')
  29. {
  30. // poniera identyfikator ostatniej wiadomości pobranej przez klienta
  31. $id = $_POST['id'];
  32. }
  33. // czyści dane wyjściowe
  34. // nagłówki są wysyłane aby zapobiec zapisywaniu starych danych przez przeglądarki
  35. header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
  36. header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT');
  37. header('Cache-Control: no-cache, must-revalidate');
  38. header('Pragma: no-cache');
  39. header('Content-Type: text/xml, charset=UTF-8');
  40. // pobiera nową wiadomośc z serwera
  41. echo $chat->retrieveNewMessages($id);
  42. ?>

klasa
  1. <?php
  2.  
  3. // klasa zawierająca funkcjonalności strony serwera
  4. class Chat
  5. {
  6.  
  7. public function __construct($sql)
  8. {
  9. $this->sql = $sql;
  10. }
  11. // kasuje zawartość tabeli zawierającej wiadomości
  12. public function deleteMessages()
  13. {
  14. // tworzy zapytanie SQL, które dodaje nową wiadomość do serwera
  15. $query = $db->query('TRUNCATE TABLE chat');
  16. // wykonuje zapytanie SQL
  17. $result = $this->mMysqli->query($query);
  18. }
  19. /*
  20.   Metoda postMessages dodaje nową wiadomość do bazy
  21.   - $name odpowiada nazwie użytkownika wysłanej wiadomości
  22.   - $messsage to wysłana wiadomość
  23.   - $color zawiera parametry koloru wybranego przez użytkownika
  24.   */
  25. public function postMessage($name, $message, $color)
  26. {
  27. // usuwa znaki specjalne przez dodaniem wiadomości do bazy
  28. $db = $this->sql;
  29.  
  30. // tworzy zapytanie SQL, które dodaje nową wiadomość do serwera
  31. $query = $db->query('INSERT INTO chat(posted_on, user_name, message, color) ' .
  32. 'VALUES (NOW(), "' . $name . '" , "' . $message . '","' . $color . '")');
  33. // wykonuje zapytanie SQL
  34. }
  35. /*
  36.   Metoda retrieveMessages pobiera wiadomości, które zostały wysłane na serwer
  37.   - parametr $id jest wysyłany przez klienta i odpowiada identyfikatorowi ostatniej wiadomości pobranej przez niego.
  38.   Wiadomości o późniejszych id będą pobrane z serwera i wysłane klientowi w formacie XML
  39.   */
  40. public function retrieveNewMessages($id=0)
  41. {
  42. $db = $this->sql;
  43.  
  44. // usuwa znaki specjalne przez dodaniem wiadomości do bazy
  45. $id = $db->real_escape_string($id);
  46. // tworzy zapytanie SQL, które pobiera wiadomość do serwera
  47. if($id>0)
  48. {
  49. // pobiera wiadomości świeższe niż te o danym $id
  50. $query = $db->query('SELECT chat_id, user_name, message, color, ' .
  51. 'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") ' . 'AS posted_on ' .
  52. 'FROM chat WHERE chat_id > ' . $id . ' ORDER BY chat_id ASC');
  53. }
  54. else
  55. {
  56. // przy pierwszym uruchomieniu wyświetla ostatnich 50 wiadomości z serwera
  57. $query = $db->query('SELECT chat_id, user_name, message, color, posted_on FROM ' .
  58. '(SELECT chat_id, user_name, message, color, ' .
  59. 'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") AS posted_on ' . 'FROM chat ' .
  60. 'ORDER BY chat_id DESC ' . 'LIMIT 50) AS Last50 ' . 'ORDER BY chat_id ASC');
  61. }
  62. // wykonuje zapytanie
  63. // tworzy odpowiedź XML
  64. $response = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
  65. $response .= '<response>';
  66. // wysyła czystą flagę
  67. $response .= $this->isDatabaseCleared($id);
  68. // sprawdza czy jest odpowiedź
  69.  
  70. // przegląda w pętli wszystkie przechwycone wiadomości, aby stworzyć wiadomość wynikową
  71. while ($row = $query->fetch_array())
  72. {
  73. $id = $row['chat_id'];
  74. $color = htmlspecialchars ($row['color']);
  75. $userName = htmlspecialchars ($row['user_name']);
  76. $time = htmlspecialchars ($row['posted_on']);
  77. $message = htmlspecialchars ($row['message']);
  78. $response .= '<id>' . $id . '</id>' .
  79. '<color><![CDATA[' . $color . ']]></color>' .
  80. '<time>' . $time . '</time>' .
  81. '<name><![CDATA[' . $userName . ']]></name>' .
  82. '<message><![CDATA[' . $message . ']]></message>';
  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.   Metoda isDatabaseCleared sprawdza, czy baza została wyczyszczona od ostatniego wywołania serwera
  92.   - parametr $id zawiera identyfikator ostatniej wiadomości pobranej rpzez klienta
  93.   */
  94. private function isDatabaseCleared($id)
  95. {
  96. if($id>0)
  97. {
  98. //sprawdzenie liczby wierszy o id mniejszym niż uzyskany od klienta mówi nam, czy baza była ostatnio czyszczona
  99. $check_clear = $db->query('SELECT count(*) old FROM chat where chat_id<=' . $id);
  100. $row = $check_clear->fetch_array();
  101.  
  102. // jeśli baza była czyszczona, tablica musi być przeładowana
  103. if($row['old']==0)
  104. return '<clear>true</clear>';
  105. }
  106. return '<clear>false</clear>';
  107. }
  108. }
  109. ?>

i tu zmieniłem właśnie zapytania na moje czyli $db->query()
wiadomości nie pokazuje a jak chce dodac to otrzymuje błąd
Kod
Błąd podczas dostępu do serwera!
TypeError: xmlHttpGetMessages.responseXML is null

i plik .js
w nim nic nie zmieniałem


Proszę o pomoc.
erix
Z łaski swojej, pokaż ten JS, a najlepiej puść gdzieś to na żywo.

edit@down
Cytat
na żywo.
nospor
sciagnij FireFoxa, zainstaluj FireBuga i bedziesz wiedzial w czym problem...
Twoj serwer zwraca:
Cytat
<br />
<b>Fatal error</b>: Call to a member function real_escape_string() on a non-object in <b>/home/lukaszco/public_html/chat/chat.class.php</b> on line <b>45</b><br />
Lejto
poprawiłem
ale i tak nie działa
coś z bazą nie chce się połączyc
w index.php mam
  1. <?
  2. include("config.php");
  3. include("db.class.php");
  4. $db = new DB();
  5. ?>
  6. //dalszy kod

potem w chat.php
  1. <?php
  2. global $db;
  3. include("chat.class.php");
  4. $mode = $_POST['mode'];
  5. $id = 0;
  6. $chat = new Chat($db);
  7. //dalszy kod

i w klasie
  1. class Chat
  2. {
  3.  
  4. public function __construct($sql)
  5. {
  6. $this->sql = $sql;
  7. }
  8.  
  9. /*
  10.   Metoda postMessages dodaje nową wiadomość do bazy
  11.   - $name odpowiada nazwie użytkownika wysłanej wiadomości
  12.   - $messsage to wysłana wiadomość
  13.   - $color zawiera parametry koloru wybranego przez użytkownika
  14.   */
  15. public function postMessage($name, $message)
  16. {
  17.  
  18. $db = $this->sql;
  19. //zapytanie
  20.  
  21. //dalszy kod
  22. }
  23.  

także powinno być ok
nospor
link co podales wczesniej juz nie dziala
Lejto
sory, zmieniłem http://lukasz-code.nspace.pl/chat/
nospor
no to teraz masz blad:
Cytat
<br />
<b>Fatal error</b>: Call to a member function query() on a non-object in <b>/home/lukaszco/public_html/chat/chat.class.php</b> on line <b>58</b><br />
Naprawde musimy ci te bledy podawac? Nie mozesz sam ich wychwytywac? Juz ci pisalem co masz zrobic
Lejto
no wiem że mam ten błąd, ale dlaczego?
przecież dobrze mam zrobione zapytania pokazałem wyżej
e.w
  1. class DB{
  2.  
  3. public $_lacz;
  4.  
  5. public function __construct()
  6. {
  7. $this->_lacz = @new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
  8. if(mysqli_connect_errno() != 0)
  9. {
  10. echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error(). ', przepraszamy.';
  11. }
  12. }
  13. public function __destruct()
  14. {
  15. $this->_lacz->close();
  16. }
  17. public function query($sql)
  18. {
  19. return $this->_lacz->query($sql);
  20. }
  21. }
erix
Wywal te małpy z kodu, wtedy pogadamy.
nospor
Cytat
no wiem że mam ten błąd
No to pisz od razu ze masz taki blad. oszczedzisz ludziom sprawdzania i niepotrzebnego postowania.

Z jakiegos powodu $db nie jest obiektem. Sprawdzales czy ci sie wszedzie dobrze przenosi? Pewnie cos mieszasz ze zmiennymi globalnymi. Sprawdź przez "dupczenie" gdzie masz blad.
Lejto
wywaliłem
nospor
wywalenie malp nie nie da, co zresztą widać...
Zrob to o co cie prosiłem. Zapewne w globalach masz błąd.
Lejto
rzeczywiście był błąd w zmiennej, musiałem dodac plik który łączy z bazą do chat.php
http://lukasz-code.nspace.pl/chat/
już prawie działa ale jeszcze wyświetla błąd, że pusta wiadomość z serwera...
nospor
no bo gdy slesz zadanie z ID to z jakiegos powodu serwer nie odpowiada zadnym stringiem (xml). nie wiem czemu. kod tego nie mowi (a raczej wg. podanego kodu powinien sypnąc paroma linijkami xmla)
Lejto
;/, wszystko jest dobrze aż do dodania 1 wiadomości
nospor
no powiedzialem ci czemu. Teraz szukaj dlaczego przy wyslaniu ządania z ID nie idzie ci odpowiedź zwrotna. wg. kodu powinna isc. Ale niestety uraczyłeś nas tylko strzępkami kodu wiec pewnie coś sie dzieje po drodze.
Lejto
to co za kod mam jeszcze pokazać w 1 poście chyba wszystko pokazałem
co mam jeszcze podac?
nospor
no dobra, to jeszcze raz:
z kodu wynika ze powinien iść xml. Z jakiegoś powodu nie idzie. Poszukaj dlaczego - metoda przez "dupczenie" - juz ci o tej metodzie wspominalem smile.gif
Lejto
usunąłem wykonanie funkcji i funkcje
  1.  
  2. private function isDatabaseCleared($id)
  3.  
  4. {
  5.  
  6. if($id>0)
  7.  
  8. {
  9.  
  10. //sprawdzenie liczby wierszy o id mniejszym niż uzyskany od klienta mówi nam, czy baza była ostatnio czyszczona
  11.  
  12. $check_clear = $db->query('SELECT count(*) old FROM chat where chat_id<=' . $id);
  13.  
  14. $row = $check_clear->fetch_array();
  15.  
  16.  
  17.  
  18. // jeśli baza była czyszczona, tablica musi być przeładowana
  19.  
  20. if($row['old']==0)
  21.  
  22. return '<clear>true</clear>';
  23.  
  24. }
  25.  
  26. return '<clear>false</clear>';
  27.  
  28. }

i działa smile.gif
nospor
w tamtej funkcji brakuje :
$db = $this->sql;
Lejto
o ludzie, a właśnie ;/
tyle zachodu przez nieuwagę...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.