<?php
// uruchamia plik konfiguracyjny
require_once('config.php');
// uruchamia obsĹ_ugÄ_ bĹ_Ä_dĂłw
require_once('error_handler.php');
// klasa zawierajÄ_ca funkcjonalnoĹ_ci strony serwera
class Chat
{
// obsĹ_uguje bazÄ_ danych
private $mMysqli;
// konstruktor otwiera poĹ_Ä_czenie z bazÄ_ danych
function __construct()
{
// Ĺ_Ä_czy siÄ_ z bazÄ_
$this->mMysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
}
// destruktor zamyka poĹ_Ä_czenie z bazÄ_
public function __destruct()
{
$this->mMysqli->close();
}
// kasuje zawartoĹ_Ä_ tabeli zawierajÄ_cej wiadomoĹ_ci
public function deleteMessages()
{
// tworzy zapytanie SQL, ktĂłre dodaje nowÄ_ wiadomoĹ_Ä_ do serwera
$query = 'TRUNCATE TABLE chat';
// wykonuje zapytanie SQL
$result = $this->mMysqli->query($query);
}
/*
Metoda postMessages dodaje nowÄ_ wiadomoĹ_Ä_ do bazy
- $name odpowiada nazwie uĹźytkownika wysĹ_anej wiadomoĹ_ci
- $messsage to wysĹ_ana wiadomoĹ_Ä_
- $color zawiera parametry koloru wybranego przez uĹźytkownika
*/
public function postMessage($name, $message, $color)
{
// usuwa znaki specjalne przez dodaniem wiadomoĹ_ci do bazy
$name = $this->mMysqli->real_escape_string($name);
$message = $this->mMysqli->real_escape_string($message);
$color = $this->mMysqli->real_escape_string($color);
// tworzy zapytanie SQL, ktĂłre dodaje nowÄ_ wiadomoĹ_Ä_ do serwera
$query = 'INSERT INTO chat(posted_on, user_name, message, color) ' .
'VALUES (NOW(), "' . $name . '" , "' . $message . '","' . $color . '")';
// wykonuje zapytanie SQL
$result = $this->mMysqli->query($query);
}
/*
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)
{
// usuwa znaki specjalne przez dodaniem wiadomoĹ_ci do bazy
$id = $this->mMysqli->real_escape_string($id);
// tworzy zapytanie SQL, ktĂłre pobiera wiadomoĹ_Ä_ do serwera
if($id>0)
{
// pobiera wiadomoĹ_ci Ĺ_wieĹźsze niĹź te o danym $id
$query = 'SELECT chat_id, user_name, message, color, ' .
'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") ' . 'AS posted_on ' .
'FROM chat WHERE chat_id > ' . $id . ' ORDER BY chat_id ASC';
}
else
{
// przy pierwszym uruchomieniu wyĹ_wietla ostatnich 50 wiadomoĹ_ci z serwera
$query =
'SELECT chat_id, user_name, message, color, posted_on FROM ' .
'(SELECT chat_id, user_name, message, color, ' .
'DATE_FORMAT(posted_on, "%Y-%m-%d %H:%i:%s") AS posted_on ' . 'FROM chat ' .
'ORDER BY chat_id DESC ' . 'LIMIT 50) AS Last50 ' . 'ORDER BY chat_id ASC';
}
// wykonuje zapytanie
$result = $this->mMysqli->query($query);
// tworzy odpowiedĹş XML
$response = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
$response .= '<response>';
// wysyĹ_a czystÄ_ flagÄ_
$response .= $this->isDatabaseCleared($id);
// sprawdza czy jest odpowiedĹş
if($result->num_rows)
{
// przeglÄ_da w pÄ_tli wszystkie przechwycone wiadomoĹ_ci, aby stworzyÄ_ wiadomoĹ_Ä_ wynikowÄ_
while ($row = $result->fetch_array(MYSQLI_ASSOC))
{
$id = $row['chat_id'];
$response .= '<id>' . $id . '</id>' .
'<color><![CDATA[' . $color . ']]></color>' .
'<time>' . $time . '</time>' .
'<name><![CDATA[' . $userName . ']]></name>' .
'<message><![CDATA[' . $message . ']]></message>';
}
// zamyka poĹ_Ä_czenie z bazÄ_, jak szybko jest to moĹźliwe
$result->close();
}
// koĹ_czy odpowiedĹş XML i wysyĹ_a jÄ_
$response = $response . '</response>';
return $response;
}
/*
Metoda isDatabaseCleared sprawdza, czy baza zostaĹ_a wyczyszczona od ostatniego wywoĹ_ania serwera
- parametr $id zawiera identyfikator ostatniej wiadomoĹ_ci pobranej rpzez klienta
*/
private function isDatabaseCleared($id)
{
if($id>0)
{
//sprawdzenie liczby wierszy o id mniejszym niĹź uzyskany od klienta mĂłwi nam, czy baza byĹ_a ostatnio czyszczona
$check_clear = 'SELECT count(*) old FROM chat where chat_id<=' . $id;
$result = $this->mMysqli->query($check_clear);
$row = $result->fetch_array(MYSQLI_ASSOC);
// jeĹ_li baza byĹ_a czyszczona, tablica musi byÄ_ przeĹ_adowana
if($row['old']==0)
return '<clear>true</clear>';
}
return '<clear>false</clear>';
}
}
?>