ПР08. Создание чата

Ваша задача - разработать чат,в котором участвую два пользователя usr1 и usr2.

Для каждого пользователя чата предусмотреть поля для ввода текста сообщения и кнопку по нажатию на которую происходит отображения сообщения в чате.

Примерный вид чата для пользователя

После нажатия на кнопку "отправить" поле с текстом сообщения должно очищаться.

В чате должны отображаться все отправленные сообщения от пользователей(кроме пустых). Сообщения от разных пользователей должны отображаться с разной цветовой гаммой.

Простой пример создания чата

Прежде всего необходимо определиться со структурой БД. В данном примере БД состоит из двух таблиц usr и msg, которые хранять учётные записи пользователей и отправленые сообщения.

Примерная структура таблицы usr была рассмотрена в предыдущих практических и лециях. Структура таблицы msg представлена ниже

Структура таблицы msg
Имя
столбца
Тип данных
(размер)
Описание
idINTИндентификатор. Данное поле сделать первичным ключом и назначить автоматическое инкрементирование
u_fromVARCHAR(50)Пользователь, который написал сообщение
u_toVARCHAR(50)Пользователь, которому отправляется сообщение от пользователя [u_from]
statusENUM('NEW', 'READED')Принимает одно из двух значений: NEW - новое не прочитаное сообщение пользоватлем [u_to]; READED - сообщение прочитано пользователем [u_to]
msgVARCHARТекст сообщения
timeINTВремя отправки сообщения пользователем [u_from]

Как видно из структуры таблицы, необходимо не только хранить "от кого" и "кому" пришло сообщение, но и его состояние. Т.е. пользователь его прочитал или нет.

Рассмотрим алгоритм работы чата на примере.

Структура чата

Первая страница - это форма авторизации и ссылка на форму регистрации пользователя. Пропустим эту часть и передём к основному.

После авторизации пользователя на сайте, осуществляется перенаправление на страницу chat.html.

Страница chat.html

chat.html каждые 5с осуществляется GET запрос к странице get.php.

Страница get.php(на стороне сервера) производит выборку одного самого позднего не прочитаного сообщения из таблицы msg и отправляет его в качестве ответа на запрос.

		
    SELECT * FROM msg WHERE status='NEW' AND u_to='usr1' ORDER BY time ASC LIMIT 1
		
	

В данном примере происходит выборка одной записи из таблицы msg, в которой сообщение ещё не было прочитано пользователем usr1 и оно является самым позним из непрочитанных(ORDER BY time).

Далее необходимо поменять статус этого сообщения(на READED), по сколько считается что оно уже является прочитанным.

		
    UPDATE msg SET status='READED' WHERE u_to='usr1' AND status='NEW' ORDER BY time ASC LIMIT 1
		
	

По нажатию на кнопку "Отправить" происходит GET запрос с передачей параметров - send.php?msg=[textmsg]. Страница send.php сохраняет в таблицу msg присланое сообщение от пользователя. Выставля поле status в NEW.

Для записи в таблицу не обходимо не только текст самого сообщения, но и от кого пришло и кому прислать это сообщение. В данном случаи помогает суперглобальная переменная $_SESSION, которая хранит текущую сессию пользователя. И по сколько чат необходимо реализовать для двух пользователей usr1 и usr2, то достаточно поставить в скрипте send.php небольшое сравнение

		
    switch($_SESSION["login"]) {
        case "usr1":
            $u_to = "usr2";
            break;

        case "usr2":
            $u_to = "usr1";
            break;
    }
		
	

Требования

ВНИМАНИЕ!! Во избежание ошибок рекмендется использовать для пользователей разные браузеры или же для одного из пользователей запустить страницу в режиме инкогнито.