web-dev-qa-db-fra.com

Système de messagerie en php mysql

J'ai créé un système de messagerie simple sur mon site Web où les nouveaux utilisateurs enregistrés peuvent s'envoyer un message. l'instruction mysql suivante fonctionne bien sur mon site, mais mon problème est - lorsque UserA envoie un message à UserB, le message est affiché à UserB dans sa boîte de réception, et le message est affiché à UserA dans sa boîte d'envoi maintenant si, pour certaines raisons, UserB a supprimé le message de sa boîte de réception, le message est supprimé des deux côtés, je stocke tous les messages dans un tableau, maintenant, ce que je veux réaliser est lorsque le message est supprimé de la boîte de réception il devrait rester dans la boîte d'envoi, toute aide est la bienvenue! Merci!

La structure de la table est la suivante

id   message    sentby   sentto    created

Inbox.php

$you=$_COOKIE['username'];     
$st= "SELECT* FROM mbox WHERE sentto='$you' ORDER BY ID DESC LIMIT 10";

outbox.php

$you=$_COOKIE['username'];
$st= "SELECT*FROM mbox WHERE sentby='$you' ORDER BY ID DESC LIMIT 10";
12
starkeen

Je pense que vous pouvez conserver votre structure de tableau actuelle pour le contenu du message. Plutôt que d'ajouter des colonnes séparées ou des indicateurs supprimés, il serait préférable de disposer d'une table distincte pour les boîtes aux lettres.

Donc, votre table mbox actuelle:

id   message    sentby   sentto    created

Puis une autre table pour user_mailboxes

id   user    mailbox    message_id

Vous devez effectuer trois insertions totales lors de l'écriture d'un message, une dans la table des messages, pour chaque utilisateur de la table user_mailboxes.

Donc, vos données mbox ressemblent à ceci:

id   message     sentby    sentto    created 
1    Hi There    UserA     UserB     2015-01-26
2    Hello Back  UserB     UserA     2015-01-26

Et les données user_mailboxes ressembleraient à ceci:

id   user        mailbox   message_id
1    UserA       Out       1
2    UserB       In        1
3    UserB       Out       2
4    UserA       In        2

Cela vous permet de supprimer des lignes individuelles pour la table user_mailboxes. Cela permettrait également de futurs modules complémentaires en vous permettant d'envoyer des messages à plusieurs utilisateurs en même temps (une nouvelle ligne pour chaque utilisateur) et de vous permettre d'ajouter plusieurs boîtes aux lettres si nécessaire (entrée, sortie, corbeille, Important , etc).

Pour rechercher le courrier d'un utilisateur pour une boîte aux lettres particulière, il vous suffit d'utiliser une jointure.

SELECT * FROM user_mailboxes LEFT JOIN mbox ON mbox.id = user_mailboxes.message_id WHERE user_mailboxes.user = "$user" AND user_mailboxes.mailbox = "Out";

Vous aurez besoin d'un script de nettoyage lors de la suppression pour vous assurer qu'aucun message orphelin n'existe dans la table user_mailboxes.

28
Josh

Faites juste une chose, ajoutez deux nouveaux champs dans votre table existante

  1. is_sender_deleted
  2. is_receiver_deleted

Si quelqu'un le supprime de la boîte d'envoi, définissez la valeur is_sender_deleted sur 1. Ainsi, lorsque vous affichez des données dans la boîte d'envoi, vous répertoriez simplement tous les enregistrements dont la valeur de champ is_sender_deleted est 0.

Même situation si quelqu'un le supprime de la boîte de réception puis crée la valeur 1 de is_receiver_deleted. Ainsi, lorsque vous affichez les données dans la boîte de réception, vous répertoriez simplement tous les enregistrements dont la valeur is_receiver_deleted est 0.

J'espère que cette solution vous aide.

5
Mohneesh Agrawal

J'ai aussi résolu cette tâche. Je pense qu'un tableau n'est pas utile dans ce cas. Donc, je suggère d'utiliser 2 tables:

