Kako Napraviti PHP/MySQL Forum

U ovom tutorialu ću vam pokazati kako napraviti forum koristeći PHP i MySQL. Prije samog programiranje uvijek je dobro napraviti , tj. nacrtati na papiru podatkovni model, kao npr. ER model. ER model neću objašnjavati ovdje jer bi onda ovaj tutorial postao preopširan, držat ćemo se samo onog što nam je potrebno za izradu foruma.

Definirajte neke enitete koje će biti nazivi tablica u vašoj MySQL bazi podataka. Entitet je nešto što ima suštinu , bit uglavnom neka imenica o kojoj morate pohranjivati podatke. Ja sam definirao sljedeće enitete: korisnici, teme, clanak, kategorije. Za svaki entitet definirajte njegove atribute:

korisnici : korisnik_id, korisnicko_ime, korisnik_zaporka, korisnik_email, korisnik_datum , korisnik_level
kategorije: kat_id, kat_ime, kat_opis
teme:tema_id,tema_subject, tema_datum, tema_kat,tema_od
clanak: clanak_id,clanak_sadrzaj, clanak_datum, clanak_tema, clanak_od

Nakon što ste definirali entite i atribute, potrebno je napisati SQL kod. Ovdje ću detaljno objasniti pisanje SQL koda, jako je jednostavno, ako ne volite sql i niste vješti u pisanju koda preporučujem , da napravite tablice korištenjem funkcionalnosti phpMyAdmin kao Create Table, Insert rows i sl.

Kako napraviti Tablicu pomoću SQL koda:

Za izradu tablice korisnici, koja predstavlja entitet korisnici koristite sljedeći kod:

CREATE TABLE korisnici (
korisnik_id INT(8) NOT NULL AUTO_INCREMENT,
korisnicko_ime VARCHAR(30) NOT NULL,
korisnik_zaporka VARCHAR(255) NOT NULL,
korisnik_email VARCHAR(255) NOT NULL,
korisnik_datum DATETIME NOT NULL,
korisnik_level INT(8) NOT NULL,
UNIQUE INDEX user_name_unique (korisnicko_ime),
PRIMARY KEY (korisnik_id)
) ;

Gore navedenim kodom napravili smo tablicu s nazivom korisnici i atributima korisnik_id, korisnicko_ime, korisnik_zaporka, korisnik_email, korisnik_datum , korisnik_level

Atribut korisnik_id je tip cjelebrojnog podatka tj. INT (1,2,3,4,5 itd) , taj atribut ne može biti NULL i postavljen je na auto_increment , što znači da će se automatski povećavati za unos svakog retka u tablicu , tj. ne morate se uopće brinuti oko unosa tog atributa. Na dnu tablice možete vidjeti da je user_id definiran kao primarni ključ, koji služi kako bi jednoznačno odredio svaki redak u tablici, tj. ne mogu postojati dva retka u tablici koji imaju isti primarni ključ .

Atribut korisnicko_ime je tip varchar podataka, to je polje u koje može stati u ovom slučaju 30 znakova. Atribut je postavljen na NOT NULL , znači ne može postajati null vrijednost , te je postavljen na UNIQUE što znači da ne mogu postojati dva ista korisnička imena .

Atribut korisnik_zaporka je tip varchar podataka, u koji može stati maksimalno 255 znakova i ne može biti NULL.

Atribut korisnik_email je identičan što se tiče strukture atributu korisnik_zaporka .

Atribut korisnik_datum je tip podatka koji predstavlja datum, u taj atribut spremamo podatak kada je korisnik registriran.

Atribut korisnik_level predstavlja razinu korisnika npr. 0 za običnog korisnika, a 1 za administratora.

Za izradu tablice kategorije koristite sljedeći kod :

CREATE TABLE kategorije (
kat_id INT(8) NOT NULL AUTO_INCREMENT,
kat_ime VARCHAR(255) NOT NULL,
kat_opis VARCHAR(255) NOT NULL,
UNIQUE INDEX kat_ime_unique (kat_ime),
PRIMARY KEY (kat_id )
) ;

Atributi ove tablice rade na skoro identičan način kao u tablici korisnici, pa ih neću detaljno objašnjavati.

Za izradu tablice teme koristite sljedeći SQL kod:

CREATE TABLE teme (
tema_id INT(8) NOT NULL AUTO_INCREMENT,
tema_subject VARCHAR(255) NOT NULL,
tema_datum DATETIME NOT NULL,
tema_kat INT(8) NOT NULL,
tema_od INT(8) NOT NULL,
PRIMARY KEY (tema_id)
) ;

topic_cat atribut pokazuje na kategoriju kojoj tema pripada. Ostali Atributi su jasni sami po sebi, pa ih nema potrebe objašnjavati.

Za izradu tablice clanak koristite sljedeći SQL kod:

CREATE TABLE clanak (
clanak_id INT(8) NOT NULL AUTO_INCREMENT,
clanak_sadrzaj TEXT NOT NULL,
clanak_datum DATETIME NOT NULL,
clanak_tema INT(8) NOT NULL,
clanak_od INT(8) NOT NULL,
PRIMARY KEY (clanak_id)
) ;

