Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> prywatne wiadomości
AxZx
post
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


witam,

zastanawiam się jak rozsądnie rozwiązać system prywatnych wiadomości w serwisie gdzie użytkownicy często z tego będą korzystać.
gdyby za każdym razem gdy użytkownik dostawał maila z informacją o nowej prywatnej wiadomości to gdy dostanie ich 20 to dostanie 20 maili. w mailu tym chcę wysyłać tylko informacje o nowej wiadomości - bez treści wiadomości.
nie trudno się domyśleć, że 20 to trochę dużo - może to być irytujące.
zasugerowałem się innym serwisem, w którym info o nowych wiadomościach przychodzi raz na jakiś czas - jest tam informacja o ilości nowych wiadomości.
wg mnie to jest najlepsze rozwiązanie.

jak takie coś rozwiązać?
gdy już raz zostanie wysłana informacja o tym, że jest nowa wiadomość, to ta wiadomość przy następnym sprawdzaniu nie jest już brana pod uwagę, ale gdy pojawi się nowa to jest wliczana do ilości nie przeczytanych wiadomości.

domyślam się, że musi być kolumna dodatkowa, która będzie wskazywała czy powiadomienie zostało już wysłane.
zatem można stworzyć taką strukturę tabeli:
Kod
temat, tresc, przeczytana, powiadomienie


jak teraz ułożyć zapytanie, albo zapytania, które będą pobierać email usera i ilość nie przeczytanych wiadomości?


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Przy użyciu Crona będziesz cyklicznie (np. co godz) sprawdzał i wysyłał maile. Czego potrzebujesz?
Czasu ostatniego sprawdzania - innymi słowy: time() - 3600

Teraz wystarczy pobrać wiadomości, które są nieprzeczytane i młodsze niż: time() - (time() - 3600). Tyle.
Go to the top of the page
+Quote Post
AxZx
post
Post #3





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


proste rozwiązanie.
ale co w przypadku gdy z jakichś powodów ten mail nie zostanie wysłany? bo np. chwilowo baza nie będzie działać.
wtedy w ciągu tej jednej godziny nie zostanie wysłany list, czyli ominie kolejka, no i później już wcale nie zostanie wysłana informacja, że jest nowa wiadomość.
gdyby była dodatkowa kolumna z flaga wysłane powiadomienie / nie wysłane, wtedy niezależnie od czasu utworzenia wiadomości info będzie wysłane.
dodatkowo można zrobić transakcję - dopiero jak mail na pewno zostanie wysłany wtedy zmienia się flaga, że info zostało wysłane.
dla mnie takie rozwiązanie byłoby lepsze.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Też dobre. Ewentualnie zamiast time() - 3600 możesz sobie po pomyślnym wysłaniu maili zapisać (chociażby do pliku tekstowego) aktualną datę. Następnie przy ponownym włączeniu (czyli po przewidywanej godzinie) otworzyć ten plik i pobrać wszystkie wiadomości z datą utworzenia pomiędzy TERAZ, a DATA Z PLIKU.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #5





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Przenoszę na PHP


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
AxZx
post
Post #6





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


hmm coś mi jednak nie pasuje to rozwiązanie z tym czasem.
ja to rozumiem tak, że z bazy pobieram wiadomości, które powstały w ciągu ostatnich 15 minut i mają status nie przeczytanych.

ale przecież mogą być wiadomości, które nadal nie są przeczytane a zostały utworzone wcześniej.
w takim przypadku w mailu ma być wysyłana informacja o ilości wszystkich nie przeczytanych wiadomości, a nie tylko tych z ostatnich 15 minut.

czyli problem nadal nie rozwiązany.
chyba bez dodania dodatkowej kolumny się nie obędzie.

EDIT:
to ma być coś takiego, że pobierane są wszystkie nieprzeczytane wiadomości i jeżeli któraś ma jeszcze nie ustawioną flagę info_wyslane to jest wysylany mail o ilosci nie przeczytanych i zmieniana flaga info_wyslane na 1.

EDIT:
o takie coś mi chodziło:

  1. SELECT
  2. profil.email,
  3. (SELECT count(p2.idpoczta) FROM poczta AS p2 WHERE p2.idprofil_odbiorca = p1.idprofil_odbiorca AND p2.przeczytane = 0) AS ile,
  4. group_concat(p1.idpoczta) AS idpoczta
  5. FROM poczta AS p1
  6. INNER JOIN profil ON (p1.idprofil_odbiorca = profil.idprofil)
  7. WHERE p1.powiadomienie = 0
  8. GROUP BY idprofil_odbiorca


teraz w idpoczta będę miał id wiadomości, którym trzeba zmienić flagę powiadomieniena 1.
mam nadzieję, że nic nie pominąłem, jeżeli ktoś coś zauważy błędnego w moim rozumowaniu to proszę pisać:)

EDIT:
jak na razie wszystko działa elegancko:)

Ten post edytował AxZx 14.12.2008, 17:03:19


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 23:22