Система диалогов на PHP
Решил добавить на сайт систему диалогов, самую элементарную.
Но не понимаю логику, еще не дорос, чтобы самому все осознать, а инфы не так уж и много, если сравнить с инструкцией по созданию формы регистрации.
Кто-нибудь может расписать логику этой системы, желательно с командами MySQL?
Нужно отталкиваться от того, что есть 2 таблицы:
users - с уникальными id,
messages с from_id и to_id.
Нужно чтобы пользователи могли друг другу отправлять сообщения и чтобы никто не видел эти сообщения, кроме их самих.
Ответы (2 шт):
Ну если совсем простой алгоритм:
создаете скрипт
send.php, который принимает 2 параметра:to_idиmessage, а так-же из сессии берет параметрuser_id, который будет у нас играть рольfrom_id.В таблице Messages нужно создать 5 полей:
id(автоинкремент),from_id,to_id,message,timestamp(по умолчанию вtimestampпоставить текущее время)далее в скрипте выполняем подобную команду:
INSERT INTO Messages (from_id, to_id, message) VALUES ($_SESSION['user_id']), $_POST['to_id'], $_POST['message'])- здесь если правильно создана таблица, поля id и timestamp заполняться автоматическиСоздаете скрипт messages.php, который получает GET параметр from_id. Скрипт будет выводить все сообщения от заданного юзера
в нем получаете все сообщения для юзера из сессии (т.е. текущего юзера в браузере):
SELECT * FROM Messages WHERE from_id IN ($_GET['from_id'], $_SESSION['user_id']) AND to_id IN ($_GET['from_id'], $_SESSION['user_id']) ORDER BY timestamp LIMIT 1000И выводите сообщения на форму.
На главной странице index.php, вы размещаете ссылки на пользователей, которые писали юзеру.
Получить юзеров, которые писали текущему, можно таким запросом:
SELECT DISTINCT from_id FROM Messages WHERE to_id = $_SESSION['user_id'] ORDER BY timestamp LIMIT 1000И далее в цикле выводим ссылки на messages.php?from_id=$from_id
P.S. Это очень сильно упрощенная схема. Здесь я опустил вопрос sql инъекций и прочие проверки, так напрямую из POST и GET лучше ничего не использовать. Так-же здесь нет пагинации. Кроме этого систему сообщений конечно лучше же делать асинхроно, реализуя api для отправки и получения сообщений
Структура таблицы (минимально)
CREATE TABLE message ( ID SERIAL PRIMARY KEY,
sender_id INT,
receiver_id INT,
message TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_sender_id
FOREIGN KEY (sender_id)
REFERENCES user (user_id)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT fk_receiver_id
FOREIGN KEY (receiver_id)
REFERENCES user (user_id)
ON UPDATE CASCADE
ON DELETE RESTRICT );
Запрос на получение диалога текущего пользователя (@current_user_id) и его текущего собеседника (@opponent_id)
SELECT sender_id, receiver_id, message, created_at
FROM message
WHERE @current_user_id IN (sender_id, receiver_id)
AND @opponent_id IN (sender_id, receiver_id)
ORDER BY created_at [ASC | DESC]