PHP & MySQL Proste forum


(master of disaster) #1

Witam!

Potrzebuje zrobić proste forum, na potrzeby mojej strony, forum nie ma być trudne, a wręcz przeciwnie.

Nie potrzebuje działów etc. tylko możliwość tworzenia tematów i odpowiadania w nich.

Myślę że mógłbym to zrobić, tylko zastanawiam się jak to z bazą zrobić, żeby te posty które były napisane w danym temacie, w tym temacie były wyświetlane.

Jakieś pomysły ?

Pozdrawiam.


(mario@) #2

Np.

W bazie tworzysz tabele z kolumnami id-id_rodzic-autor(najlepiej jego id)-tytuł-treść-data_dodania. Gdzie id_rodzic to oczywiście id tematu głównego (dla samego rodzica ta komórka jest pusta). Następnie odpowiednie zapytania do bazy. Można też dodać kolumny ilość odpowiedzi, ilość odwiedzin (wypełniane tylko dla tematu rodzic).

Lepszym rozwiązaniem jest stworzyć dwie tabele (np. posty i tematy). W takim układzie nie trzeba kombinować, który wpis jest główny a który tylko odpowiedzią. Z tabeli tematy pobierasz konkretny id i przeszukujesz tabelę posty, pobierasz odpowiednie wpisy i je wyświetlasz (sortując według daty dodania postu).

Najlepiej zobacz sobie jak wygląda układ takich zależności np. w forum phpbb (ten drugi sposób właśnie tam obowiązuje)..


(master of disaster) #3

Dobra, zrobiłem takie tabele:

Posty:

postyi.png

Tematy:

tematy.png

Tylko jak teraz dodawać posty i tematy ?

Może jakiś przykład w przypadku odpowiadania w temacie, oraz zakładania tematu ?

pozdrawiam


(mario@) #4

Postaram się opisać jak ja to widzę, kodu nie będę pisał bo trochę by to zajęło a i warto by go wcześniej dobrze rozplanować.

Powiedzmy użytkownik xXx pisze nowy post, wciska wyślij. Wpierw odpowiednia funkcja dodaje do tabeli Tematy nową pozycję zawierającą podany przez usera tytuł i automatycznie przydzielone id (warto dodać do tej tabeli komórkę user_id/liczba odwiedzin/liczba odpowiedzi). Teraz należy uzyskać id dodanego tematu (z poprzedniej operacji) i w nowym zapytaniu/funkcji czy jak tam to rozplanujesz wysłać do tabeli Posty nową pozycję, gdzie topic_id będzie zawierać id tematu.

Na konkretnej stronie serwisu będziesz wyświetlał wszystkie tematy na forum, czyli tutaj wystarczy zapytanie do tabeli Tematy. Każdy wyświetlony temat będzie linkiem zawierającym id tematu. Gdy pan yYy wejdzie w konkretny temat (tutaj wysyłasz zapytanie do tabeli Posty i wypisujesz te które w polu topic_id mają konkretny numer i sortujesz je według daty dodania - rosnąco) i napisze nowego posta zawartość formularza zostanie przesłana do funkcji, która doda nową pozycję do tabeli Posty (gdzie topic_id będzie przesłany z formularza - ukryte pole zawierające id tematu). Warto pomyśleć też nad funkcjami usuwającymi tematy(i związanymi z nim postami)/posty i oczywiście zabezpieczającymi przed atakami.

Do tabeli Posty warto też dodać jakąś komórkę, która dla pierwszych postów w danym temacie będzie wypełniana np. 1 a dla odpowiedzi 0. W przypadku skasowania głównego posta automatycznie będzie kasowany wpis z tabeli Tematy i posty "odpowiedzi".


(master of disaster) #5

Dobra dzięki wielkie, dzięki temu mogłem to sobie jakoś wyobrazić i prawie już zrobiłem, odpowiadanie w temacie zrobione, ale pisanie nowego tematu niezupełnie otóż: mam taki kod:

= $_POST['title'];$autor = $_SESSION['uzytkownik'];$date = date("d.m.Y");$message = $_POST['message'];$message$title) {mysql_query("insert into `topics` values ('','$title','$date','$autor')")) {mysql_query("insert into `posts` values ('','3','$autor','$date','$message')")) {header("Location: index.php?link=4");

(mario@) #6
mysql_query("insert into `posts` values ('',last_insert_id(),'$autor','$date','$message')")

(master of disaster) #7

Dzięki Ci wielkie !!

Mam jeszcze (chyba już ostatni) problem otóż mam taką pętle:

= mysql_query("SELECT * FROM `posts` WHERE `topic_id` = '$id'") or die("Blad wyboru tabeli 2");    $i = 0;    while ($record = mysql_fetch_array($zapytanie, MYSQL_ASSOC)) {        echo '';        echo '';        echo '';        echo $record['user_id'];        echo '';        echo '';        echo $record['text'];        echo '';        echo '';        echo '';        $i++;    } [/code]



I zmienna [b]$record['user_id'];[/b] wyświetla id użytkownika, a ja chciałbym żeby wyświetlało imię,nazwisko z tabeli, gdzie id = $record['user_id'];

Samo zapytanie wiem jak napisać tak samo wiem jak wybrać te rekordy np za pomocą mysql_fetch_row, tylko gdzie to zapytanie wywoływać, w pętli czy poza nią, jak by to miało wyglądać ??



Pozdrawiam ;)

(mario@) #8

Najlepiej zrobić to jako osobną funkcję (zawsze może się takie zapytanie przydać do czego innego).

Powiedzmy chcesz pobrać nick i imię użytkownika z bazy. Tworzysz funkcję, która jako parametry przyjmie id usera (czyli u Ciebie $record['user_id']) oraz parametry, które chcesz pobrać z bazy. W funkcji wykonujesz zapytanie (odpowiednie dane umieszczasz w zapytaniu), następnie zwracasz tablice asocjacyjną.

W pętli (ta w której wypisujesz posty) do dowolnej zmiennej przypisujesz wynik z wywołania powyżej funkcji (przekazując do niej dane) i wtedy pozostaje tylko wypisać w dowolnych miejscach konkretne dane.


(master of disaster) #9

Czy tak będzie dobrze?:

($ajdi)     {        $baza = mysql_query("SELECT name,last_name FROM `users` WHERE id = '$ajdi' ") or die("Blad z uzytownikiem w petli");         $row = mysql_fetch_row($baza);        return $row[0].' '.$row[1];    }[/code]

i


[code=php]($record['user_id']); 



Tzn. działa, ale czy to jest poprawne ? :)

(mario@) #10

Skoro działa to znaczy że jest "poprawnie" (zresztą pojęcie względne).

Osobiście bym zrobił coś w tym stylu

($ajdi,$coPobrac='*')