SQL upite možete izvršiti preko sustava za bazu podataka kao što je PhpMyadmin, također ako ne volite pisati sql kod možete ići preko opcija u PhpMyadminu i dodavati jedan po jedan atribut. Ovdje ću vam pokazati oba dva načina.
Logirajte se u Phpmyadmin, korisničke podatke ste vjerovatno dobili od kompanije od koje ste zakupili web server. Lijevo izaberite bazu podataka u koju želite dodati tablice , ili napravite novu bazu podataka.

baza podataka izrada

Ako hoćete napraviti tablicu unosom SQL koda , kliknite na tab SQL

sql

Kopirajte gore navedene SQL kodove u polje i kliknite na Kreni

sql  kod kopiraj

Ako je tablica uspješno napravljena dobiti će te sljedeću poruku

upit uspjesan

Drugi način za stvaranje tablica je upotrebom opcija Phpmyadmina, koje će automatski generirati sql kod. Odite na tab Struktura i vidjeti će te opciju Izradi novu tablicu u bazi podataka, upišite naziv tablice , broj polja, atribute, tipove i ograničenja. Ako ne volite pisati SQL kod ovo je odličan način za izradu tablica.

opcija napravi

To bi bilo sve što se tiče izrade baze podataka. Sad idemo sa programiranjem PHP-a, HTML-a i CSSS-a.  Programiranjem ćemo napraviti  datoteke koje ćemo povezati na određeni način.  Cilj ovog tutoriala je objasniti najjednostavniji mogući način izrade foruma , tj. posjetitelja ovog članka naučiti neke osnovne stvari koje su potrebne za programiranje foruma.  U ovom djelu članka ću proći kroz glavne dijelove programskog koda i objasniti ih .  Ovaj forum je funkcionalan, ali je daleko od idealnog  foruma, ranjiv je na sigurnosne prijetnje.

 

 

Header,php

Header.php se sastoji od osnovnih html tagova kao title, meta, description, keywords … Mislim da njih nema smisla objašnjavati , jasni su sami po sebi.    Menu div služi kao popis linkova . userbar div će se koristiti kao mali dio na vrhu koji će sadržavati informacije
kao korisničko ime i poveznicu za od logiranje. Možete primjetiti da nedostaju djelovi HTML koda kao </body> i </html>. Ti dijelovi će biti dodani u footer.php,.Unutar header.php pokrećemo sesiju pomoću php funkcije session_start();  . Također provjeravamo da li je korisnik logiran ili ne pomoću naredbe if($_SESSION[‘signed_in’])   .  $_SESSION je jako korisna php varijabla  jer se podatci iz nje mogu koristiti i na drugima stranicama sve dok se ne prekine sesija.  U tu varijablu možemo spremiti hrpu vrijednosti samo parametar promjenimo npr. $_SESSION[‘signed_in’], $_SESSION[‘username’], $_SESSION[‘pass’] itd..   Header.php ćemo dodati u sve ostale stranice pomoću naredbe include ‘header.php’;  .

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <meta name="description" content="kratki opis ." /> 
 <meta name="keywords" content="ovdje dodajte kljucne rijeci" /> 
 <title>PHP-MySQL forum</title> 
 <link rel="stylesheet" href="style.css" type="text/css"> 
 </head> 
 <body> 
 <?php
 session_start(); ?>
 <h1>Moj forum</h1> 
 <div id="wrapper"> 
 <div id="menu"> 
 <a class="item" href="/index.php">Pocetna</a> - 
 <a class="item" href="/create_topic.php">Napravi temu</a> - 
 <a class="item" href="/create_cat.php">Napravi kategoriju</a> 
 <div id="userbar"> 

<div id="userbar"> 
<?php 
 if($_SESSION['signed_in']) 
 { 
 echo 'Hello' . $_SESSION['user_name'] . '. Nisi ti ? <a href="signout.php">Odlogiraj se</a>'; 
 } 
 else 
 { 
 echo '<a href="signin.php">Logiraj se</a> ili <a href="sign up">Registriraj se</a>.'; 
 } 
 ?>
</div> 
 </div> 
 <div id="content">

 

Connect.php

 

Jednostavna datoteka  za spajanje na bazu podataka. Mora se uključiti u sve stranice na kojima se koristi baza .

Upišite vlastite korisničke podatke u connect.php  kao korisničko ime i zaporku baze podataka

 

<?php 
//connect.php 
$server = 'localhost'; 
$username = 'root'; 
$password = ''; 
$database = 'baza_testiranje'; 
if(!mysql_connect($server, $username, $password)) 
{ 
 exit('Greška: Nemožemo uspostaviti konekciju'); 
}
mysql_select_db("$database")or die("cannot select DB");

?>

Signup.php

 

