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";
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.
Faites juste une chose, ajoutez deux nouveaux champs dans votre table existante
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.
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
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.
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.
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
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