Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: prywatne wiadomości
Forum PHP.pl > Forum > PHP
AxZx
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?
Crozin
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.
AxZx
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.
Crozin
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.
Cysiaczek
Przenoszę na PHP
AxZx
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:)
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.