Ova php datoteka se koristi za registriranje korisnika. Prilikom registracije potrebno je unijeti podatke u bazu , zato je potrebno uključiti datoteku connect.php , kako bi se spojili na bazu.   Prvo provjeravamo varijablu $_SERVER[‘REQUEST_METHOD’] da li je različita od POST . Ako je različita od POST, to znači da korisnik još nije unjeo podatke u  HTML formu i u tom slučaju podatci se ne unose u bazu nego se korisniku nudi mogućnost unosa podataka u formu. Inače HTTP, temeljni protokol Interneta na aplikacisjom sloju najčešće koristi dvije metode GET i POST. GET metoda je pristup datoteka poslužitelju preko URL-a i u tijelu poruke  zahtjeva se ne šalju nikakvi podatci , dok kod POST metode se šalju podatci u tijelu poruke zahtjeva , i to  obično ide preko neke HTML forme, npr. kad na nekom forumu unesemo svoje podatke i kliknemo na gumb registriraj se. Naredbom $korisnik=$_POST[‘user_name’]; u varijablu $ korisnik spremamo podatke koj su poslani preko HTML forme tj. zahtjeva atribut user_name mora odgovarati nazivu atributa name u formi npr  <input type=”text” name=”user_name” />

Ako $_SERVER[‘REQUEST_METHOD’] nije različita od POST onda podatke unosimo u bazu podataka. Da bi unjeli u bazu moramo izvršiti sql upit . Prvo upit spremimo u varijablu

$sql=”insert into korisnici (korisnicko_ime,korisnik_zaporka,korisnik_email,korisnik_datum,korisnik_level)

values(‘$korisnik’,’$zaporka’,’$email’, NOW( ),0)”;

 

zatim pomoću funkcije mysql_query($sql); izvršimo u pit i spremimo rezultat u varijablu $result.  Ako u varijabli $result nema nikakve vrijednosti tj. vrijednost je NULL , if(!$result) , onda je došlo do nekakve pogreške . Inače obavještavamo korisnika da je upješno unjeo podatke u bazu . tj. registrirao se .

 

<?php 
//signup.php 
include 'connect.php'; // ukljuci datoteku connect.php
include 'header.php'; // ukljuci datoteku header.php
echo '<h3>Registriraj se</h3>'; 
if($_SERVER['REQUEST_METHOD'] != 'POST') 
{ 
 /*podatci u formu još nisu upisani prikaži ju za upis podataka 
 */ 
 echo '<form method="post" action=""> 
 Username: <input type="text" name="user_name" /> 
 Password: <input type="password" name="user_pass"> 
 Password again: <input type="password" name="user_pass_check"> 
 E-mail: <input type="email" name="user_email"> 
 <input type="submit" value="Registriraj se" /> 
 </form>'; 
} 
else 
{ 
 /* podatci iz forme su poslani , procesirati cemo podatke u tri koraka 
 1. porvjeri podatke 
 2. Neka korisnik upiše popuni ponovno pogresno upisane podatke 
 3. Spremi podatke 
 */ 
 $errors = array(); /* definiraj polje za kasniju upotrebu*/ 
 if(isset($_POST['user_name'])) 
 { 
 //korisnicko ime vec postoji 
 if(!ctype_alnum($_POST['user_name'])) 
 { 
 $errors[] = 'Korisnicko ime moze sadrzavati samo slova i brojeve'; 
 } 
 if(strlen($_POST['user_name']) > 30) 
 { 
 $errors[] = 'Korisnicko ime ne može biti dulje od 30 znakova'; 
 } 
 } 
 else 
 { 
 $errors[] = 'korisnicko ime ne smiej biti prazno '; 
 } 
 if(isset($_POST['user_pass'])) 
 { 
 if($_POST['user_pass'] != $_POST['user_pass_check']) 
 { 
 $errors[] = 'Sifre se ne podudaraju'; 
 } 
 } 
 else 
 { 
 $errors[] = 'Polje za zaporku ne moze biti prazno'; 
 } 
 if(!empty($errors)) 
 { 
 echo 'Uh-oh.. neki podatci nisu ispravno upisani'; 
 echo '<ul>'; 
 foreach($errors as $key => $value) /* prodi kroz polje kako bi sve pogreske bile ispisane */ 
 { 
 echo '<li>' . $value . '</li>'; /* ovo generira listu pogresaka */ 
 } 
 echo '</ul>'; 
 } 
 else 
 { 
 $korisnik=$_POST['user_name'];
 $zaporka=$_POST['user_pass'];
 $email=$_POST['user_email'];
 

 $sql="insert into korisnici (korisnicko_ime,korisnik_zaporka,korisnik_email,korisnik_datum,korisnik_level)
values('$korisnik','$zaporka','$email', NOW( ),0)";

 $result=mysql_query($sql); 
 if(!$result) 
 { 
 //nesto je poslo po zlu , ispisi gresku 
 echo 'Neka pogreska prilikom registracije pokusaj ponovno kasnije'; 
 //echo mysql_error(); 
 } 
 else 
 { 
 echo 'Uspjeso ste registrirani Mozete se sada logirati <a href="signin.php">Logiraj se</a> i pocni koristiti forum :-)'; 
 } 
 } 
}
include 'footer.php'; 

?>

 

Signin.php

 

Uloga ove datoteke je autentifikacija korisnika tj. provjera da li je korisnik unjeo ispravne korisničke podatke i logiranje korisnika, ako su podatci ispravno unjeti .  prvo provjeravamo  varijablu $_SESSION[‘signed_in’] , ako je true , znači da je korisnik već logiran. Zatim provjeravamo varijablu  $_SERVER[‘REQUEST_METHOD’],ako je različita od POST prikaži korisniku formu za unos korisničkog imena i zaporke , inače provjeri podatke da li odgovaraju onima u bazi .  Za autentifikaciju tj. provjeru korisničkih podataka koristimo sljedeći SQL upit

 