CREATE TABLE `message` (
  `id`       int(11) NOT NULL AUTO_INCREMENT,
  `subject`  varchar(255) NOT NULL,
  `body`     text NOT NULL,
  `date`     datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `message_user` (
  `id`           int(11) NOT NULL AUTO_INCREMENT,
  `message_id`   int(11) NOT NULL,
  `user_id`      int(11) NOT NULL,
  `interlocutor` int(11) DEFAULT NULL,
  `folder`       enum('inbox','sent') NOT NULL,
  `starmark`     tinyint(1) NOT NULL DEFAULT '0',
  `unread`       tinyint(1) NOT NULL DEFAULT '1',
  `deleted`      enum('none','trash','deleted') NOT NULL DEFAULT 'none',
  PRIMARY KEY (`id`),
  CONSTRAINT `message_user_user_fk_1` FOREIGN KEY (`message_id`)   REFERENCES `message` (`id`) ON UPDATE CASCADE,
  CONSTRAINT `message_user_user_fk_2` FOREIGN KEY (`user_id`)      REFERENCES `user`    (`id`) ON UPDATE CASCADE,
  CONSTRAINT `message_user_user_fk_3` FOREIGN KEY (`interlocutor`) REFERENCES `user`    (`id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Je pense que cela peut résoudre tous vos problèmes, car les utilisateurs de messages séparés les uns des autres

Donc, pour un message, nous devons créer 3 inserts comme ceci:

public static function createMessage($subject, $body, $source, $sender_id, $receiver_id)
{
    // save DATA to message table      ($subject, $body, $source)
    // save DATA to message_user table ($message_id, $sender_id, $receiver_id, 'sent')
    // save DATA to message_user table ($message_id, $receiver_id, $sender_id, 'inbox')
}

Dans ce cas, pour chaque utilisateur, nous créons une ligne séparée dans la table message_user. Ainsi, lorsque l'utilisateur_1 supprime un message dans ce dossier de la boîte de réception, nous le marquons comme «supprimé» et n'a aucun effet sur le deuxième utilisateur.

Donc, pour obtenir tous les messages des utilisateurs, nous ne devons exécuter qu'un simple SELECT comme ceci:

SELECT *
FROM message m
    JOIN message_user mu
    ON m.id = mu.message_id
WHERE mu.deleted = 'none'
    AND mu.user_id = :user_id
2
stepozer
id   message    sentby   sentto    created deteled_from_inbox deteled_from_outbox

A votre table, j'ai ajouté 2 champs, les deux auront pour valeur YES et NO. Au début, les deux champs seront NO

$you=$_COOKIE['username'];     
$st= "SELECT* FROM mbox WHERE sentto='$you' AND deteled_from_inbox='NO' ORDER BY ID DESC LIMIT 10";

$you=$_COOKIE['username'];     
$st= "SELECT* FROM mbox WHERE sentto='$you' AND deteled_from_outbox='NO' ORDER BY ID DESC LIMIT 10";

Lorsque l'utilisateur supprime des données de la boîte de réception, vous mettez réellement à jour le deteled_from_inbox avec YES, il ne s'affichera donc pas dans la partie boîte de réception. Comme nous ne touchons pas le deteled_from_outbox, il apparaîtra dans la boîte d'envoi.

0
Sanal K

Vous pouvez ajouter une colonne du type "status" dans la table mbox,

Ensuite; Si UserB supprime le message, vous pouvez changer le statut en 1 ou UserA supprimer le message, vous pouvez changer le statut en 2.

Pour la boîte de réception:

$you=$_COOKIE['username'];
$st= "SELECT* FROM mbox WHERE sentto='$you' AND status <> '1' ORDER BY ID DESC LIMIT 10";

Pour la boîte d'envoi:

$you=$_COOKIE['username'];
$st= "SELECT* FROM mbox WHERE sentby='$you' AND status <> '2' ORDER BY ID DESC LIMIT 10";

Bonne chance.

0
vural

Au lieu de supprimer des messages de la base de données, utilisez le statut de ce message particulier
As SHOWtoSender , SHOWtoReciver , SHOWtoBoth ou SHOWtoNONE  
( utilise le type de données ENUM et la valeur par défaut SHOWtoBoth ).
Apportez des modifications à votre tableau comme suit:
id expéditeur récepteur temps

0
Dharmendra Jadon

Ajoutez une colonne telle que has_mail dont la valeur par défaut est AB, ce qui signifie que les deux utilisateurs ont le courrier. Maintenant, si quelqu'un supprime de sa boîte d'entrée/sortie, un A/B particulier sera supprimé.

$st= "SELECT* FROM mbox 
      WHERE sentto='$you' and has_mail LIKE '%". $you . "' ORDER BY ID DESC LIMIT 10";

$st= "SELECT* FROM mbox 
      WHERE sentby='$you' and has_mail LIKE '". $you . "%' ORDER BY ID DESC LIMIT 10";

Maintenant, vous pouvez supprimer le message de la base de données lorsque les deux champs sont vides:

DELETE FROM mbox WHERE LENGTH(has_mail) < 1 
0
Riad