Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php+mysql] Oznaczania przeczytanych postów.
Forum PHP.pl > Forum > Przedszkole
Wykrywacz
Zastanawiam się w jaki sposób oznaczać nieprzeczytane wiadomości użytkowników.
Teoretycznie można oznaczać przeczytane w pliku cookie usera.

Ale zastanawiam się jakie znacie inne rozwiązania, bo przy tym użyciu cookie pojawia się problem nie akceptowanie przez przeglądarki i ew. utrata pliku.

Zastanawiam się czy nie lepiej było by to ewidencjonować w bazie, ale to ozacza że każdy użytkownik musi miec swoją tabelę. Choć wydaje się to dość proste, bo oznacza realnie jednego select i jednego inserta, ale generuje pewne obciążenie jeżeli mamy paruset usererów i przy tym paredziesiątysięcy postów. Bo oznacza to pareset tabel.
misiek172
hmm skoro nei chesz bazy w której zapisywałbyś w kolumnie czyt. 1 lub 0 to może TXT dla każdgo usera? czyli każdy uzytkownik ma swojego txt, który przy logowaniu użytkownika zapisywał by się w jego sesji lub cookie.Nie może być na stałe w cookie bo ktoś może sobie wyczyścić je ;P
Wykrywacz
Ale twój txt, sprowadza się do funkcjonalności cookie. Już pomijam że połowa serwerów odrzuciła by mi próbę zapisania czegokolwiek( a w każdym razie tam gdzie jest proxy).
Możesz przedstawić jak widział byś zapis w takim razie w bazie, tak żeby nie tworzyć tabeli dla każdego usera.

Zastanawiam się nad tym, aby zrobić tak, że w bazie wrzucam pole powiedzmy id sesji, nieważne. Teraz, przy loginie itp. jest to pole id sesji. Które ma zapisany ostatni ID posta. Jeżeli user patrzy na ostatnie posty no to wywietlam mu to przez for i daje $i > id_sesji;$i<aktualne_max_id;i++.

To dało by banalny rezultat. Tyle że nie mam pojęcia jak oznaczyć jeżeli user powiedzmy z 9 nieprzeczytanych przeczyta tylko 5, tak aby przy następnym logowaniu pokazało mu 4 których nadal nie przeczytał.

Edit: I tak samo nie da się używając tego, podkreślić czy to przez zmianę ikonki czy cokolwiek, że danych post jest nieprzeczytany.
mysz0n
moim zdaniem kazdy user musiałby w swojej tablicy miec liste artykułów/postów i obok zmienna 0/1 czy przeczytal czy nie. chyba nie ma innej opcji zapisania tego dla kazdego uzytkownika osobno, bo kazy odwiedził inne tematy wiec informacje powinny byc zapisywane osobno. choc moge sie mylic snitch.gif
Kicok
No i nie trzeba osobnych tabel dla każdego użytkownika. Można użyć czegoś w rodzaju:
Kod
+------+-----------+---------------+
|  ID  |  user_id  |  unread_post  |
+------+-----------+---------------+
|  1   |     4     |      2341     |
|  2   |     4     |      2342     |
|  3   |     4     |      2502     |
|  4   |    13     |      2342     |
(...)


A dla niezalogowanych użytkowników możesz zastosować prostą metodę z cookie. Wysyłać ciastko z aktualną datą i podczas kolejnych odwiedzin odznaczać posty napisane później niż data_w_cookie jako nieprzeczytane.
Wykrywacz
Kicok czy możesz przybliżyć na jakiej zasadzie miały by być umieszczane te user_id, bo nie qumam.

Uznajmy że niezalogowani wogóle mnie nie interesuje smile.gif
kriqs
no to jak cie nie interesuja niezarejestrowani to luz robisz sobie tabelke userow i dajesz im post_read smile.gif numerki czy cos ale hmmm nie wiem czy to optymalne bo jak mamy kilka tys postow to hmmm tabelka ma w cholere numerkow i co wtedy smile.gif ?. wie ktos jak jest tu na tym forum questionmark.gif albo na phpbb questionmark.gif
Wykrywacz
No właśnie szukam podobnego rozwiązania. Jak pisałem userów mam około 400 i ta liczba jest raczej stała, bo nie używane konta wylatują. Postów jest ze 20k. A interesuje mnie znalezienie rozwiązania które pozwalało by na to aby (tak jak tu i na phpbb+przemo), nieprzeczytane posty cały czas były nieprzeczytanymi. (znaczy się żeby te których się fizyncznie nie otworzy, aby się nie odznaczały).
mysz0n
tylko Kicok co to za dane w kolumnie user_id oraz unread_post?? szczegolnie to unread_post mnie interesuje co to za liczpa i na jakiej zasadzie mialaby byc generowana? bo rozumiem ze nie chodzi o rozwiazanie typu - ktos wchodzi na forum i automatycznie wsyztskie posty odznaczaja sie jako przeczytane, tylko dopiero po wejsciu w dany post ? tak?
Wykrywacz
Dokłanie mysz0n do tego zmierzam. I też nie rozumiem zasady tej tablicy którą Kicok wypisał
Cienki1980
Jak dla mnie struktura tablicy Kicoka jest prosta jak budowa gwoździa.
ID - tłumaczyć nie trzeba
ID_USER - jak wyżej
UNREAD_POST - id nieprzeczytanego posta.