$sql=”SELECT korisnik_id,korisnicko_ime,korisnik_level FROM korisnici WHERE korisnicko_ime=’$usr’ AND  `korisnik_zaporka` =’$pass’ “;

 

Ako podatci odgovaraju upit će prikazati tablicu s jednim retkom koji odgovara tim podatcima.  Zatim provjeravamo koliko redaka ima rezultat upita

$count=mysql_num_rows($result);

if($count==0){

 

Ako je nula znači da su unjeti krivi korisnički podatci , inače je korisnik uspješno logiran i posatavlja se vrijednosti varijable na

$_SESSION[‘signed_in’] = 1;

$_SESSION[‘user_id’] = $row[‘korisnik_id’];
$_SESSION[‘user_name’] = $row[‘korisnicko_ime’];
$_SESSION[‘user_level’] = $row[‘korisnik_level’];

 

kaka bi se mogle koristiti i na ostalim stranicama. Primjetite da atribut kod varijabli tipa $row[‘korisnik_id’]; , mora odgovarati nazivu atributa u bazi podataka

 

<?php 
//signin.php 
include 'connect.php'; // ukljuci datoteku connect.php
include 'header.php'; // ukljuci datoteku header.php
echo '<h3>Logiraj se</h3>'; 
//prvo provjeri da li je korisnik vec logiran, ako je tako nema potrebe za prikazom ove stranice 
if(isset($_SESSION['signed_in']) && $_SESSION['signed_in'] == true) 
{ 
 echo 'Vec si logiran , mozes se <a href="signout.php">od logirati </a> ako zelis.'; 
} 
else 
{ 
 if($_SERVER['REQUEST_METHOD'] != 'POST') 
 {
echo '<form method="post" action=""> 
 Username: <input type="text" name="user_name" /> 
 Password: <input type="password" name="user_pass"> 
 <input type="submit" value="Logiraj se" /> 
 </form>'; 
 } 
 else 
 {
$errors = array(); /* deklariraj polje koje ce se kasnije koristiti */ 
 if(!isset($_POST['user_name'])) 
 { 
 $errors[] = 'Korisnicko ime ne smije biti prazno'; 
 } 
 if(!isset($_POST['user_pass'])) 
 { 
 $errors[] = 'Zaporka ne smije biti prazna'; 
 } 
 if(!empty($errors)) 
 { 
 echo 'Uh-oh..neka polja nisu ispunjena..'; 
 echo '<ul>'; 
 foreach($errors as $key => $value) /* predi preko polja da se sve greske ispisu*/ 
 { 
 echo '<li>' . $value . '</li>'; /* generira listu pogresaka */ 
 } 
 echo '</ul>'; 
 } 
 else 
 { 

$usr= $_POST['user_name'] ;
$pass=$_POST['user_pass'];
echo $usr;
echo $pass;
//sql uit koji provjera da li podatci uneseni preko forme odgovaraju onima pohranjenim u bazi podataka
 $sql="SELECT korisnik_id,korisnicko_ime,korisnik_level FROM korisnici 
WHERE korisnicko_ime='$usr' AND `korisnik_zaporka` ='$pass' ";
 $result = mysql_query($sql); 
// Mysql_num_row broji redke u tablici
$count=mysql_num_rows($result);
// ako korisnicko ime i zaporka se podudaraju broj redaka u tablicimora biti jednak 1
if($count==0){
 echo "Krivo korisnicko ime ili zaporka";
}
else {

 //posatavi varijablu $_SESSION['signed_in'] na TRUE 
 $_SESSION['signed_in'] = 1; 
 //postavi user_id i user_name vrijednosti u $_SESSION, da bi ih mogli koristiti za razne djelove stranice
 while($row = mysql_fetch_assoc($result)) 
 { 
 $_SESSION['user_id'] = $row['korisnik_id']; 
 $_SESSION['user_name'] = $row['korisnicko_ime']; 
 $_SESSION['user_level'] = $row['korisnik_level']; 
 } 
 echo 'Dobrodosao, ' . $_SESSION['user_name'] . '. <a href="index.php">Nastavi ka pregledu foruma</a>.'; 
 } 
 } 
 } 
 }
include 'footer.php'; 
?>

 

Create_cat.php

 

Uloga ove datoteke je izrada kategorija. Kod je sličan kao i kod sign_up.php . Provjerava se varijabla $_SERVER[‘REQUEST_METHOD’] != ‘POST’  . Ako je različito od POST prikaži post inače unesi podatke od kategorije u bazu . Korist ise sljedeći sql upit

$sql = “insert into kategorije (kat_ime, kat_opis)values(‘$katime’,’$katopis’)”;

 

<?php 
//create_cat.php 
include 'connect.php'; 
include 'header.php'; // ukljuci datoteku header.php 
if($_SERVER['REQUEST_METHOD'] != 'POST') 
{ 
?>

 <form method='post' action=''> 
 Ime Kategorije: <input type='text' name='cat_name' /> 
 Opis Kategorije: <textarea name='cat_description' /></textarea> 
 <input type='submit' value='Dodaj Kategoriju' /> 
 </form>
 <?php
} 
else 
{ 
 //the form has been posted, so save it 

 $katime=$_POST['cat_name'];
 $katopis=$_POST['cat_description'];
 $sql = "insert into kategorije (kat_ime, kat_opis)values('$katime','$katopis')"; 
 $result = mysql_query($sql); 
 if(!$result) 
 { 
 //Ako nešto krene po zlu, prikaži pogrešku 
 echo 'Error' . mysql_error(); 
 } 
 else 
 { 
 echo 'Nova kategorija uspješno dadana!'; 
 } 
}
include 'footer.php'; 
?>

 

Category.php

 

Datoteka koja prikazuje sve članke određene kategorije .  Koristi se naredba $kat_id=$_GET[‘id’]; koja u varijblu $kat_id sprema vrijednost iz parametra URL-a , npr ako je url /category.php?id=5 u varijablu $kat_id će se spremiti vrijednost $kat_id. Na temelju tog id-a dohvatiti će se određeni podatci iz baze, za svaki id dohvaćaju se drugačiji podatci. Izvršavamo sql upit

$sql = “SELECT
kat_id,
kat_ime,
kat_opis
FROM
kategorije
WHERE
kat_id =’$kat_id'”;

 

zatim vrtimo petlju  while($row = mysql_fetch_assoc($result))  i ispisujemo određene podatke u kombinaciji s html tablicom .

 

Zatim izvršavamo još jedan upit

$sql = “SELECT
tema_id,
tema_subject,
tema_datum,
tema_kat
FROM
teme
WHERE
tema_kat =’$kat_id’ “;

 

kako bi dohvatili podatke vezane za temu i ispisali ih.

 

<?php 
//category.php 
include 'connect.php'; 
include 'header.php'; 
 $kat_id=$_GET['id'];
//Prvo izaberemo kategoriju na tamelju cat_id, koji se prenosi preko URLA a spremljen je u varijabli $_GET['cat_id'] 
$sql = "SELECT 
 kat_id, 
 kat_ime, 
 kat_opis 
 FROM 
 kategorije
 WHERE 
 kat_id ='$kat_id'"; 
$result = mysql_query($sql); 
if(!$result) 
{ 
 echo 'Kategorija ne može biti prikazana, pokušaj ponovno.' . mysql_error(); 
} 
else 
{ 
 if(mysql_num_rows($result) == 0) 
 { 
 echo 'Ova kategorija ne postoji'; 
 } 
 else 
 { 
 //prikaži podatke o kategoriji 

 while($row = mysql_fetch_assoc($result)) 
 { 
 echo "<h2>Tema u " ;
 echo $row['kat_ime']; 
 echo " kategoriji</h2>"; 
 } 
 //napravi upit za teme
 $sql = "SELECT 
 tema_id, 
 tema_subject, 
 tema_datum, 
 tema_kat
 FROM 
 teme
 WHERE 
 tema_kat ='$kat_id' "; 
 $result = mysql_query($sql); 
 if(!$result) 
 { 
 echo 'Tema ne može biti prikazana pokušaj ponovno kasnije'; 
 } 
 else 
 { 
 if(mysql_num_rows($result) == 0) 
 { 
 echo 'Nema još tema u ovoj kategoriji.'; 
 } 
 else 
 { 
 //pripremi tablicu 
 echo '<table border="1"> 
 <tr> 
 <th>Tema</th> 
 <th>Napravljena od</th> 
 </tr>'; 
 while($row = mysql_fetch_assoc($result)) 
 { 
 echo '<tr>'; 
 echo '<td class="leftpart">'; 
 echo '<h3><a href="topic.php?id=' . $row['tema_id'] . '">' . $row['tema_subject'] . '</a><h3>'; 
 echo '</td>'; 
 echo '<td class="rightpart">'; 
 echo date('d-m-Y', strtotime($row['tema_datum'])); 
 echo '</td>'; 
 echo '</tr>'; 
 } 
 } 
 } 
 } 
} 
include 'footer.php'; 

?>

Create_topic.php

 

Datoteka za izradu tema . Provjeravamo da li je varijabla  $_SERVER[‘REQUEST_METHOD’] različita od POST , ako je onda dohvati podatke iz baze za kategoriju pomoću upita

$sql = “SELECT
kat_id,
kat_ime,
kat_opis
FROM
kategorije”;

 

te ponudi korisniku formu za unos podataka o temi i izboru jedne od kategorija. Ako administrator nije napravio niti jednu kategoriju neće biti moguće dodavati teme . Ako je varijabla  $_SERVER[‘REQUEST_METHOD’] jednaka POST onda spremamo tablicu u tablicu teme, ako sve prođe kako treba, spremamo  podatke i u tablicu  clanak. Zatim  koristimo naredbu

echo ‘Uspješno ste napravili <a href=”topic.php?id=’. $topicid . ‘”>vašu novu temu</a>.’;

 

koja obavještava korisnika da je uspješno napravio temu i nudi mu link za prikaz teme, uočite da se podatak iz varijable $topicid prenosi  preko URL-a na  topic.php .

 

<?php 
//create_topic.php 
include 'connect.php'; 
include 'header.php'; 
echo '<h2>Napravi temu</h2>'; 
if($_SESSION['signed_in'] == false) 
{ 
 //korisnik nije logiran 
 echo 'Oprostite morate biti logirani da bi napravili temu, <a href="/forum/signin.php">Logiraj se</a> .'; 
} 
else 
{ 
 //korisnik je logiran 
 if($_SERVER['REQUEST_METHOD'] != 'POST') 
 { 

 //ucitaj kategorije iz baze 
 $sql = "SELECT 
 kat_id, 
 kat_ime, 
 kat_opis
 FROM 
 kategorije"; 
 $result = mysql_query($sql); 
 if(!$result) 
 { 
 //upit nije uspjeo 
 echo 'Greška, molim pokušajte kasnije'; 
 } 
 else 
 { 
 if(mysql_num_rows($result) == 0) 
 { 
 //nema kategorija pa tema nemože biti objavljena 
 if($_SESSION['user_level'] == 1) 
 { 
 echo 'Niste još napravili kategoriju'; 
 } 
 else 
 { 
 echo 'Prije nego što napravite temu morate pricekati admina da napravi kategoriju'; 
 } 
 } 
 else 
 { 
 echo '<form method="post" action=""> 
 Naziv <input type="text" name="topic_subject" /> 
 Kategorija:'; 
 echo '<select name="topic_cat">'; 
 while($row = mysql_fetch_assoc($result)) 
 { 
 echo '<option value="' . $row['kat_id'] . '">' . $row['kat_ime'] . '</option>'; 
 } 
 echo '</select>'; 
 echo 'Message: <textarea name="post_content" /></textarea> 
 <input type="submit" value="Create topic" /> 
 </form>'; 
 } 
 } 
 } 
 else 
 { 
 //zapocni transakciju 
 $query = "BEGIN WORK;"; 
 $result = mysql_query($query); 
 if(!$result) 
 { 
 //upit neuspješan 
 echo 'Greška prilikom izrade teme'; 
 } 
 else 
 { 

 //unesi temu u tablicu teme, zatim cemo clanak spremiti u tablicu clanak 
 $sql = "INSERT INTO 
 teme(tema_subject, 
 tema_datum, 
 tema_kat, 
 tema_od) 
 VALUES('" . mysql_real_escape_string($_POST['topic_subject']) . "', 
 NOW(), 
 " . mysql_real_escape_string($_POST['topic_cat']) . ", 
 " . $_SESSION['user_id'] . " 
 )"; 
 $result = mysql_query($sql); 
 if(!$result) 
 { 
 //nešto je krenulo po zlu greška
 echo 'Greška pokušaj ponovno' . mysql_error(); 
 $sql = "ROLLBACK;"; 
 $result = mysql_query($sql); 
 } 
 else 
 { 
 //prvi upit radi, sada zapocni drugi
 //vrati id od upravo napravljene teme
 $topicid = mysql_insert_id(); 
 $sql = "INSERT INTO 
 clanak(clanak_sadrzaj, 
 clanak_datum, 
 clanak_tema, 
 clanak_od) 
 VALUES 
 ('" . mysql_real_escape_string($_POST['post_content']) . "', 
 NOW(), 
 " . $topicid . ", 
 " . $_SESSION['user_id'] . " 
 )"; 
 $result = mysql_query($sql); 
 if(!$result) 
 { 
 //nešto je pošlo po zlu prikaži pogreške
 echo 'Greška prilikom dodavanja clanka. Molim Pokušaj kasnije.' . mysql_error(); 
 $sql = "ROLLBACK;"; 
 $result = mysql_query($sql); 
 } 
 else 
 { 
 $sql = "COMMIT;"; 
 $result = mysql_query($sql); 
 //Nakon puno posla upit je uspjeo
 echo 'Uspješno ste napravili <a href="topic.php?id='. $topicid . '">vašu novu temu</a>.'; 
 } 
 } 
 } 
 } 
} 
include 'footer.php'; 
?>

Topic.php 

 

Datoteka koja prikazuje određenu temu  koriteći ID koji se dohvaća iz URL-a .  U varijablu $tema_id=$_GET[‘id’]; spremamo id iz URL-a .  Zatim izvršavanjem upita

SELECT tema_id, tema_subject
FROM teme
WHERE teme.tema_id =’$tema_id'”;

 

prikazujemo temu sa id-om koji odgovara vrijednosti u varijabli $tema_id  , Naredbama

 

$row = mysql_fetch_assoc($result) ;
echo ‘<table border=”1″>
<tr>
<th COLSPAN=2>’;
echo $row[‘tema_subject’];
echo ‘</th>

</tr>’;

 

ispisujemo subject teme u određenom formatu tablice , atribut COLSPAN=2 , spaja dva retka tablice u jedan .

Izvršavamo novi upit

 

SELECT clanak.clanak_tema, clanak.clanak_sadrzaj, clanak.clanak_datum,

clanak.clanak_od, korisnici.korisnik_id, korisnici.korisnicko_ime
FROM clanak
LEFT JOIN korisnici ON clanak.clanak_od = korisnici.korisnik_id
WHERE clanak.clanak_tema =’$tema_id'”;

 

koji spaja tablice korisnici i clanak  te prikazuje podatke koji odgovaraju spojenim atributima  tj. gdje je clanak_od = korisnik_id i clanak_tema jednak vrijednosti varijable $tema_id.  Vrtimo petlju i ispisujemo podatke o temi .

 

while($row = mysql_fetch_assoc($result))
{
echo ‘<tr>’;
echo ‘<td class=”leftpart”>’;
echo $row[‘clanak_sadrzaj’];
echo ‘</td>’;
echo ‘<td class=”rightpart”>’;
echo $row[‘clanak_datum’];
echo ‘</td>’;
echo ‘</tr>’;
}

 

zatim dodajemo formu  za odgovr  koja , šalje podatke preko zahtjeva i URL-a datoteci reply.php , gdje će se podatci iz odgovora unjeti u bazu .

 

 

<?php 
//category.php 
include 'connect.php'; 
include 'header.php'; 
 $tema_id=$_GET['id'];
//Prvo izaberemo kategoriju na tamelju cat_id, koji se prenosi preko URLA a spremljen je u varijabli $_GET['cat_id'] 
$sql = "SELECT tema_id, tema_subject
FROM teme
WHERE teme.tema_id ='$tema_id'";

$result = mysql_query($sql); 
if(!$result) 
{ 
 echo 'Teme ne može biti prikazana, pokušaj ponovno.' . mysql_error(); 
} 
else 
{ 
 if(mysql_num_rows($result) == 0) 
 { 
 echo 'Ova tema ne postoji'; 
 } 
 else 

 { 
 //pripremi tablicu 
 $row = mysql_fetch_assoc($result) ;
 echo '<table border="1"> 
 <tr> 
 <th COLSPAN=2>';
 echo $row['tema_subject'];
 echo '</th> 

 </tr>'; 

 }
}
 $sql = "SELECT clanak.clanak_tema, clanak.clanak_sadrzaj, clanak.clanak_datum, clanak.clanak_od, korisnici.korisnik_id, korisnici.korisnicko_ime
FROM clanak
LEFT JOIN korisnici ON clanak.clanak_od = korisnici.korisnik_id
WHERE clanak.clanak_tema ='$tema_id'";
$result = mysql_query($sql); 
if(!$result) 
{ 
 echo 'Tema ne može biti prikazana, pokušaj ponovno.' . mysql_error(); 
} 
else 
{
 while($row = mysql_fetch_assoc($result)) 
 { 
 echo '<tr>'; 
 echo '<td class="leftpart">'; 
 echo $row['clanak_sadrzaj']; 
 echo '</td>'; 
 echo '<td class="rightpart">'; 
 echo $row['clanak_datum'];
 echo '</td>'; 
 echo '</tr>'; 
 } 
 } 
 ?>
 <?php
 echo '<form method="post" action="reply.php?id=' . $tema_id . '">'; ?>
 <textarea name="reply-content"></textarea> 
 <input type="submit" value="Submit reply" /> 
</form> 

 <?php
 include 'footer.php'; 

 ?>

Reply.php

Datoteka koja odgovor sprema u bazu .  Za spremanje podataka odgovora u bazu koristimo upit

$sql = “INSERT INTO
clanak(clanak_sadrzaj,
clanak_datum,
clanak_tema,
clanak_od)
VALUES (‘$reply’,
NOW( ),
‘$reply_id’,
‘$user’)”;

 

 

<?php 
//reply.php 
include 'connect.php'; 
include 'header.php'; 
 $reply=$_POST['reply-content'];
 $reply_id=$_GET['id'];
 $user=$_SESSION['user_id'];

if($_SERVER['REQUEST_METHOD'] != 'POST') 
{ 

 echo 'Ova datoteka ne može biti poslana direktno.'; 
} 
else 
{ 
 //Provjeri da li je korisnik logiran
 if(!$_SESSION['signed_in']) 
 { 
 echo 'Vi morate biti logirani da bi objavili clanak.'; 
 } 
 else 
 { 
 //pravi korisnik je objavio odgovor 
 $sql = "INSERT INTO 
 clanak(clanak_sadrzaj, 
 clanak_datum, 
 clanak_tema, 
 clanak_od) 
 VALUES ('$reply', 
 NOW( ), 
 '$reply_id', 
 '$user')"; 

 $result = mysql_query($sql); 
 if(!$result) 
 { 
 echo 'Vaš odgovor nije spremljen molim probajte kasnije'; 
 } 
 else 
 { 
 echo 'Vaš odgovor je spremljen , provjerite <a href="topic.php?id=' . htmlentities($_GET['id']) . '">temu</a>.'; 
 } 
 } 
} 
include 'footer.php'; 
?>

 

Index.php

 

Datoteka koja predstavlja početnu stranu forum . Prikazuje sve kategorije , klikom na kategoriju prikazuju se sve teme koje pripadaju toj kategoriji . Jednostavnim upitom

$sql =SELECT kat_id, kat_ime, kat_opis
FROM kategorije”;

spremamo prikaz kategorija u varijablu $sql. Zatim vrtimo while petlju i prikazujemo kategorije u određenom formatu sa tablicom .

 


<?php 
//index.php 
include 'connect.php'; 
include 'header.php'; 

$sql = "SELECT kat_id, kat_ime, kat_opis
FROM kategorije"; 

$result = mysql_query($sql); 

if(!$result) 
{ 
 echo 'Kategorije ne mogu biti prikazane, molim pokušajte kasnije.'; 
} 
else 
{ 
 if(mysql_num_rows($result) == 0) 
 { 
 echo 'Nema definiranih kategorija.'; 
 } 
 else 
 { 
 //prepare the table 
 echo '<table border="1"> 
 <tr> 
 <th>Kategorija</th> 
 <th>Zadnja tema</th> 
 </tr>'; 

 while($row = mysql_fetch_assoc($result)) 
 { 
 echo '<tr>'; 
 echo '<td class="leftpart">'; 
 echo '<h3><a href="category.php?id='.$row['kat_id']. '">' . $row['kat_ime'] . '</a></h3>'.$row['kat_opis'] ;

 echo '</td>'; 
 echo '<td class="rightpart">'; 
 echo '<a href="topic.php?id=">Naslov teme</a> at 10-10'; 
 echo '</td>'; 
 echo '</tr>'; 
 } 
 } 
} 

?>

 

 

Footer.php 

 

</div><!-- content --> 
</div><!-- wrapper --> 
<div id="footer">napravljeno od kako-napraviti.com</div> 
</body> 
</html>

 

Style.css

Datoteka u u kojoj će biti definiran izgled stranice kao veličina, boja fontova, boja pozadine i sl. Ako ste primjetili u datoteci header.php uključujemo datoteku style.css pomoću naredbe:  <link rel=”stylesheet” href=”style.css” type=”text/css”>

 

 

 

body { 
 background-color: #4E4E4E; 
 text-align: center; /* make sure IE centers the page too */ 
} 
#wrapper { 
 width: 900px; 
 margin: 0 auto; /* center the page */ 
} 
#content { 
 background-color: #fff; 
 border: 1px solid #000; 
 float: left; 
 font-family: Arial; 
 padding: 20px 30px; 
 text-align: left; 
 width: 100%; /* fill up the entire div */ 
} 
#menu { 
 float: left; 
 border: 1px solid #000; 
 border-bottom: none; /* avoid a double border */ 
 clear: both; /* clear:both makes sure the content div doesn't float next to this one but stays under it */ 
 width:100%; 
 height:20px; 
 padding: 0 30px; 
 background-color: #FFF; 
 text-align: left; 
 font-size: 85%; 
} 
#menu a:hover { 
 background-color: #009FC1; 
} 
#userbar { 
 background-color: #fff; 
 float: rightright; 
 width: 250px; 
} 
#footer { 
 clear: both; 
} 
/* begin table styles */ 
table { 
 border-collapse: collapse; 
 width: 100%; 
} 
table a { 
 color: #000; 
} 
table a:hover { 
 color:#373737; 
 text-decoration: none; 
} 
th { 
 background-color: #B40E1F; 
 color: #F0F0F0; 
} 
td { 
 padding: 5px; 
} 
/* Begin font styles */ 
h1, #footer { 
 font-family: Arial; 
 color: #F1F3F1; 
} 
h3 {margin: 0; padding: 0;} 
/* Menu styles */ 
.item { 
 background-color: #00728B; 
 border: 1px solid #032472; 
 color: #FFF; 
 font-family: Arial; 
 padding: 3px; 
 text-decoration: none; 
} 
.leftpart { 
 width: 70%; 
} 
.rightpart { 
 width: 30%; 
} 
.small { 
 font-size: 75%; 
 color: #373737; 
} 
#footer { 
 font-size: 65%; 
 padding: 3px 0 0 0; 
} 
.topic-post { 
 height: 100px; 
 overflow: auto; 
} 
.post-content { 
 padding: 30px; 
} 
textarea { 
 width: 500px; 
 height: 200px; 
}

 

 

