Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]informowanie uzytkownika o nowych komentarzach
Forti
post
Post #1





Grupa: Zarejestrowani
Postów: 655
Pomógł: 73
Dołączył: 2.05.2014

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


Witam

Tworze swoj pierwszy projekt w php z wykorzystaniem mysql. W tej chwili rozgryzam jak najlatwiej informowac danego uzytkownika, ze od jego ostatniej wizyty w danym temacie lub artykule sa nowe, nie czytane komentarze/posty. Wpadlem na kilka pomyslow odnosnie "flagowania" w bazie np:

0 umieszczane w tabeli user w momencie wyslania nowego artykulu, i nastepnie w momencie jego wyswietlenia przez danego uzytkownika wyslanie "1" w to miejsce. Jednak to jest bezsensu.. Kazdy artykul czy temat to nowe kolumny.

Obecnie jestem na urlopie i pisze z telefonu, nie moge sobie testowac nic, jednak nie daje mi to spokoju, mysle nad rozwiazeniem juz od wczoraj, a php ucze sie dopiero od 2 miesiecy.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
skarabe.pl
post
Post #2





Grupa: Zarejestrowani
Postów: 142
Pomógł: 49
Dołączył: 29.07.2010

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


Dodaj do tabeli mark_read pola "data_przeczytania" (ustawiane na czas bieżący przy dodawaniu/aktualizacji wiersza) i ew. "post_id" (id ostatniego posta w wątku, który użytkownik miał szansę przeczytać).
Z takiej tabeli nie usuwaj wierszy przy każdym dodaniu posta. Usuwaj je cyklicznie codziennie (albo co miesiąc) dla wpisów o "data_przeczytania" starszym niż 30 dni (zapobiegnie to puchnięciu tabeli, którego się boisz), a jednocześnie uznawaj, że jeśli ostatni post w danym wątku został napisany wcześniej niż 30 dni temu, to każdy użytkownik ma ten temat oznaczony jako przeczytany.
Temat oznaczasz jako nieprzeczytany tylko wtedy, gdy istnieje wpis w "mark_read" o "data_przeczytania" mniejszym niż data dodania ostatniego posta (warto rozszerzyć o taką kolumnę tabelę "tematy", żeby nie obliczać na żywo).

Kolumna "post_id" może posłużyć do wyróżnienia postów napisanych od ostatniej wizyty w wątku, przy czym w przypadku braku wpisu w mark_read takimi postami będą wszystkie posty napisane w ciągu ostatnich 30 dni.

Żeby jeszcze bardziej sobie uprościć życie, proponuję napisanie takiego widoku w bazie danych:
  1. CREATE OR REPLACE VIEW tematy_uzytkownicy AS
  2. SELECT
  3. t.*,
  4. u.id AS user_id,
  5. CASE
  6. WHEN t.data_ostatniego_posta < DATE_SUB(CURDATE(), INTERVAL 30 DAY) THEN 1 -- jesli ostatni post napisano 30 dni temu lub wczesniej - temat przeczytany
  7. WHEN mr.temat_id IS NULL THEN 0 -- w przeciwnym razie jesli nie ma wpisu w mark_read - temat nieprzeczytany
  8. WHEN mr.data_przeczytania < t.data_ostatniego_posta THEN 0 -- lub jesli jest wpis, ale data przeczytania jest starsza niz data dodania ostatniego posta - temat nieprzeczytany
  9. ELSE 1 -- w przeciwnym razie przeczytany
  10. END AS czy_przeczytany
  11. FROM tematy t JOIN uzytkownicy u LEFT JOIN mark_read mr ON (mr.temat_id = t.id AND mr.user_id = u.id)


Potem odpytujesz widok np. takim zapytaniem:
  1. $sql = "SELECT * FROM tematy_uzytkownicy WHERE user_id = '$user_id'";


I otrzymujesz wszystkie tematy z punktu widzenia tego użytkownika, a w kolumnie "czy_przeczytany" masz zero-jedynkową informację o tym czy dany użytkownik przeczytał temat czy nie (i czy nie należy go np. pogrubić na liście).
Go to the top of the page
+Quote Post

Posty w temacie


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: 12.10.2025 - 02:08