Saltar al contenido

Sistema de mensajería en php mysql

Solución:

Creo que puede mantener su estructura de tabla actual para el contenido del mensaje. En lugar de agregar columnas separadas o banderas eliminadas, sería mejor tener una tabla separada para los buzones de correo.

Entonces, su tabla actual de mbox:

id   message    sentby   sentto    created

Luego otra tabla para user_mailboxes

id   user    mailbox    message_id

Tendría que hacer tres inserciones en total al escribir un mensaje, una en la tabla de mensajes, para cada usuario en la tabla user_mailboxes.

Entonces, sus datos de mbox se ven así:

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

Y los datos de user_mailboxes se verían así:

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

Esto le permite eliminar filas individuales para la tabla user_mailboxes. Esto también permitiría futuros complementos al permitirle enviar mensajes a múltiples usuarios al mismo tiempo (una nueva fila para cada usuario), y permitirle agregar más de un buzón si es necesario (Entrada, Salida, Papelera, Importante , etc.).

Para buscar el correo de un usuario para un buzón en particular, solo debe usar una combinación

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

Necesitaría una secuencia de comandos de limpieza al eliminar para asegurarse de que no haya mensajes huérfanos que no existan en la tabla user_mailboxes.

Solo haga una cosa, agregue dos campos nuevos en su tabla existente

  1. is_sender_deleted
  2. is_receiver_deleted

Si alguien lo elimina de la bandeja de salida, establezca el valor de is_sender_deleted en 1. Entonces, cuando muestre datos en la bandeja de salida, simplemente enumere todos los registros cuyo campo is_sender_deleted tiene el valor 0.

La misma situación si alguien lo borra de la bandeja de entrada y luego crea el valor is_receiver_deleted 1. Entonces, cuando muestra los datos en la bandeja de entrada, simplemente enumera todos los registros cuyo valor is_receiver_deleted es 0.

Espero que esta solución te ayude.

También resolví esta tarea. Creo que una tabla no es útil en este caso. Entonces, sugiero usar 2 tablas:

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;

Creo que puede solucionar todos sus problemas, porque los usuarios de mensajes se separaron unos de otros

Entonces, para un mensaje debemos crear 3 inserciones como esta:

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')
}

En este caso, para cada usuario creamos filas separadas en la tabla. message_user. Entonces, cuando user_1 elimina un mensaje en esta carpeta de la bandeja de entrada, lo marcamos como ‘eliminado’ y no tiene ningún efecto en el segundo usuario.

Entonces, para obtener todos los mensajes de usuario, debemos ejecutar solo SELECT simple como este:

SELECT *
FROM message m
    JOIN message_user mu
    ON m.id = mu.message_id
WHERE mu.deleted = 'none'
    AND mu.user_id = :user_id
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *