Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prywatne wiadomości
Forum PHP.pl > Forum > Bazy danych > MySQL
zelu
Mam do zaprojektowania system prywatnych wiadomości. Problem w tym, że nie ma się to odbywać na zasadzie skrzynki odbiorczej/nadawczej, a po kliknięciu na link ma się pokazywać ostatnie 5 wiadomości pomiędzy dwoma użytkownikami. Czyli mniej więcej coś takiego:

User1: Tekst wiadomości usera1 do usera2
User2: Odpowiedź od usera2 do usera1
User1: Odpowiedź na odpowiedź
User2: Kolejna odpowiedź na odpowiedź usera1
(itd)

Mój problem pojawia się przy kasowaniu wiadomości. Naturalnym jest, że jeżeli User1 skasuje u siebie rozmowę, to powinna się ona pojawiać nadal u Usera2. Niestety nie mogę wpaść na żadne sensowne rozwiązanie tego problemu na poziomie bazy danych.

Może ktoś robił już coś podobnego?


Pozdrawiam
erix
Cytat
Naturalnym jest, że jeżeli User1 skasuje u siebie rozmowę, to powinna się ona pojawiać nadal u Usera2. Niestety nie mogę wpaść na żadne sensowne rozwiązanie tego problemu na poziomie bazy danych.

Dodatkowe pola:
  • user1deleted
  • user2deleted

przy wybieraniu wyciągasz tylko te, które nie mają *deleted ustawionego na 1. Fizycznie z bazy kasujesz tylko te, które mają oba *deleted na 1. winksmiley.jpg
IceManSpy
A jak masz zrobione tabele? Możesz tworzyć np dla każdego usera tabelę, w której trzymasz odebrane i nadane wiadomości. Wtedy sprawa jest prosta, ob każdy jest niezależny.
erix
Cytat
A jak masz zrobione tabele? Możesz tworzyć np dla każdego usera tabelę

Jak sobie wyobrażasz np. dziesiątki tysięcy tabel? Poza tym, po co dublować dane?
zelu
OK, ale jak mam rozpoznać które pole należy do którego usera?

Wiadomości wyciągam takim zapytaniem:
  1. SELECT *
  2. FROM (
  3. SELECT u.U_Name AS uFrom, c.message, c.created_at
  4. FROM connects c
  5. JOIN users u ON c.from_id = u.U_ID
  6. WHERE
  7. ( c.from_id = ' . (int)$_SESSION['uid'] . ' AND c.to_id = ' . (int)$user_id . ') OR
  8. ( c.from_id = ' . (int)$user_id . ' AND c.to_id = ' . (int)$_SESSION['uid'] . ')
  9. ORDER BY c.created_at DESC LIMIT 0,5
  10. ) AS connect
  11. ORDER BY connect.created_at ASC';


Jeżeli użytkownik usuwa rozmowę, to usuwa ja u siebie w całości. Czyli po prostu na liście nie pokazuje mu się nazwa drugiego użytkownika. Jak wtedy wyfiltrować, który użytkownik usunął rozmowę, a który nie? Da się to zrobić na poziomie powyższego zapytania czy muszę to sprawdzać na poziomie PHP?
erix
Jak rozpoznawać? Przecież masz pola from_id[/] i [i]to_id. Zamiast kasować przez DELETE robisz UPDATE i ustawiasz odpowiednią flagę.

Żeby nie zaciemniać - deleted1 i deleted2, to byłoby odpowiednio from_deleted i to_deleted.
zelu
No tylko, że w takiej historii wiadomości userzy są na zmianę w polach from i to. Musiałbym wtedy sprawdzać kto byl w polu from w pierwszej wiadomości (jako inicjujący rozmowę). Tak jak mówiłem: usunięcie rozmowy przez jednego z użytkowników oznacza, że nie wyświetla mu się żadna wiadomość wymieniana przez daną parę użytkowników.

Ewentualnie zmienić strukturę bazy na coś takiego:

  1. id | user1 | user2 | who_sent | message


I wtedy przy każdej kolejnej wiadomości zachowywać kolejność userów 1 i 2 (bez względu kto wysyła wiadomość lub odpowiedź) a zapisywać w polu who_sent nadawcę konkretnej (pojedynczej wiadomości).
soomal
Co powiesz na tabelę na "usunięte" wiadomości.
user_id | message_id
Jak user "usunie" rozmowę to wszystkie wiadomości tu ładujesz. Potem co jakiś czas sprawdzasz i jak obaj użytkownicy mają id rozmowy w tej tabeli to usuwasz na stałę.
dr_bonzo
1. Kazdy z userow dostaje swoja kopie wiadomosci == wszystko jest proste, ale zajmuje 2x wiecej miejsca

2. Opcja - twoja - zapisujesz kto wyslal, kto dostal, czy nadawca usunal, czy odbiorca usunal

Jesli user usuwa konwersjacje z userem dwa to:
* nadane wiadomosci usera
** ustawiasz nadawca_usunal where nadawca = user and odbiorca = user2
* odebrane wiadomosci usera
** ustawiasz odbiorca_usunal where nadawca = user2 and odbiorca = user
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.