Система диалогов на PHP

Решил добавить на сайт систему диалогов, самую элементарную.
Но не понимаю логику, еще не дорос, чтобы самому все осознать, а инфы не так уж и много, если сравнить с инструкцией по созданию формы регистрации.
Кто-нибудь может расписать логику этой системы, желательно с командами MySQL?

Нужно отталкиваться от того, что есть 2 таблицы:
users - с уникальными id,
messages с from_id и to_id.

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


Ответы (2 шт):

Автор решения: Evgenii Izhboldin

Ну если совсем простой алгоритм:

  1. создаете скрипт 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 заполняться автоматически

  2. Создаете скрипт 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

    И выводите сообщения на форму.

  3. На главной странице 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 для отправки и получения сообщений

→ Ссылка
Автор решения: Akina

Структура таблицы (минимально)

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]
→ Ссылка