Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP,MySQL] Tworzenie własnego forum - zliczanie unikalnych odsłon
Forum PHP.pl > Forum > PHP
kurkusmaximus
Witajcie!

Jestem na etapie tworzenia własnego forum. Większość zadań jakie sobie postawiłem wykonałem, lecz pozostało kilka, wydawać by się mogło bardzo łatwych, za które nie wiem jak się zabrać.
W spisie tematów posiadam kolumnę, w której wyświetlam liczbę postów i liczbę odsłon danego tematu. Chciałbym, by po wejściu w dany temat skrypt sprawdzał czy użytkownik (zalogowany bądź nie) już odwiedził ten temat, jeśli nie to licznik odsłon zwiększałby się o 1. Równocześnie chciałbym, by użytkownik wchodząc na stronę ze spisem tematów był poinformowany o nowym poście w temacie poprzez zmianę grafiki przy tytule tematu.

Baza danych
W tabeli "forum_tematy" posiadam pola:
nr------nr_dzialu------przyjazny_link------nazwa------opis------autor------data------ilosc_postow------ilosc_odslon

W jaki sposób zaplanować tabele w bazie danych, dzięki którym mógłbym wykonać te zadania?
r4xz
Cytat(kurkusmaximus @ 3.12.2011, 12:21:38 ) *
Równocześnie chciałbym, by użytkownik wchodząc na stronę ze spisem tematów był poinformowany o nowym poście w temacie poprzez zmianę grafiki przy tytule tematu.

możesz to zrobić na 2 sposoby
optymalny (lecz posiada swoje wady...): zaznaczasz tematy w których pojawił się post później, niż ostatnie logowanie
pełny: dodajesz nową tabele w której trzymasz id_tematu i id_użytkownika. po dodaniu nowego posta dodajesz id temtu i id użytkownika. użytkownik przeczyta dany post - rekord jest usuwany. tutaj musisz zważać na liczbę rekordów i kontrolować, aby jeden użytkownik miał zaznaczane ciągle max (np.) 100 tematów, w innym przypadku użytkownicy "owce" (nie logujący się od dłuższego czasu) będą niepotrzebnie generować obciążenie

--edit--
odnośnie unikalnych wizyt - tu można by to rozpatrzyć z innej strony - po co? czy na pewno taka informacja jest niezbędna do "życia"? czy opłaca się zapychać bazę danych danymi typu: temat => ip odwiedzających? sprawa wątpliwa, a decyzja należy do ciebie
acztery
a może ciasteczka questionmark.gif
r4xz
Cytat(acztery @ 3.12.2011, 13:55:32 ) *
a może ciasteczka questionmark.gif

na zasadzie połączenia wersji optymalnej z ciasteczkami? nie głupie... pobrać nowe tematy/posty od ostatniej wizyty i zapisać do cookie, a potem eliminować z cookie po przeczytaniu. sposób dobry, jednak tu potrzebna jest opinia kogoś doświadczonego - jak to wygląda od strony technicznej (pamięć cookie przy większy forach etc.), ale logicznie wygląda bardzo sensownie.
kurkusmaximus
Cytat(acztery @ 3.12.2011, 13:55:32 ) *
a może ciasteczka questionmark.gif

Nie wszyscy mają je włączone i mają ograniczoną pojemność.

Chyba znalazłem rozwiązanie na pierwszą część pytania. Tworzę tabelę "forum_odslony" gdzie będę trzymał idy tematów i ipy użytkowników w takiej formie:
nr tematu---ip
1---83.4.228.228
1---83.4.228.229
1---83.4.228.230
1---83.4.228.231
2---83.4.228.229
2---83.4.228.228
...

Z początku też myślałem o:
nr tematu---ip
1---83.4.228.228|83.4.228.228|83.4.228.228|83.4.228.228|83.4.228.228|83.4.228.228
2---83.4.228.228|83.4.228.228|83.4.228.228|83.4.228.228|83.4.228.228|83.4.228.228
...
ale wydaje mi się, że to byłoby mało efektywne

@r4xz, spróbuję
r4xz
@kurkusmaximus, a zobacz jeszcze http://stackoverflow.com/questions/4982701...-ip-in-database
acztery
teraz chyba wszystkie strony wymagają ciasteczek. % które mają je wyłączone jest mały... To tak jak by nie korzystać z flesha albo mieć wyłączona obsługę JS.
kurkusmaximus
Rozwiązany.

#odsłony
tabela-wszystko int: nr---nr_tematu---ip

  1. if( $_SERVER['HTTP_X_FORWARDED_FOR'] ){
  2. $ip_prawdziwe = $_SERVER['HTTP_X_FORWARDED_FOR'];
  3. }else{
  4. $ip_prawdziwe = $_SERVER['REMOTE_ADDR'];
  5. }
  6.  
  7. $long = ip2long($ip_prawdziwe);
  8.  
  9. if( !($long == -1 || $long === FALSE) ){
  10. $ip = sprintf("%u\n", $long);
  11.  
  12. $wynik = mysql_query("SELECT * FROM forum_odslony WHERE nr_tematu = '$t' AND ip = '$ip';") or die("błąd w pytaniu");
  13. $num_rows = mysql_num_rows($wynik);
  14.  
  15. if( $num_rows == 0 ){
  16. mysql_query("INSERT INTO forum_odslony (nr_tematu, ip) VALUES ('$t', '$ip');")or die("błąd w pytaniu");
  17. mysql_query("UPDATE forum_tematy SET ilosc_odslon = ilosc_odslon+1 WHERE nr = '$t';") or die("błąd w pytaniu");
  18. }
  19. }


#nowy post
tabela-wszystko int: nr---uzytkownik---nr_tematu---data

Po wejściu w temat sprawdzane jest czy istnieje wpis uzytkownik+nr_tematu, jesli nie, to taki wpis tworzy przypisując datę ostatniego postu. Jeżeli istnieje to wyciąga datę i porównuje z ostatnim postem w temacie. Jeśli data ostatniego postu jest większa niż ta zapisana w tabeli to aktualizuje wpis uzytkownik+nr_tematu+data.
po wejściu w wpis tematów sprawdzane jest czy data ostatniego postu jest większa niż ta zapisana w tabeli i "maluje" odpowiedni obrazek.

Idę spać.
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.