Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Prywatne wiadomości
zelu
post
Post #1





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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. (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
IceManSpy
post
Post #3





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
erix
post
Post #4





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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?
Go to the top of the page
+Quote Post
zelu
post
Post #5





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
zelu
post
Post #7





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
soomal
post
Post #8





Grupa: Zarejestrowani
Postów: 38
Pomógł: 1
Dołączył: 4.03.2007

Ostrzeżenie: (0%)
-----


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łę.
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #9





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 09:01