Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: forum
Forum PHP.pl > Forum > PHP
Stron: 1, 2
KRCreater
mam zamiar napisać własne forum:
1.Od czego zacząć?jakie bazy danych utworzyć i ile?
2.Korzystać z $_GET czy sesji?
kubatron
1. Używać Mysql chyba że chcesz się meczyc na plikach, a od czego zaczonć to jakiś silnik który to napędza
2. Co masz na myśli mówiąc $_GET czy sessji przeciez to nie ma nic ze soba wspolnego!
Bakus
Najlepiej zobacz w jaki sposób działają skrypty takie jak IPB, czy phpBB i na tym się bazuj...
Puciek
Cytat(KRCreater)
mam zamiar napisać własne forum:
1.Od czego zacząć?jakie bazy danych utworzyć i ile?
2.Korzystać z $_GET czy sesji?

Brzmi to trochę jak pytanai osoby która z php ma kontakt od niedlugiego czasu i całkowity brak doświadczenia w wydajnej pracy nad większymy projektami, ale zakładając że tak nie jest przedstawię ci jak ja zasiadłem to pisania własnego forum (http://fgarden.e6.pl/forum/).

Zacząłem od wybrania pomiędzy wydajnością a wielkości bazy danych. Jest to wybór zasadniczy ponieważ jeżeli zdecydujemy się na wielką bazę danych to będziemy wpisywać ilość postów, ilość tematów w danym forze, a co za tym idzie dośc sporą ilość danych. Z koleji na mniejszej wydajności (moje rozwązanie) wszystkie dane dynamiczne (ilość postów, ilość tematów w forze) pobieramy za każdym wywołaniem.

Po dokonaniu wyboru zasiadamy do choćby notatnika i zapisujemy plik jako "dokumentacja.txt" i zaczynamy zapisywać tam wirtualne tabele bazy danych, na zasadzie
Cytat(Puciek Forum Doc)
fora(5 pól)
  id, nazwa, opis, pozycja, status
      id - Numer kontrolny fora
      nazwa - Etykietka fora
      opis - Opis fora
      pozycja - Numer kolejności fora
      status - 0-Wyłączone, 1-Włączone

i dzięki temu podczas pisnaia dalszego oskryptu mogę bez łaczenia się z bazą danych odrazu sprawdzić jak wygląda dana tabela i jak się do niej odwołać.

Potem następuje mozolne skryptowanie, ja skryptowałem "warstwowo". Znaczy to tyle że najpierw powstaje jądro, potem moduł wyświetlający layout, potem modół ładujacy system mieszkańców, logowania itd.

Od kiedy forum będzie w miare funkcjonalne (możliwa rejestracja, logowanie, pisanie postów, zakładanie tematów) wypuszczamy je i ludzie dyskutują, zgłaszajac przy okazji błedy. Kiedy załatamy wskazane siadamy do kolejnych modółów i tak aż do ukończenia pracy.

Nie ma tu za dużo konkretów ponieważ tu każdy musi zachowac indywidualnosc rozwiazań, ponieważ jeśli ma to działać jak inne fora to nie ma sensu tego pisać bo jak to mówi Dragossani "Po co wyważać otwarte drzwi ?".
Vertical
Po pierwsze załóż bazę MySQL, a po drugie stwórz w niej tabelę z danymi, jakie ci potrzeba (zależy jakie to ma być forum), a po drugie: sesja i $_GET mało mają ze sobą wspólnego... powinieneś się raczej zapytać: $_GET czy $_POST... a tak na marginesie, to staraj się jak najczęściej używać $_POST... chyba, że się nie da. Wiesz... znałem kolesia, który próbował napisać "najlepsze" forum i login ustawił metodą $_GET... Szczerze odradzam smile.gifsmile.gifsmile.gif A tak nawiasem mówiąc do Puciek'a- nie gnój tak KRCreater'a, bo mu się odechce na tym forum pisać...
cool.gif
Puciek
Cytat(Vertical @ 2004-09-09 16:06:34)
A tak nawiasem mówiąc do Puciek'a- nie gnój tak KRCreater'a, bo mu się odechce na tym forum pisać...

Nie gnoje go tylko inforumuje że należy mierzyć siły na zamiary, a pisanie forum to zadanie wyższych lotów.
yavaho
Ja tez jestem na wstepnym etapie pisania forum i tez nie wiem do konca jak to zrobic choc juz mam zrobione pewne moduly.
Pochwale sie jak w tej chwili wyglada moja baza danych i przy okazji poprosze o skomentowanie tego czy dobrze ja zaplanowalem.

Forum ma byc dolaczone do istniejacej juz strony na ktorej istnieje juz baza danych z userami ktorzy maja juz okreslone rozne uprawnienia w dodatku w bazie z userami znajduja sie dwa wolne pola Integer ktore moge wykorzystac.
Odpada wiec tworzenie tablicy z userami. Pozostale tablice zaplanowalem tak:

TABLE forum
ID
nr - numer dzieki ktoremu bede mogl ustawic pozycje na stronie
temat - glowny temat forum
opis - krotki opis tematu
status - tu ustale prawa kto bedzie mogl czytac i pisac na tym forum
il_watkow - licznik (ile juz jest watkow w tym forum)
il_odpowiedzi - licznik (ile jest odpowiedzi)

TABLE watek
ID
ID_forum - powiazanie z tabela (forum)
ID_users - powiazanie z tabela (users)
temat - temat watku tworzony przez uzytkownika
data - data utworzenia watku
status - tu bede mogl np zablokowac watek
il_odpowiedzi - licznik (ile jest odpowiedzi)
il_wyswietlen - licznik (ile bylo wyswietlen)

TABLE wypowiedz
ID
ID_watek - powiazanie z tabela (watek)
ID_users - powiazanie z tabela (users)
data - data dodania wypowiedzi
tresc - no i tresc
KRCreater
yavaho zrobiłem podobnie do Ciebie tylko u mnie wszystko sie inaczej nazywa winksmiley.jpg
Nie mierze za wysoko bo z php jestem już trochę obeznany cool.gif hehe (wszystkiego nauczyłem się - można tak powiedzieć - na tym forum,a reszte wyczytałem w dokumentacji php.
Wracając do tematu, stowrzyłem 3 tabele forum_dzialy,forum_topic,forum_odp
ale mniejsza z tym.Już zrobiłem wszystko żeby mi wyświetlało - jest elegancko.
Tylko mam mały problem, nie mam pomysłu jak zrobić dla każdego usera to aby pokazywała się ikonka przy topicu którego on jeszcze nie czytał, a jak przeczyta ( kliknie w link topciu ) to się zmieni na taką które będzie symbolizowała że już to widział. A jak pojawi sie odpowiedź w tym temacie to on skoczy na początek, górę danego działu i znów pokaze się ikonka. jak to zrobić ? To ze "skoczeniem" topicu na góre zrobie tak że poprostu posortuje bazę według daty i godziny.

Ale jak zrobić te ikonki??zastosować ciastka hehe
A drugi problem to chciałem aby przy dziale pokazała się data ostatniego topicu , nazwa użytkownika który utowrzył topic i temat

Mam nadzieję że w tym mi pomożecie smile.gif

Pozdrawiam
Puciek
Wyświetlanie danych z ostatniego posta to poprostu zapytanie z order by data i limit 0,1. A potem wyświetlenie.

A co do postów to najlepiej zrobic coś na zasadzie Post Trackera w którym apisujemy przez kogo dany post został obejrzany.
KRCreater
że sam na to nie wpadłem.

post_tracker?
hmmm ja chcę to zrobić za pomoca ciastek, chcę storzyć ciacho o id topicu np. 34732 i przy wyświetleniu topicu sprawdzi czy ciacho istnieje jeżeli nie to je tworzy.
A przy wyświetlaniu listy topic'ów zadziala anlogicznie ;]

Ale w sumie to będzie działać tylko raz jak kliknie to ten topic będzie uznany jako przeczytany ciastko się zrobi i kicha, bo ja ktoś odpowie to się nie pokaże ikona już że jest nowa wiadomość, ponieważ ciastko już będzie istniało.
Więc jak by to zrobić hmmmmm rolleyes.gif
yavaho
Podczas wyswietlenia topicu nalezalo by storzyc ciacho lub oswiezyc juz istniejace i zapisac w nim liczbe ile odpowiedzi juz ma dany topic potem sprawdzac czy ta liczba wzrosla, albo zapisywac aktualny czas otwarcia topicu i potem porownac czy ostatnia odpowiedz w topicu ma pozniejszy czas.
Tylko nie wyobrazam sobie tego jak to bedzie dzialalo jak ktos dziennie otwiera kilkadziesiat topikow? Ilosc ciasteczek jest chyba ograniczona i nie kazdy klient moze miec wlaczone ciasteczka. A w moim przypadku jest tak ze serwer wogule nie wysyla ciasteczek do klientow! Mysle ze do tego trzeba by bylo wykorzystac baze danych.

Puciek - co to jest Post Tracker?
KRCreater
No dobra nie zastosuje ciastke ze względu na to że niektórzy mają to wyłączone i przedewszystkim że to może dużo zajmować miejsca.
Więc w jaki sposób w bazie mysql mam to zrobić?hmmmmmm rolleyes.gif

Proszę o jakieś sugestie jak mogę to zrobić w bazie mysql - nie stosując ciastek?
Puciek
Cytat(yavaho @ 2004-09-10 01:26:14)
Puciek - co to jest Post Tracker?

Jest to tbela w ktorej zapisane jest id kazdego posta oraz lista uzytkownikow korzy je widzieli, co w pelni rozwiazuje problem z nowymi postami. Osobiscie sam mysle nad czyms nowym poniewaz to strasznie pozera baze danych.
bigZbig
Moim zdaniem nalezy zarejestrowac date i godzine wyswietlenia danego tematu przez konkretnego usera i porownac ja z data ostatniego posta w temacie. Jezeli data ostatniego posta jest pozniejsza od daty odwiedzin to znaczy ze nalezy wyswietlic ikonke nieprzeczytane.

A tak na marginesie. Zanim zaczniecie pisac skrypty dobrze sobie wszystko przemyslcie. Uwzglednijcie np wersje jezykowe, wersje layautu. Najlepiej podpatrzec rozwiazania z innych for.

Natomiast co do pytania sesje czy GET to wcale nie jest ono bez sensu bo tak naprawde sprowadza sie do problemu przenoszenia identyfikatora sesji. W phpBB jest tak, ze jezeli z jakichs powodow automatyczne przekazywanie identyfikatora sesji (np poprzez ciasteczka) nie dziala to do kazdego adresu dolaczany jest identyfikator sesji. Dzieki temu sesje dzialaja w kazdej sytuacji bez wzgledu na ustawienia serwera czy indywidualne ustawinia przegladarek.
KRCreater
A więc co zastosować ciastka czy Post Tracker?questionmark.gif
Puciek
Zapytaj się jeszcze czy uzyć echo() czy print(), to wszystko zlaezy od ciebie.
KRCreater
nie rób ze mnie k#&%@! debila angrysmiley.gif
Pytam bardziej doświadczonych.
Może zrobimy ankiete ? ha?
Chciałbym jakąś konkretną odpowiedź
Puciek
Nie klnie sie w miejscu publicznym.

A gwoli scislosci to tutaj zdania beda podzielone, bo kazdy zyje po sowjemu a jezeli oczekujesz ze ktos bedzie cie za reke rpowadzil podajac cale zalozenia to to nie bedzie twoje forum. SWOJE FORUM MUSISZ ROBIC SAM !
KRCreater
Sorry za przeklinanie,ale kurczę wydaje mi się,a jestem nawet skłonny powiedzieć, że jestem pewien,bo ludzie odwiedzający moje forum nie będą nawet wiedzieć jak wyłączyć ciastka.Więc zastosuje ciastka,a nie post tracker'a, ale powoli już sam nie wiem co było by bardziej słuszne...
Jeżeli będa dochodziłu do mnie głosy że ludzie mają wyłączone ciastka to to zmienia poprostu

pozdro stary

ps. mam wypite troche więc moge krzywo pisać tongue.gif :żubr: haha
ps2. jak wyciągnąć z ciastka value tongue.gif bo zapomniałem $_COOKIE['i jak dalej'] hehe
yavaho
stanowczo za duzo zubra smile.gif
  1. <?php
  2. if(isset($_COOKIE['nazwa_ciacha']))
  3. $zmienna = $_COOKIE['nazwa_ciacha'];
  4. ?>
KRCreater
hehehehehehe kurcze testuje,prubuje,testuje i nie mogę napisać tego skryptu do pokazywania NOWEJ nie oglądanej odopowiedzi/nowego postu i STAREJ oglądanej odopowiedzi/postu ;/
Puciek
PROGRAMISTO, PIŁEŚ, NIE PISZ. NIE PIŁEŚ, WYPIJ !
son
Wiem, że jesteś ambitny ale ja polecam gotowe fora. One są pięknie dopracowane i nigdy nie będziesz miał niczego lepszego tongue.gif
Misiek
Hej mam pytanie do yavaho. Ale ktoś inny też może dopowiedzieć, jeśli się z nim zrozumiał. Ja też nie narzekam na nadmiar doświadczenia w większych projektach smile.gif Chodzi mi o Twój pierwszy post w tym temacie. Zamierzasz wpisywać wszystkie tematy do tabeli watek niezależnie od tego do jakiego działu forum należą? Bo rozumiem że poszczególne działy będą znajdowały się w tabeli forum. Nie lepiej dla każdego działu zrobić tabelkę? Przez słowo "dział" rozumiem to co na tym forum jest: php, php Skrypty, Po stronie przeglądarki, XML, itd.

Pozdrawiam
yavaho
Cytat(Misiek @ 2004-09-12 21:14:06)
Zamierzasz wpisywać wszystkie tematy do tabeli watek niezależnie od tego do jakiego działu forum należą?

Tak
I kazdy wątek bedzie powiazany z tabelą "forum" z odpowiednim dzialem forum.
Tak samo jak wszystkie wypowiedzi z calego forum beda w jednej tabeli i beda powiazane z tabela "watek" z jednym konkretnym watkiem.
No chyba na tym polega sens stosowania baz danych. Nie bede tworzyl nowej tabeli jezeli powstanie nowy dzial na forum.
KRCreater
mam pytanie, nie mam pojęcia jak wyciągnąć kolejne ID z danej tabeli...
Ale nie chcę tego robić wyciągając największe ID z działu i dodając do niego 1 z oczywistego powodu.
Jeżeli mam np. ID 34,35,36,37 i usunę ID 36,37 to jak utworzę nowy wiersz w tabeli to nie będzie to kontynuacja 35 czyli 36 tylko 38...

Więc jak wyciągnąć z tabeli KOLEJNE ID questionmark.gifquestionmark.gifquestionmark.gifquestionmark.gif
Jak wyciągnąć z bazy Next Autoindex questionmark.gifquestionmark.gifquestionmark.gif
Jojo
Wykonaj sobie takie zapytanie:
  1. SHOW TABLE STATUS LIKE 'nazwa_tabeli'

W wynikach będziesz miał pole 'Auto_increment'. Wartość tego pola to właśnie następny autoiundex.
KRCreater
mam kolejne pytanie dotyczące tego co akurat piszę (forum):

Piszę np. wypowiedź w textarea i kiedy w textarea zrobie enter to chciałbym - jak wyświetlę tą wypowiedź - żeby tam gdzie był w texarea enter wyświetliło się <br>

Jak to zrobić? snitch.gif
Jojo
Na php.pl jest artykuł o znakach nowej linii. Przeczytaj. Powinien Ci pomóc.
KRCreater
sorry już zapomniałęm o tej funkcji tongue.gif -> nl2br();
SHiP
Ja bym proponował poszuakć artykułów na temat: mysqla, sesji, dobrego systemu autoryzacji oraz przejrzeć przynajmniej tabele mysql ibfu ablo phpBB

Co do nowych wiadomosci. Pisze teraz cos takiego do komntrzy(masz farta co do czasu tongue.gif)
UWAGA: kod który zaraz zobaczysz jest skopiowany żywcem z mojej klasy smile.gif - dozwolone od lat 18 tongue.gif
  1. <?php
  2.  
  3.   function unreads()
  4.   {
  5.     $zapytanie = &#092;"SELECT user_last_visit FROM \".$this -> prefix.\"user WHERE user_id='\".$this -> USR_id.\"'\";
  6.     $wykonaj=mysql_query($zapytanie);
  7.     $dane=mysql_fetch_array($wykonaj);
  8.     $zapytanie = &#092;"SELECT comment_id,comment_type FROM \".$this -> prefix.\"comments WHERE comment_data>'\".$dane['user_last_visit'].\"'\";
  9.     $wykonaj=mysql_query($zapytanie);
  10.     while($dane=mysql_fetch_array($wykonaj))
  11.     {
  12.        mysql_query(&#092;"INSERT INTO \".$this -> prefix.\"unread SET user_id='\".$this -> USR_id.\"',  id='\".$dane['comment_id'].\"'\");
  13.     }
  14.   }
  15.  
  16. ?>

$this -> USR_id = twój id
$this -> prfix = prefix do bazy
I tłumaczenie... najpierw pobieram date ostatniej wizyty. Później komentarze które zostały dodane po mojej ostatniej wizycie wrzucam do tabelki unread.

I teraz mam swobode. Ponieważ baza nie jest zaśmiecana informacjami o userach którzy nie odwiedzają strony smile.gif


Tyle
yavaho
Cytat(SHiP @ 2004-09-14 15:43:49)
I tłumaczenie... najpierw pobieram date ostatniej wizyty. Później komentarze które zostały dodane po mojej ostatniej wizycie wrzucam do tabelki unread.

SHiP wytlumacz mi jeszcze raz to tlumaczenie winksmiley.jpg
"...po mojej ostatniej wizycie..." czyli gdzie? Wizycie na glownej stronie forum? Czy wizycie na konkretnym wątku i przeczytanie w nim wiadomosci?
SHiP
To jest data sotatniej wizyty na byle której podstronie forum. Po prostu zawsze wykonuje zapytanie.
  1. <?php
  2.  
  3. mysql_query(&#092;"UPDATE \".$this ->prefix.\"user SET user_last_visit='\".time().\"' WHERE user_id='\".$this -> USR_id.\"'\");
  4.  
  5. ?>


Po prosty spradzam czy podczaj mojej nieobecności doszły jakieś posty(w moim przypadku komentarze) na strone. Jeśli tak to je zapisuje to do bazy. Coś jeszcze wytłumaczyc?? biggrin.gif
yavaho
Aaa teraz rozumiem. Wyswietlasz poprostu nowe wiadomosci tak jak jest tu na forum [Pokaz nowe posty]
Myslalem ze masz jakis pomysl jak wyswietlic watki, ktorych sie jeszcze nie otwieralo lub watki w ktorych doszly nowe posty od ostatniego otwarcia tego watka. To nad czym pracuje KRCreater a mnie tez to interesuje.
Bo sama wizyta na forum nie oznacza ze sie przeczytalo wszystkie nowe posty.
KRCreater
kurde mam problem z takim szczegółem ;/

  1. <?php
  2.  
  3. $z_10 = &#092;"SELECT * FROM forum_nowe_posty WHERE user_id='\".$_SESSION['id'].\"' AND id_topicu='\".$topic['id'].\"' \";
  4. $w_10 = mysql_query($z_10);
  5. $new_post = mysql_num_rows($w_10);
  6.  
  7. echo(&#092;"ID NEW POST: \".$new_post.\"\");
  8. if($new_post == 0){
  9. $z_2 = &#092;"INSERT INTO forum_nowe_posty SET user_id='\".$_SESSION['id'].\"',id_dzialu='\".$_GET['dzial'].\"',id_topicu='\".$_GET['topic'].\"',data='\".$data.\"',godz='\".$godz.\"' \";
  10. $w_2 = mysql_query($z_2);
  11. } else {
  12. $z_2 = &#092;"UPDATE forum_nowe_posty SET data='\".$data.\"',godz='\".$godz.\"' WHERE user_id='\".$_SESSION['id'].\"' AND id_dzialu='\".$_GET['dzial'].\"' AND id_topicu='\".$topic['id'].\"' \";
  13. $w_2 = mysql_query($z_2);
  14. }
  15.  
  16. ?>


Ogólnie chodzi o to że jak w tabeli forum_nowe_posty nie ma wiersza z informacją że dany czytał dany topic to robię INSERT INTO i dodaję wiersz a jak widział to robie UPDATE i update'uje datę i godzinę jednak nieważne czy jest czy nie ma tego wiersza to i tak cały czas robi się INSERT INTO mad.gif
Dlaczego? snitch.gif
SHiP
Nie zrozumiałeś mnie
Teraz przy wyświetlaniu np listy topiców. Sprawdzam czy jest id tego topica w tabeli unread jeśli tak to daje inną grafikę.. Później podczas wyświetlania topica tworze zapytanie które usuwa informacje o tym topicu... Teraz rozumiesz?? :]

Jeżeli nie to ci napisze cały skrypt tongue.gif Moze wtedy...
yavaho
Chyba zaczynam rozumiec smile.gif
Tylko czy tabela unread nie rozrosnie sie nadmiernie? Gdyby kazdy uzytkownik czytal wszystkie watki wtedy ilosc wierszy w tabeli bedzie iloczynem uzytkownikow i watkow.
KRCreater
ja bym usuwał z tej tabeli starsze wpisy niż tydzień może dwa
SHiP
Heh nie ma tak dobrze smile.gif nowe wpisy są dodawane wtedy gdy użytkownicy odwiedzą stronę. Jeśli ktoś nie wchodzi przez rok smile.gif to baza nie jest zaśmiecana informacjami o tym że nie czytał tych wątków. Po za tym jest opcja "oznacz wszytkie jako przeczytane".

Cytat
Gdyby kazdy uzytkownik czytal wszystkie watki wtedy ilosc wierszy w tabeli bedzie iloczynem uzytkownikow i watkow.

Jest na odwrót do bazy sa zapisywane te watki które nie sa przeczytane...

Cytat
ja bym usuwał z tej tabeli starsze wpisy niż tydzień może dwa

Pomysl dobry ale tydzień/dwa to za mało...
yavaho
Cytat(SHiP @ 2004-09-16 15:04:37)
do bazy sa zapisywane te watki które nie sa przeczytane...
Dobry pomysl. Teraz chyba doloze sobie taki modol do mojego forum smile.gif
Z bazy mozna by usuwac automatycznie (a raczej trzeba) te pozycje, ktore sa powiazane z userami, ktorzy sie wypisuja z "klubu" lub z watkami, ktore zostana skasowane.
KRCreater
wracam do tego tematu - swoje forum juz dość rozwinąłem , a deser zostawiłem na koniec - czyli wyświetlanie nowych postów ...
Jak miała by wyglądać ta tabela w mysql'u?



ja robię tak:

  1. <?php
  2.  
  3.    $z44 = &#092;"SELECT * FROM user_list\";
  4.    $w44 = mysql_query($z44);
  5.  
  6.    while($t44 = mysql_fetch_array($w44)){
  7.  
  8.     $z03 =  &#092;"SELECT * FROM new_post WHERE id_usera='\".$t44['id'].\"' AND id_topicu='\".$_POST['id_topic'].\"' \";
  9.     $w03 = mysql_query($z03);
  10.     $new_id = mysql_num_rows($w03);
  11.  
  12.     echo (&#092;"\".$new_id.\" | id=\".$t44['id'].\" | id_topic=\".$_POST['id_topic'].\"<br>\");
  13.  
  14.     if(($t44['id'] != $_SESSION['id']) && ($new_id == 0)){
  15.     $z_new_post =&#092;"INSERT INTO new_post SET id_usera='\".$t44['id'].\"', id_topicu='\".$_POST['id_topic'].\"' \";
  16.     $w_new_post = mysql_query($z_new_post);
  17.     }
  18.  
  19.    }
  20.  
  21. ?>


Ale zastanawiam się nad robienie na odwrót, ponieważ teraz jak ktoś przeczyta post'a to usunie się z bazy zapis, że ktoś go czytał. Jednak mniej miejsca chyba zajmie jak będe zapisywał to że ktoś przeczytał.

ale z drugiej strony jak zrobie opcje "odznacz wszystkie jako przeczytane" to będę musiał zapisać wszystkie topici, a wygodniej było by je usunąć...


***

Mam kolejny pomysł co to post_tracker'a . Mianowicie można dodać do tabeli z topicami (u mnie forum_topic) pole ost_data_odp oraz czek_new_post i porównać ost_data_odp z aktualną datą jeśli jest np. różnica większa niż 2 tygodnie wtedy ustawić w czek_new_post jako przeczytane (np. value=1) i wtedy opróżnić tabele post_tracker (u mnie new_post) a jak pojawi się wypowiedź nowsza wtedy uaktualnić tabele post_tracker.
scanner
1. Przy każdym wyświetleniu strony dodajesz do pewnej tablicy ID wszystkich nieprzeczytanych postów.
2. Serializujesz tablice w ciastku u odwiedzajacego.
3. Przy wyswietleniu jakiegos watku/posta usuwasz odpowiednie ID z tablicy i nadpisujesz ciastko.
4. "Zaznacz wszystkie jako przeczytane" czysci tablice.

Przy pierwszym wejsciu na stronę user dostanie WSZYSTKIE istniejace posty na stronie, co sie zgadza, bo nic jeszcze nie przeczytał.

Nice&Softly.
KRCreater
tylko cholera tak jak ktoś powiedział w tym topicu, że tabela new_post będzie zawierała iloczyn topiców i userów ;/ a to będzie dużo zajmowało...szkoda sadsmiley02.gif

Jeszcze mam jeden pomysł , aby nowe posty to były tylko ostatnie 20 ich...bo po co ma być zaśmiecana baza wszystkimi. A oczywiście 20 z każdego działu
yavaho
Cytat(KRCreater @ 2004-10-04 20:39:04)
Jeszcze mam jeden pomysł , aby nowe posty to były tylko ostatnie 20 ich...bo po co ma być zaśmiecana baza wszystkimi. A oczywiście 20 z każdego działu

Masz na mysli posty? czy topiki?
Ja myslalem zrobic tabele w ktorej powiaze tylko userow z danymi topicami (zadnych informacji o postach bym nie zapisywal - za duzo by tego bylo!).
I wtedy jezeli w bazie danych zapiszesz date odwiedzenia danego topicu to przy ponownym wejsciu usera na strone bedzie wiadome ktore posty nie przeczytal w danym topicu - te z pozniejsza data.
Zakladajac oczywiscie ze gdy user otwiera dany topic, to w tym momencie wszystkie posty ktore tam sa beda oznaczone jako przeczytane.
Denver
http://gizycko.one.pl/ - moje forum.

Pisałem je długo, w sumie (z długimi przerwami) będzie już ponad rok. Po drodze pojawiało się mnóstwo problemów, ale dzięki nim lepiej poznałem php i MySQL. Pozdrawiam i życzę pomyślności w dobrnięciu do celu smile.gif
scanner
Cytat(KRCreater @ 2004-10-04 20:39:04)
tylko cholera tak jak ktoś powiedział w tym topicu, że tabela new_post będzie zawierała iloczyn topiców i userów ;/ a to będzie dużo zajmowało...szkoda sadsmiley02.gif

Jeszcze mam jeden pomysł , aby nowe posty to były tylko ostatnie 20 ich...bo po co ma być zaśmiecana baza wszystkimi. A oczywiście 20 z każdego działu

A kto mówi o iloczynie "user * nowe_posty" ?
Czy trzeba dac gotowca, żeby wyjaśnić prosty algorytm?

  1. <?php
  2. // Zaczynamy !!!
  3. // User oczywiscie jest zalogowany
  4.  
  5. $aNewPosts = readNew(); // Odczytuje ID wszystkich postó dodanych PO ostatniej wizycie usera
  6.  
  7. {
  8. $aUnreaded = array_merge( array_values( $_COOKIE['Unreaded'] ), array_values( $aNewPosts ) );
  9. }
  10.  
  11. // I teraz mamy listę wszystkich postów których user nie przeczytał.
  12. // Wyświetlając jakiś wątek po prostu usuwamy odpowiednie wartości z tabeli
  13. // bo przecież mamy ID kazdefo wyświetlanego posta
  14.  
  15. // \"Zaznacz wszystkie / bieżące forum jako przeczytane\" to też usunięcie
  16. // całej tablicy lub odpowiednich wartości.
  17.  
  18. /**
  19. * Uwaga !
  20. */
  21. setcookie( 'Unreaded', $aUnreaded, ... );
  22. /**
  23. * To wywołujemy PO wyświetleniu wszystkich postów
  24. * Co dla osoby uzywającej szablomów lub funckji serii ob_*();
  25. * NIe powinno byc problemem
  26. */
  27. ?>


Jednym słowem:
1. Czytamy cookie usera
2. Modyfikujemy tablice dodajac i czyszcząc odpowiednie wartości
3. Wyświetlamy stronę dodatkowo modyfikując tabelę
4. Zapisujemy cookie
5. TheEnd

Ja widac na załączonym obrazku, każdy user ma właśna tablicę.
Aby zapewnic "pezenościopść usera, możemy jego $_COOKIE['Unreaded'] serializować w bazie w tabeli zaraz przy jego profilu i jesli nie ma ciastka, to patrzeć, czy taka serializacja jest. Jeśłi nie ma ani tego, ani tego, to mamy po porostu nowego usera.

Jeśli okaże się, że ilość danych w ciastku przekroczy magioczne 4 kilobajty, $Unreaded zapisujemy tylko w bazie.

Jeszcze jakieś pytania?
KRCreater
A jeśli ktoś ma wyłączone ciastka ? Na ciastkach mógł bym to zrobić ale ja zrobiłem post_tracer'a , który będzie sporo zajmował ale za przyjemność trzeba płacić.
scanner
No pozostajesz przy samej bazie. Ale nie zaznaczasz tego co kto przeczytal, tylko czego nie przeczytał według tego, co powiedziałem wyżej.

Każdy user ma pole TEXT przy swoim profilu, gdzie pchasz zserializowana tablicę ID nieprzeczytanych.
misterLu
Problem można rozwiąząc beż użycia cookies, bez tabel z przeczytanymi/nieprzeczytanymi postami.

Wystarczy w tabeli z użytkownikami dodać 1 kolumnę: data_ostatniego_logowania (najlepiej timestamp) i przy każdym poście/temacie dodać (o ile nie ma)kolumnę data_dodania. i w tej chwili wszystko już mamy, nie potrzeba nam żadnych COOKIES, dodatkowych tablic, ani nic.

Aby uzyskać nieprzeczytane posty wystarczy wybrać z bazy te, które mają świeższą datę od daty ostatniego_logowania usera wchodzącego na stronę.
yavaho
Data ostatniego logowania nie gwarantuje ze uzytkownik wogule coś czytał, a zawlaszcza ze przeczytal wszystkie posty - bo chyba tylko tak by to dzialalo.
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.