За последние 24 часа нас посетили 133095 программистов и 7818 роботов. Сейчас ищут 1514 программистов ...

Система личных сообщений

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 18 ноя 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    183
    Учусь делать самую простую систему сообщений, между двумя пользователями, где на сообщение можно ответить только 1 раз и это сообщение и ответ, видны у обоих пользователей.

    Вот в чём вопрос: если 1 пользователь хочет удалить какое-нибудь сообщение из своего списка всех сообщений и если он его удалит, то оно пропадёт из БД и тогда у другого пользователя оно из списка тоже исчезнет.

    Может в таком случае, сначала записать в бд, в какую-нибудь строку этого сообщения, то что 1 пользователь уже не хочет его отображать и записать цифру 1 и потом проверять, если эта цифра есть, то этому пользователю такое сообщение не выводить и когда уже второй пользователь захочет его удалить, то ещё в одну строку записывается цифра 1 и потом уже сравнивается, если цифра 1 есть в обеих строках, то удалить его из базы?
     
  2. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    В таком случае удобнее использовать одно числовое поле в котором закодировать все варианты отображения сообщения:
    0b11 - видят оба
    0b10 - видит только автор
    0b01 - видит только получатель
    0b00 - пора удалять
     
    Dimon2x и Алекс8 нравится это.
  3. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.724
    Симпатии:
    358
    можно сделать две таблицы... в одной идут сообщения с ИД, временем и телом сообщения и ид пользователя отправителя

    в другой таблице следующие поля
    ид сообщения из предыдущей таблицы
    ид получателя (на тот случай если одно сообщение надо разослать многим пользователям)
    удалено у отправителя - boolean
    удалено у получателия - boolean
    ид диалога - int для того что бы можно было объединять сообщения в диалоги.. к примеру в личке у каждого пользователя может быть несколько диалогов с одним и тем же пользователем..

    и получается что в первой таблице только список сообщений
    а вторая таблица уже их распределят куда что)

    ну как то там)) в архитектуре бд может быть где то ошибка)) нечто подобное делал когда то.. досконально не помню структуру
     
    Dimon2x нравится это.
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Dimon2x
    Создать связь многие ко многим, выглядеть должно типа такого:
    1. есть 2 юзера с именами user1 и user2
    2. когда user1 отправляет сообщение user2 то записывай сообщение и отравителю и получателю
    3. если отправитель удаляет у себя сообщение то у получателя оно все ровно остается и наоборот
    Думаю мысль ясна.
     
  5. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.601
    Симпатии:
    423
    Адрес:
    РД, г. Махачкала.
    Может логичнее создать таблицу связей?
    Например есть две таблицы:
    Код (Text):
    1. user: id, username, password
    2. message: id, user_id,  title, text, created_date, status
    3.  
    4. //status, user_id могут понадобиться для администратора, поэтому тут создаем эти столбцы.

    И таблицы входящих и исходящих сообщений.
    Код (Text):
    1. inbox: id, user_id, message_id
    2. outbox: id, user_id, message_id

    Хочется удалить сообщение, удали запись в соответствующей таблице.
     
    artoodetoo и Dimon2x нравится это.
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @mahmuzar
    я так примерно и предложил :D просто не описывал)
     
  7. VGlad

    VGlad Новичок

    С нами с:
    20 мар 2017
    Сообщения:
    17
    Симпатии:
    2
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @VGlad
    Посмотреть это всего лишь малость, а вот создать это уже умения, для меня это пока тяжело но скажу что достижимо, я не про вк систему сообщений, а просто переписка, тоже собираюсь ее написать.
     
  9. VGlad

    VGlad Новичок

    С нами с:
    20 мар 2017
    Сообщения:
    17
    Симпатии:
    2
    Так так прочти ее, не смотри :) Там есть о начальной переписке, и о том какие таблицы она использовала, а потом уже идет про диалоги и чаты. Прочти ее, она тебе не помешает.
     
  10. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    509
    Симпатии:
    40
    А резюмировать эту статью могли бы, с практической точки зрения?
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Там как раз не описано "как была", там описано во что превратилась. А это новое на несколько порядков превышает как ваши потребности так и ваши возможности.
     
    glorsh66 нравится это.
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    Могу предложить такую структуру БД:

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

    Сущности и отношения между ними:
    пользователь - 1:m - ящик
    ящик - m:m - тема (у Васи свой ящик с темами, у Пети свой, а переписки могут быть общими)
    тема - 1:m - сообщение
    пользователь - 1:m - сообщение ( здесь пользователь это автор сообщения )

    Для не совсем новичков очевидно, что m:m влечёт за собой дополнительную таблицу-связку. итого пять таблиц, считая самих пользователей.

    users(id, name)
    boxes(id, user_id, box_title)
    topics(id, box_id, subject, created_at)
    box_topic(box_id, topic_id)
    messages(id, topic_id, user_id, created_at, body)

    Когда пользователь X начинает переписку с пользователем Y,
    1. создаётся новая тема topics,
    2. создаётся сообщение messages, ссылающееся на эту тему
    3. делается две записи-связки box_topic для того чтобы новая тема попала в ящики обоих пользователей.

    Последующие ответы требуют только одно действие
    1. создаётся сообщение messages, ссылающееся на существующую тему

    Данная структура позволяет расширить реализацию переписок на нескольких пользователей, т.е. что-то типа чатрумов.
     
    glorsh66, Dimon2x и _ne_scaju_ нравится это.
  13. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @artoodetoo, по моему даже это для решения задачи автора слишком.
    Ему достаточно 2х таблиц: пользователи, сообщения.
     
    glorsh66 нравится это.
  14. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @artoodetoo
    Четкая структура, мне нравится, будет время прочитаю внятней что к чему. Но лучше бы уже готовую базу увидеть :D
     
    glorsh66 нравится это.