Ako imate kakva pitanja u vezi izrade foruma ,  objavite ih u komentarima . Nadam se da  vam je tutorial pomogao.

 

 

 

 

7 komentara to this post
  1. @ARYOUS

    slažem se s tobom, danas za vlastiti biznis, web stranicu i sl nema potrebe puno programirati, jer sve možeš naći na internetu već gotovo . Ali ako se učiš programirati onda je ovaj tutorial idealan, jer ćeš naučiti neke stvari kao spajanje na bazu podataka, dohvat i obrada podataka iz baze pomuću php skripte, upotrebu varijabli $_POST, $_GET, $_SESSION , html forme i sl; a to su osnovne stvari koje se koriste pri izradi svake web aplikacije. Da sam prije dvije godine , kad sam na faksu učio PHP, našao ovakav tutorial, uštedio bi mi mnogo vremena na učenju .

  2. ja sam probo preko localhosta i napravio folder FORUM, ali mi ne radi , jer me izbacuje na local host npr. otvara mi 127.0.0.1/singup.php umjesto 127.0.0.1/forum/singup.php

  3. @Danijel

    Slažemse s tobom , ovo je totalno nesiguran kod , odličan je za učenje , i može se iskoristiti za školske projekte i slične projekte gdje ti sigurnost nije toliko bitna . Prvo što mi pada napamet kako narušiti sigurnost je sql injection . Budem i o tome pisao u budućim člancima ..

Odgovori