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

#php #mysql #private-messaging

#php #mysql #личные сообщения

Вопрос:

Я планирую создать систему PM для своих пользователей, в целом это кажется достаточно простым, но, судя по тому, как я видел руководства по созданию систем PM, есть одна проблема.

Согласно тому, как я планировал, чтобы это работало, должны были быть строки типа, user_from, user_to, а затем сообщение — user_from будет отправителем и увидит сообщение в своих отправленных сообщениях, user_to будет получателем и увидит сообщение в своем почтовом ящике. НО что, если пользователь хочет удалить сообщение из своей папки «Отправленные», но другой пользователь не хочет удалять его из своего почтового ящика??

Есть ли какой-нибудь простой способ сделать это?

Также было бы неплохо иметь сообщения в разговорах, таких как Gmail и Facebook, но, возможно, это сложно закодировать (любые учебные пособия приветствуются)?

Ответ №1:

Используйте то, что называется мягким удалением. Это означает, что когда запись «удаляется», она фактически никогда не удаляется из базы данных, а скорее устанавливается флаг delete, который позволяет вам удалять ее из пользовательского интерфейса, сохраняя при этом доступ к данным, когда вам это нужно. Итак, для этой ситуации вы могли бы создать еще два столбца с именами user_to_delete и user_from_delete. Если для любого из этих параметров установлено значение true, вы будете знать, что не следует показывать сообщение в папке входящие / исходящие соответствующего пользователя. Удачи.

Ответ №2:

Вы можете исправить проблему несколькими способами, но я бы, вероятно, добавил пару флагов (from_deleted, to_deleted) в таблицу:

  • Вместо удаления сообщения обновите соответствующий флаг до 1.
  • При составлении списка сообщений отфильтруйте те, которые были отмечены.
  • Вы можете настроить скрипт таким образом, чтобы после пометки, если оба поля помечены, вы действительно могли удалить строку.

Комментарии:

1. Похоже на другие предложения, удаление строки, когда оба сообщения помечены как удаленные, не упоминалось, хотя, спасибо. 🙂

Ответ №3:

Я предлагаю следующий дизайн базы данных:

 MESSAGES
 ---------- ------------------ --------------------------- 
|    id    |    subject_id    |    body                   |
 ---------- ------------------ --------------------------- 

SUBJECTS
 ---------- ------------- -------------- ----------------- 
|    id    |    title    |    author    |    receivers    |
 ---------- ------------- -------------- ----------------- 

INBOX
 ---------- --------------- -------------- --------------- 
|    id    |    user_id    |    msg_id    |    read       |
 ---------- --------------- -------------- --------------- 

OUTBOX
 ---------- --------------- ------------------------------ 
|    id    |    user_id    |    subject_id                |
 ---------- --------------- ------------------------------ 
  

Когда вы отправляете сообщения, вы создаете новую строку для всех получателей в таблице входящих, а в таблице исходящих — для отправителя. В таблицу сообщений вы вставляете одну строку с идентификатором темы и телом сообщения. В таблицу subjects вы вставляете одну строку с заголовком, автором и всеми получателями (если отправитель начал новую тему или переслал полный разговор или отдельное сообщение, в противном случае добавьте сообщение в таблицу messages, используя существующий ИДЕНТИФИКАТОР темы), чтобы эта информация сохранялась, даже если один из получателей удалит сообщение из своего почтового ящика (в этом случае удалите строку в таблице inbox).

Для исходящих нет необходимости в флаге ‘read’, и обратите внимание, что используется только идентификатор темы.

Ответ №4:

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

 owner_id | user_from | user_to | mailbox_folder | Message | Owner_hide | Recipient_hide
1          1           2         Sent             Hi         1           0
  

Ответ №5:

Да, есть простой способ сделать это! Наличие еще двух столбцов, соответственно sender_deleted и receiver_deleted . Если одно из них «удаляет» сообщение, значит, вы обновили столбец значением 1. например. При отображении сообщений, выборе сообщений убедитесь, что значение отличается от 1. И т.д…

Ответ №6:

Вы бы просто создали 2 строки и добавили столбец. пример:

 owner_id | user_from | user_to | mailbox_folder | Message
1          1           2         Sent             Hi
2          1           2         Inbox            Hi
  

Другие столбцы: уникальный идентификатор строки, временные метки, строка темы и т.д…

Затем ваши почтовые ящики будут построены на основе столбца owner_id, и у каждого пользователя будет своя копия, которую он может перемещать / удалять по своему усмотрению.

Чтобы добавить диалоги, вы могли бы добавить столбец или другую таблицу. Если это новое сообщение, получите новый идентификатор беседы, в противном случае используйте тот же идентификатор. Запрос по временным меткам.

Комментарии:

1. это добавляет много дублирующихся данных. Нормализация базы данных

2. @cwhelms / shrug .. она эмулирует любую другую систему.

3. Это очень мало места. Независимо от того, сколько людей ее используют, это все равно плохой дизайн. Копирование плохого дизайна еще хуже, чем его создание.

4. Рад, что вы двое смогли похлопать друг друга по спине.

Ответ №7:

Вы могли бы добавить строки user_from_deleted и user_to_deleted и отобразить сообщение, только если оно не удалено.

Чтобы отображать сообщения в разговорах, вы могли бы добавить parent_id и отображать все сообщения с одним и тем же parent_id

Ответ №8:

Система PM немного сложнее, чем одна таблица. Что, если вы отправляете личные сообщения более чем одному человеку? В этом случае вам понадобилось бы несколько таблиц. Один для пользователей, сообщений и т.д… Вы бы связали их, используя первичный и внешний ключи.

Попробуйте поискать реляционные базы данных. Это должно помочь вам начать: http://www.databasejournal.com/sqletc/article.php/1469521/Introduction-to-Relational-Databases.htm

Комментарии:

1. Это звучит очень сложно, возможно, посмотрите на это, но я не думаю, что мои навыки еще настолько хороши 🙂

2. Это сэкономит вам время позже, когда вы, возможно, захотите добавить больше функций. Просто есть несколько таблиц: пользователи, сообщения и таблица, которая связывает идентификаторы пользователей и сообщений друг с другом для пользователей и сообщений (я называю их таблицами ссылок, но это может быть неправильная формулировка :/).