W momencie jak użytkownik wchodzi w post wykonuje się zapytanie do tej tabeli i dany wiersz zostanie usunięty. Raz na jakiś czas tablica będzie czyszczona ( z komunikatem do usera, np zaraz po zalogowaniu , że liczba nieprzeczytanych postów osiągnęła wartość XXX i wszystkie zostaną oznaczone jako przeczytane ).
Wykrywacz
hmm, ale to oznacza, że jeżeli jest tworzony nowy post.
to pojawia się nagle 400 rekordów w bazie (przy 400 userach).
Czy to nie za dużo jak na jednorazowy wpis.
Zakładając, że aktywnych z 400 jest na bieżąco powiedzmy 100. To wielkość tabeli, jaka się rozrasta to w tym momencie, 300*1000 (1000 to ilość powiedzmy nieprzeczytanych postów po której następuje skasowanie starych wiadomości) co daje nam sumę 300tyś wpisów + te bieżące. Wydaje mi się trochę mułowate jak na Tylko 400 użytkowników.
Kicok
Niekoniecznie trzeba od razu wstawiać tam te wpisy po napisaniu posta. Na pewno masz gdzieś w bazie danych zapisaną datę ostatniej aktywności użytkownika. Gdy użytkownik zaloguje się ponownie odczytasz tą datę i wszystkie nowsze posty dopisujesz do tej tabeli jako nieprzeczytane.
Można też zrobić jakiś limit czasowy, np. tydzień. Jeśli ostatnie logowanie użytkownika nastąpiło 1;2;3;4;5;6;7dni temu, to wszystkie nowsze posty dopisujesz do tej tabeli. Jeśli więcej niż 7 dni temu, to dopisujesz tylko posty z ostatniego tygodnia, a całą resztę użytkownik będzie widział jako przeczytane, chociaż niekoniecznie tak musiało być.
Natomiast jeśli jakiś użytkownik uzna twoje forum za nieciekawe i już go nigdy nie odwiedzi, to przynajmniej nie będzie zatruwał bazy danych wpisami o nieprzeczytanych postach.

Sposób wymyślony na poczekaniu, więc być może ktoś już wymyślił coś prostszego i skuteczniejszego. Trzeba poszperać po kodach źródłowych for dyskusyjnych.
mysz0n
a czy nie ma tu żadnych userów phpbb ? jak tam to jest rozwiazane?
peter13135
odświeżam temat, również chciałbym osiągnąć ten sam efekt

ja myślałem nad takim rozwiązaniem (które już było przedstawione) że są 3 kolumny
id, user_id, unread_post

z tym że jak ktoś słusznie zauważył - po napisaniu posta tworzy sie tyle rekordów co ilość użytkowników

inna możliwość (którą sami ocencie, niewiem czy wypali)

do tabeli userów dodać kolumne unread_posts, i dodawać do niej po przecinku id postów, wtedy zapytanie będzie jedno

  1. UPDATE `users` SET `unread_posts`=`unread_posts`+',(id_posta)' WHERE `user_id`!=(id_uzytkownika_piszacego_post)


objaśnienie do zapytania : 1. niewiem czy [unread_posts`=`unread_posts`+',(id_posta)' to prawidłowe łączenie stringów w sql, jeśli nie to poprawcie. 2. `user_id`!=(id_uzytkownika_piszacego_post) - zaladam że user który właśnie wysłał post automatycznie go przeczytał.

korzystanie z takiej bazy nie przeczytach postów:
pobieranie wiersza, następnie rozdzielenie na tablicy przy pomocy
  1. <?php
  2. $unreaded_posts=explode(',', $row['unread_posts']);
  3. ?>


i dalej już chyba wiadomo

teraz po wejściu do każdego tematu, (zakładam że id postów są w tablicy $posts_id)

  1. <?php
  2. $unreaded_posts-=$posts_id;
  3. $unreaded_posts_string=implode(',', $unreaded_posts);
  4. ?>

-nie jestem pewny czy tego typu odejmowanie tablicy od tablicy jest prawidłowe

i zapytanie
  1. UPDATE `users` SET `unreaded_posts`='(tutaj zmienna $unreaded_posts_string)' WHERE user_id=(id zarejestrowanego usera)
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.