Vytvorenie vlastného fóra pomocou PHP a MYSQL

Vytvorenie vlastného fóra pomocou PHP a MYSQL

V tomto rozširenejšom návode vám ukážeme ako sa dá vytvoriť pomocou PHP a databázy MYSQL vlastné funkčné fórum z registráciou,kategóriami,uživateľmi a vlastnými príspevkami. Je potreba menšia dávka trpezlivosti ale nieje to nič náročne. samozrejme,musíte vedieť aspoň základy s databázou MYSQL.Súbory ktoré si vytvoríme:

PHP

  • topic.php
  • signup.php
  • signout.php
  • signin.php
  • reply.php
  • index.php
  • header.php
  • footer.php
  • create_topic.php
  • create_cat.php
  • connect.php
  • category.php

CSS

  • style.css

Krok 1: Vytvorenie tabulky v databáze

Je dobrý nápad začať s vytváraním dobrého dátového modelu pri vytváraní aplikácie,u nás teda fórum. Popíšme si o našom fóre niečo čo budeme robiť a čo máme v pláne: Chystáme sa urobiť fórum, ktoré má užívateľov, ktorí vytvárajú témy v rôznych kategóriách. Ostatní používatelia môžu pridávať odpovede. Vytvoríme si 4 hlavné tabuľky kde sa budu zapisovať a uchovávať:

  • Registrované mená uživateľov
  • Ich heslá na prihlásenie do fóra
  • Kategórie
  • Názvy a odpovede vo fóre

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Vyzerá to celkom elegantne, čo? Každý štvorec je databázová tabuľka. Všetky stĺpce sú uvedené v nej a linky medzi nimi predstavujú vzťahy.  Budem diskutovať o každej tabuľke z vysvetlením SQL, ktoré som vytvoril pomocou režimu vyššie. Pre vaše vlastné skripty môžete vytvoriť podobný systém. My použijeme PHPMYADMIN a ukážem vám ako si v ňom vytvoríte následujuce tabuľky. Tieto tabuľky vytvoríme tak,že prv vytvoríme kód s tabuľkou a potom to importujeme do phpmyadmina,ktorý tieto tabuľky spracuje. Alebo si vytvoríme súbor napr. tabulky.sql a cez phpmyadmina použijeme voľbu import. My použijeme prvú možnosť


Prvá tabuľka bude tabuľka z uživateľmi. Nazveme ju users

CREATE TABLE users (  
user_id     INT(8) NOT NULL AUTO_INCREMENT,  
user_name   VARCHAR(30) NOT NULL,  
user_pass   VARCHAR(255) NOT NULL,  
user_email  VARCHAR(255) NOT NULL,  
user_date   DATETIME NOT NULL,  
user_level  INT(8) NOT NULL,  
UNIQUE INDEX user_name_unique (user_name),  
PRIMARY KEY (user_id)  
) ENGINE=INNODB;

 

CREATE TABLE sa používa pre označenie že chceme vytvoriť novú tabuľku. Potom nasleduje názov tabuľky teda users a všetky stĺpce sú uvedené medzi zátvorkami. Ostatné sa nazývaju polia.

user_id

Typ tejto oblasti je INT, čo znamená, že v tomto poli má celé číslo. Pole nemôže byť prázdne (NOT NULL) a zvyšuje rozloženia číslic,teda ak uživateľ admin je na fóre registrovaný ako prvý,priradí sa mu číslo teda ID 1. To znamená že ID 1 už je obsadené a tak,keď sa zaregistruje uživateľ janko,jeho ID bude číslo 2. V spodnej časti tabuľky si môžete prezrieť USER_ID pole  deklarovaný ako primárny kľúč. Primárny kľúč slúži na jednoznačnú identifikáciu každého riadku v tabuľke.

user_name

Toto je textové pole, tzv pole VARCHAR v MySQL. Číslo v zátvorke je maximálna dĺžka. Užívateľ si môže zvoliť užívateľské meno až na 30 znakov. Toto pole nemôže byť NULL. Varchar zabezbečuje,že sa nesmie zaregistrovať 2x rovnaké meno. Na konci UNIQUE INDEX hovorí databáze že chceme pridať pre user_name jedinečný kľúč.

user_pass

Toto pole je rovné Username polu, s výnimkou maximálnej dĺžky. Samozrejme je potreba heslo v databáze šifrovať aby nebolo zneužite. Do tohto pola sa ukladá heslo ktoré použijeme pri registracii.

user_email

Toto pole sa rovná user_pass poľu.

user_date

Toto je oblasť, v ktorej budeme ukladať dáta registrovaných uživateľov. Je to typ DATETIME a poľe nemôže byť NULL. Ukladajú sa tu: Kedy sa uživateľ prihlasil naposledy,kedy sa zaregistroval alebo počet pridaných príspevkov.

user_level

Toto pole obsahuje úroveň užívateľa, napríklad: ‘0 ‘pre bežného užívateľa a ‘1’ pre admina. Viac o tom neskôr.

Teraz si túto tabuľku importujeme do databázy. Vytvoríme si nejaku tabuľku,prihlasíme sa do phpmyadmina. Klikneme na SQL a vložíme príkaz pre vytvorenie poli ktorý sme si vytvorili vyšie.

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Vložíme príkaz:

Vytvorenie vlastného fóra pomocou PHP a MYSQL

A klikneme na Vykonaj

Vytvorí sa nám prvá tabuľka z názvom users a vnej polia ktoré sme už definovali

Vytvorenie vlastného fóra pomocou PHP a MYSQL Vytvorenie vlastného fóra pomocou PHP a MYSQL


Tabuľka kategórii

CREATE TABLE categories (  
cat_id          INT(8) NOT NULL AUTO_INCREMENT,  
cat_name        VARCHAR(255) NOT NULL,  
cat_description     VARCHAR(255) NOT NULL,  
UNIQUE INDEX cat_name_unique (cat_name),  
PRIMARY KEY (cat_id)  
) ENGINE=INNODB;

Vytvorenie vlastného fóra pomocou PHP a MYSQL

 

Tabuľka tém

CREATE TABLE topics (  
topic_id        INT(8) NOT NULL AUTO_INCREMENT,  
topic_subject       VARCHAR(255) NOT NULL,  
topic_date      DATETIME NOT NULL,  
topic_cat       INT(8) NOT NULL,  
topic_by        INT(8) NOT NULL,  
PRIMARY KEY (topic_id)  
) ENGINE=INNODB;

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Tabuľka príspevkov

CREATE TABLE posts (  
post_id         INT(8) NOT NULL AUTO_INCREMENT,  
post_content        TEXT NOT NULL,  
post_date       DATETIME NOT NULL,  
post_topic      INT(8) NOT NULL,  
post_by     INT(8) NOT NULL,  
PRIMARY KEY (post_id)  
) ENGINE=INNODB;

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Všetke tabuľky sa rovnajú k prvému,čiže si nemusíme písať o každej.


Poďme začať s definíciou vzťahu. Budeme používať niečo, čo sa nazýva cudzí kľúč. Cudzí kľúč je referenčne obmedzenia medzi dvoma tabuľkami. Cudzí kľúč identifikuje stĺpec alebo sadu stĺpcov v jednej (odkazovanie) tabuľky, ktorá odkazuje na stĺpec alebo sadu stĺpcov v inom (referenced) polil. Niektoré podmienky:

Prepojiť príspevky na témy:

ALTER TABLE posts ADD FOREIGN KEY(post_topic) REFERENCES topics(topic_id) ON DELETE CASCADE ON UPDATE CASCADE;

Prepojenie príspevkov na uživateľa:

ALTER TABLE posts ADD FOREIGN KEY(post_by) REFERENCES users(user_id) ON DELETE RESTRICT ON UPDATE CASCADE;

 

Tieto podmienky vložíme rovnako ako boli podmienky na vytvorenie poli,teda SQL,vložiť podmienku>Vykonaj

To je všetko čo sa týka databázy. bolo to trocha náročne,ale stoji to zato :)


Krok 2: Hlava a päta fóra

Každá stránka na našom fóre potrebuje niekoľko základných vecí, ako DOCTYPE a niektoré značky. To je dôvod, prečo budeme zahŕňať header.php súbor v hornej časti každej stránky a footer.php v spodnej časti.  header.php obsahuje doctype, odkaz na štýlopis a niektoré dôležité informácie o fóre, ako názvy a meta značky.

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="pocitacovyexpert.6f.sk." />
 	<meta name="keywords" content="pocitacovyexpert.6f.sk" />
 	<title>Forum na pocitacovyexpert.6f.sk</title>
	<link rel="stylesheet" href="style.css" type="text/css">
              <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Moje Fórum</h1>
	<div id="wrapper">
	<div id="menu">
		<a class="item" href="/php/forum/index.php">Domov</a> -
		<a class="item" href="/php/forum/create_topic.php">Vytvoriť tému</a> -
		<a class="item" href="/php/forum/create_cat.php">Vytvorenie kategórie</a>

		<div id="userbar">
		<?php
		if($_SESSION['signed_in'])
		{
			echo 'Ahoj <b>' . htmlentities($_SESSION['user_name']) . '</b>. <a class="item" href="signout.php">Odhlasiť sa</a>';
		}
		else
		{
			echo '<a class="item" href="signin.php">Prihlásiť sa</a> alebo <a class="item" href="signup.php">vytvoriť účet</a>';
		}
		?>
		</div>
	</div>
		<div id="content">

Na riadkach <a href=”/php/forum/index.php”>Domov</a> si môžte zmeniť url adresu pre vaše fórum,inak vam nebude zobrazovať správne.

Wrapper div budú použité, aby bolo jednoduchšie vytvoriť štý prel celú stránku. Ponuka div obsahuje menu s odkazmi na stránky,lišta kde sa daju vytvoriť kategórie a témata. Div Userbar sa bude používať pre hornu lištu, ktorá obsahuje niektoré informácie, ako je meno a odkaz na odhlásenie zo stránky. Obsah stránky má skutočný obsah stránky,takže fórum nieje statická stránka ale dinamická,čo znamená že obsah sa mení.

footer.php

</div><!-- content -->
</div><!-- wrapper -->
<div id="footer">Vytvoril pocitacovyexpert.6f.sk</div>
</body>
</html>

Každa stránka má aj dolnú lištu,kde sa odkazujú napr. autorské práva,názov stránky a iné. Pomocou div vytvoríme vzhľad v súbore style.css a tak nemusíme vkladať zbytočne kódy do každého súboru,ale stači len do jedneho.

Ďalšou výhodou je možnosť vykonávania rýchle zmeny. Môžete vidieť sami úpravou textu vo footer.php že stači prepísať jeden riadok a prepísať to na váś obsah. Nakoniec pridáme pár štýlov, ktorý nám poskytuje niektoré základné značky.


style.css

Teraz si vytvoríme vzhľad pre naše fórum aby nejak pekne vyzeralo. Toto je defaultny styl a ak neovladate CSS,stači prepisať kódy farieb a zmeníte si tak design stránky. Čím viac budete experimentovať,tak sa viac naučíte.

/* www.pocitacovyexpert.6f.sk */
body {
	background-color: #4E4E4E;
	text-align: center;			
}

#wrapper {
	width: 900px;
	margin: 0 auto; 			
}

#content {
	background-color: #fff;
	border: 1px solid #000;
	float: left;
	font-family: Arial;
	padding: 20px 30px;
	text-align: left;
	width: 100%;				
}

#menu {
float: left;
border: 1px solid #000;
border-bottom: none;		
clear: both;				
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: right;
	width: 250px;
}

#footer {
	clear: both;
}

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;
}

h1, #footer {
	font-family: Arial;
	color: #F1F3F1;
}

h3 {margin: 0; padding: 0;}

.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;
}

 


Krok 3: Prepojenie stránky na databázu

V prvom kroku sme si vytvorili hlavne tabuľky kde sa nám budu ukladať dôležite informácie. Lenže fórum sa sám na databázu nepripojí a preto to musíme urobiť my :)

Vytvoríme si súbor connect.php čo znamená pripojiť a vložíme doň skript na pripojenie k databázy. Názov,meno a heslo databázy musíte mať vyrvorené už v prvom kroku.

<?php 
session_start();
//connect.php pocitacovyexpert.6f.sk
$server	    = 'localhost'; //server takmer vzdy localhost
$username	= 'uzivatmeno'; //uzivatelske meno pre databazu
$password	= 'heslo'; //heslo k databazy
$database	= 'nazovdb'; // nazov databazy

if(!mysql_connect($server, $username, $password))
{
 	exit('Chyba: Nemožno nadviazať pripojenie k databáze');
}
if(!mysql_select_db($database))
{
 	exit('Chyba: Nemožno vybrať databázu');
}
?>

 Tu nesmieme urobiť chybu,pretože ak zadate nesprávne údaje tak bude nefunkčne cele fórum


 

Krok 4: Vytvorenie a registrácia uživateľov

Začneme tým,že si vytvoríme jednoduchy formulár na registráciu pomocou HTML a zanim vložíme PHP kód,ktorý nam bude údaje z formulára spracovávať a odosielať do databázy.

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Pri registrácii je potrebné spracovať formulár. Budeme používať premenné $ _SERVER .  Premenná je pole s hodnotami, ktoré sa automaticky nastaví pri každej požiadavke.

signup.php

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

echo '<h3>Registrovať sa</h3><br />';

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

    echo '<form method="post" action="">
 	 	Prezývka: <input type="text" name="user_name" /><br />
 		Heslo: <input type="password" name="user_pass"><br />
		Potvrd Heslo: <input type="password" name="user_pass_check"><br />
		E-mail: <input type="email" name="user_email"><br />
 		<input type="submit" value="Registrovať" />
 	 </form>';
}
else
{

	if(isset($_POST['user_name']))
	{
		//the user name exists
		if(!ctype_alnum($_POST['user_name']))
		{
			$errors[] = 'Užívateľské meno môže obsahovať len písmená a číslice.';
		}
		if(strlen($_POST['user_name']) > 30)
		{
			$errors[] = 'Užívateľské meno nemôže byť dlhšia ako 30 znakov.';
		}
	}
	else
	{
		$errors[] = 'Užívateľské pole prezyvka nesmie byť prázdne.';
	}

	if(isset($_POST['user_pass']))
	{
		if($_POST['user_pass'] != $_POST['user_pass_check'])
		{
			$errors[] = 'Obe heslá sa nezhodujú.';
		}
	}
	else
	{
		$errors[] = 'Pole pre zadanie hesla nemôže byť prázdne.';
	}

	if(!empty($errors)) 
	{
		echo 'Uh-oh .. pár polí nie sú vyplnené správne..<br /><br />';
		echo '<ul>';
		foreach($errors as $key => $value) 
		{
			echo '<li>' . $value . '</li>'; 
		}
		echo '</ul>';
	}
	else
	{

		$sql = "INSERT INTO
					users(user_name, user_pass, user_email ,user_date, user_level)
				VALUES('" . mysql_real_escape_string($_POST['user_name']) . "',
					   '" . sha1($_POST['user_pass']) . "',
					   '" . mysql_real_escape_string($_POST['user_email']) . "',
						NOW(),
						0)";

		$result = mysql_query($sql);
		if(!$result)
		{
			//something went wrong, display the error
			echo 'Niečo sa pokazilo. Skúste to prosím neskôr.';
			//echo mysql_error(); //debugging purposes, uncomment when needed
		}
		else
		{
			echo 'Úspešne registrovaný. Teraz sa môžete <a href="signin.php">prihlásiť</a> a začať prispevať do fóra! :-)';
		}
	}
}

include 'footer.php';
?>

Registrácia hotová.

Na riadku 1 máme INSERT INTO, ktoré hovorí samo za seba. Názov tabuľky je uvedený na druhom riadku. Slová medzi zátvorkách predstavujú stĺpce, v ktorých chceme vložiť dáta. . Máme tu aj  niečo nové: mysql_real_escape_string. Funkcia krije špeciálne znaky v neošetrených reťazciach, takže je bezpečné umiestniť v danom skripte.. Existuje príliš veľa skriptov, ktoré to nepoužívajú, a veľmi ľahko vám môžu “hackery” uškodiť . NERISKUJTE, použite mysql_real_escape_string (). tak ako my a budete mať pocit bezpečia pre vaše fórum :)

“Nikdy nevkladajte obyčajny formular pre hesla,použivajte šifrovanie ktoré html ponúka,teda to zvyčajné zahviezdičkovanie. ”

Tiež môžete vidieť, že funkcia sha1 () sa používa na šifrovanie heslo používateľa v databáze,takže ani ja a ani nikto iný v databáze neuvidí ake máte heslo. To je tiež veľmi dôležité mať na pamäti.. Musíte to vždy šifrovať. Predstavte si hacker, ktorý nejako zvláda získať prístup k databáze. Ak vidí všetky textových hesiel sa môže prihlásiť do každej (admin) účet, ktorý chce. Ak heslo stĺpce obsahujú SHA1 reťazca má bezva je prvý ktorý je takmer nemožné.

Poznámka: je tiež možné použiť md5 (), som vždy používať SHA1 (), pretože benchmarky ukázali, že je to trošičku rýchlejší, nie moc ale. Môžete nahradiť SHA1 s md5 ak sa vám páči.

Ak proces registrácie bol úspešný, mali by ste vidieť niečo takéto:

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Spracovanie dát prebieha v troch častiach:

-Overovanie údajov

-Ak dáta nie sú platné, zobrazí formulár znovu.

-Ak sú údaje platné, uloži záznam v databáze

V ďalšom kroku vám ukážem ako nastavíme administrátorske práva pre uživateľa cez databázu a prihlásenie uživateľov.


 Krok 5: Pridanie levelu pre administrátora a prihlásenie uživateľov

Dôležitým aspektom fóra je rozdiel medzi bežnými užívateľmi a adminami / moderátormí. Keďže sa jedná o male fórum a pridávanie funkcií, ako je aj pridávanie nových moderátorov a tak by bola kapitola na dlhšiu dobu, budeme sa sústrediť na prihlasovaci proces a vytvorime aj nejaké administračné funkcie, ako je vytváranie nových kategórií a zatváranie vlákien-tém.  Teraz, keď ste dokončili predchádzajúci krok, môžete sa zaregistrovať a nastavíme si admin práva pomocou ktorých môžeme vytvárať kategórie alebo uzatvárať vlákna.

1. Klikneme na vytvoriť účet a vyplníme formulár

Vytvorenie vlastného fóra pomocou PHP a MYSQL

2. Klikneme na Registrovať

Vytvorenie vlastného fóra pomocou PHP a MYSQL

3. Teraz máme východne hodnoty práv,čiže môžete len prispievať do tém,ale je potreba vytvoriť kategórie ktoré môže len administrátor. Preto prejdeme do phpmyadmina,klikneme na tabuľku users a dole uvidíte polia a vnich hodnoty ktoré ste vypísali vo formulári.

Vytvorenie vlastného fóra pomocou PHP a MYSQL

4. Úplne na pravo je pole user_level a presne ten určuje aké máme práva pre fórum. Keď sa zaregistrujeme automaticky nám priradi level 0. My klikneme na tu ceruzku,čo znamena upraviť a uvidíme toto:

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Celkom dole kde je user_level je ta 0 a mi ju zmeníme na 1 a klikneme na Vykonaj

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Tak a teraz už máme účet ako administrátor. Ak ho chcete dať späť ako obyčajný uživateľ,zmente to zas na 0,ale teraz to nerobte,budeme potrebovať pre pokračovanie účet s admin právami.

Prihlásenie

signin.php

Nemyslíte si že som vám nepopísal čo robím,jednoduchšie to bude keď popis pridám do kódov:)

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

echo '<h3>Prihlásenie</h3><br />';

//najprv skontroluje, či je používateľ už prihlásený. Ak tomu tak nie je zobrazi formular s prihlasenim
if(isset($_SESSION['signed_in']) && $_SESSION['signed_in'] == true)
{
	echo 'Ak ste už prihlásený, môžete sa <a href="signout.php">odhlásiť</a> z fóra';
}
else
{
	if($_SERVER['REQUEST_METHOD'] != 'POST')
	{

		echo '<form method="post" action="">
			Prezívka: <input type="text" name="user_name" /><br />
			Heslo: <input type="password" name="user_pass"><br />
			<input type="submit" value="Prihlásiť sa" />
		 </form>';
	}
	else
	{
		/* formulár bol vyslaný, budeme spracovávať dáta v troch krokoch:1. Skontrolujte dáta 2. Necha užívateľa doplňit zle polia (v prípade potreby)3. ak je vsetko
správne odošle odpoveď
		*/
		$errors = array(); /* deklarovať pole pre neskoršie použitie */

		if(!isset($_POST['user_name']))
		{
			$errors[] = 'Pole pre užívateľské meno nesmie byť prázdne.';
		}

		if(!isset($_POST['user_pass']))
		{
			$errors[] = 'Pole pre heslo nesmie byť prázdne.';
		}

		if(!empty($errors)) /*skontrolujte, či je prázdne pole, ak sa vyskytnú chyby, sú v tomto poli (všimnite si! operátora)*/
		{
			echo 'Uh-oh .. pár polí nie sú vyplnené správne ..<br /><br />';
			echo '<ul>';
			foreach($errors as $key => $value) /* zobrazi všetke chyby */
			{
				echo '<li>' . $value . '</li>'; /* toto vytvára pekný zoznam chýb*/
			}
			echo '</ul>';
		}
		else
		{
			//tže forma bola zverejnená bez chýb, takže ho uložiť
			// použitie mysql_real_escape_string, aby všetko bolo v bezpečí!

			$sql = "SELECT 
						user_id,
						user_name,
						user_level
					FROM
						users
					WHERE
						user_name = '" . mysql_real_escape_string($_POST['user_name']) . "'
					AND
						user_pass = '" . sha1($_POST['user_pass']) . "'";

			$result = mysql_query($sql);
			if(!$result)
			{
				//something went wrong, display the error
				echo 'Niečo je zle, nedá sa prihlásiť Skúste to prosím znova neskôr.';
				//echo mysql_error(); //účely ladenie, odkomentovat v prípade potreby
			}
			else
			{
				//dotaz bol úspešne vykonaný, sú tam 2 možnosti
				//1. dotaz vrátil do mysql,  takže môže byť používateľ prihlásený
				//2. dotaz vrátil prázdny výsledok , poverenia boli zlé
				if(mysql_num_rows($result) == 0)
				{
					echo 'Ste zadali zlú prezývku/heslo.Prosím, skúste to znova.';
				}
				else
				{
					//set the $_SESSION['signed_in'] variable to TRUE
					$_SESSION['signed_in'] = true;

					//USER_ID a user_name hodnoty v $ _SESSION, môžeme použiť na rôzne stránky
					while($row = mysql_fetch_assoc($result))
					{
						$_SESSION['user_id'] 	= $row['user_id'];
						$_SESSION['user_name'] 	= $row['user_name'];
						$_SESSION['user_level'] = $row['user_level'];
					}

					echo 'Vitajte, ' . $_SESSION['user_name'] . '. <br /><a href="index.php">Pokračujte na prehľad fóra</a>.';
				}
			}
		}
	}
}

include 'footer.php';
?>

Prihlásenie máme hotové,teraz sa skúste prihlásiť,malo by to vyzerať takto:

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Polovicu návodu máme za sebou. V ďalšom kroku si ukážeme skript pre pridávanie kategórii do stránky a zobrazenie kategórii na úvodnej stránke.


Krok 6:Pridávanie kategórii do fóra.

Ak chceme vytvoriť kategórie, tak poďme začať s výrobou formulára a skriptu pre vytvorenie kategórii.

create_cat.php

Tento krok vyzerá skoro ako v kroku 4 (Registrácia ), takže nebudem robiť hĺbkové vysvetlenia. Ak ste postupovali podľa krokov mali bz ste byť schopní to pochopiť trochu rýchlejšie.

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

echo '<h2>Vytvoriť kategóriu</h2>';
if($_SESSION['signed_in'] == false | $_SESSION['user_level'] != 1 )
{
	//prístupne len pre admina
	echo 'Je nám ľúto, nemáte dostatočné práva na prístup k tejto stránke.';
}
else
{
	//má užívateľ práva administrátora
	if($_SERVER['REQUEST_METHOD'] != 'POST')
	{

		echo '<form method="post" action="">
			Názov kategórie: <input type="text" name="cat_name" /><br />
			Opis kategórie:<br /> <textarea name="cat_description" /></textarea><br /><br />
			<input type="submit" value="Pridať kategóriu" />
		 </form>';
	}
	else
	{
		//Formulár bol vyslaný, aby odoslal správu do databazy
		$sql = "INSERT INTO categories(cat_name, cat_description)
		   VALUES('" . mysql_real_escape_string($_POST['cat_name']) . "',
				 '" . mysql_real_escape_string($_POST['cat_description']) . "')";
		$result = mysql_query($sql);
		if(!$result)
		{
			//zobrazenie chyby
			echo 'chyba' . mysql_error();
		}
		else
		{
			echo 'Nová kategória bola úspešne pridaná.';
		}
	}
}

include 'footer.php';
?>

Ako môžete vidieť, začali sme z  $ _SERVER kontrola, po kontrole, či má užívateľ práva administrátora, ktorý je nevyhnutný pre vytvorenie kategórie sa objaví formulár na vytvorenie kategórii. Ak má práva, sú uložené hodnoty do databázy.

Vyzerá to následovne:

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Zatiaľ nevytvárame žiadnu kategóriu,prv urobíme skript na prezeranie tém v  kategóriach  fóra a tak si skúsime vytvoriť prvú kategóriu. Takže chvíľka trpezlivosti a prejdite na ďalší krok:


Krok 7: Zobrazenie tém v daných kategóriach

Tento skript slúži na to,že ak klikneme na danú kategóriu,vypíšu sa nám len témy vytvorené v danej kategórii. Napr. Vytvoríme si diskusiu o autách a motorkách. Ak klikneme na kategóriu auta,tak témy ktoré sú v kategórii motorky sa nám nezobrazia.

Vytvoríme si súbor category.php ktorý nám bude na úvodnej stránke a po kliknutí obrazovať celkom hore najnovšie príspevky od uživateľov.

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

//Najprv vyberie kategóriu na základe $ _GET ['cat_id']
$sql = "SELECT
			cat_id,
			cat_name,
			cat_description
		FROM
			categories
		WHERE
			cat_id = " . mysql_real_escape_string($_GET['id']);

$result = mysql_query($sql);

if(!$result)
{
	echo 'Kategória sa nedá zobraziť, skúste to prosím neskôr znovu.' . mysql_error();
}
else
{
	if(mysql_num_rows($result) == 0)
	{
		echo 'Táto kategória neexistuje.';
	}
	else
	{
		//zobraziť dáta kategórií
		while($row = mysql_fetch_assoc($result))
		{
			echo '<h2>Príspevok je v &prime;' . $row['cat_name'] . '&prime; kategórii</h2><br />';
		}

		//robiť dotaz k témam
		$sql = "SELECT	
					topic_id,
					topic_subject,
					topic_date,
					topic_cat
				FROM
					topics
				WHERE
					topic_cat = " . mysql_real_escape_string($_GET['id']);

		$result = mysql_query($sql);

		if(!$result)
		{
			echo 'Téma sa nedá zobraziť, skúste to prosím neskôr znovu.';
		}
		else
		{
			if(mysql_num_rows($result) == 0)
			{
				echo 'Nie sú žiadne témy v tejto kategórii.';
			}
			else
			{
				//prepare the table
				echo '<table border="1">
					  <tr>
						<th>Téma</th>
						<th>Vytvoril</th>
					  </tr>';	

				while($row = mysql_fetch_assoc($result))
				{				
					echo '<tr>';
						echo '<td class="leftpart">';
							echo '<h3><a href="topic.php?id=' . $row['topic_id'] . '">' . $row['topic_subject'] . '</a><br /><h3>';
						echo '</td>';
						echo '<td class="rightpart">';
							echo date('d-m-Y', strtotime($row['topic_date']));
						echo '</td>';
					echo '</tr>';
				}
			}
		}
	}
}

include 'footer.php';
?>

 Krok 8: Zobrazenie kategórii a príspevkov na hlavnej stránke

Možno ste si všimli,že nám stále chýba súbor index.php . Nieje až tak dôležitý,samozrejme musí byť a využijeme ho k tomu,že ak sa niekto dostane k nám na fórum,zobrazí sa mu hlavná stránka kde bude hlavná lišta a v prostiedku fóra zobrazene kategórie, a posledné príspevky od daných uživateľov.

vytvoríme si index.php a doň vložíme následujúce:

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

$sql = "SELECT
			categories.cat_id,
			categories.cat_name,
			categories.cat_description,
			COUNT(topics.topic_id) AS topics
		FROM
			categories
		LEFT JOIN
			topics
		ON
			topics.topic_id = categories.cat_id
		GROUP BY
			categories.cat_name, categories.cat_description, categories.cat_id";

$result = mysql_query($sql);

if(!$result)
{
	echo 'Kategória sa nedá zobraziť, skúste to prosím neskôr znovu.';
}
else
{
	if(mysql_num_rows($result) == 0)
	{
		echo 'Žiadne kategórie zatiaľ neboli definované.';
	}
	else
	{
		//pripraviť tabuľku k rozdeleniu
		echo '<table border="1">
			  <tr>
				<th>Kategórie</th>
				<th>Posledné príspevky</th>
			  </tr>';	

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

				//fetch last topic for each cat
					$topicsql = "SELECT
									topic_id,
									topic_subject,
									topic_date,
									topic_cat
								FROM
									topics
								WHERE
									topic_cat = " . $row['cat_id'] . "
								ORDER BY
									topic_date
								DESC
								LIMIT
									1";

					$topicsresult = mysql_query($topicsql);

					if(!$topicsresult)
					{
						echo 'Posledná téma nedá zobraziť.';
					}
					else
					{
						if(mysql_num_rows($topicsresult) == 0)
						{
							echo 'žiadne témy';
						}
						else
						{
							while($topicrow = mysql_fetch_assoc($topicsresult))
			echo '<a href="topic.php?id=' . $topicrow['topic_id'] . '">' . $topicrow['topic_subject'] . '</a> v ' . date('d-m-Y', strtotime($topicrow['topic_date']));
						}
					}
				echo '</td>';
			echo '</tr>';
		}
	}
}

include 'footer.php';
?>

Tak a teraz si môžme vytvoriť kategóriu aby ste videli ako to bude vyzerať,nezabúdajte že to ešte není koniec,potrebujeme ešte skript na pridanie príspevkov do fóra a odpovede k témam.

1. Prihlásime sa ako administrátor do fóra a klikneme na Vytvorenie kategórie

Vytvorenie vlastného fóra pomocou PHP a MYSQL

2. Vyplníme a klikneme na Pridať kategóriu

Vytvorenie vlastného fóra pomocou PHP a MYSQL

Ak je všetko správne,malo by nám ukázať toto:

Vytvorenie vlastného fóra pomocou PHP a MYSQL

3. Teraz klikneme na domov,teda na index.php a úvodna stránka vyzerá takto:

Vytvorenie vlastného fóra pomocou PHP a MYSQL

4. Po kliknutí na kategóriu by sa nám malo ukazať toto,keďže ešte nemáme žiadnu tému

Vytvorenie vlastného fóra pomocou PHP a MYSQL


Krok 9: Vytváranie príspevkov

V tomto kroku budeme kombinovať techniky, ktoré sme získali v predchádzajúcich krokoch.Budeme používať overovanie, či je používateľ prihlásený,  používať vstupné dopyty či vytvoriť formulár na prípravu a odoslanie odpovede príspevku.

create_topic.php

V komentároch nájdete popis

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

echo '<h2>Vytvoriť tému</h2>';
if($_SESSION['signed_in'] == false)
{
	//užívateľ nie je prihlásený
	echo 'Je nám ľúto, musíte byť <a href="/forum/signin.php">prihlásený</a> aby ste mohli zakládať témy.';
}
else
{
	//užívateľ prihlásený
	if($_SERVER['REQUEST_METHOD'] != 'POST')
	{	

		//načítanie kategórií z databázy pre použitie v rozbaľovacej ponuke
		$sql = "SELECT
					cat_id,
					cat_name,
					cat_description
				FROM
					categories";

		$result = mysql_query($sql);

		if(!$result)
		{
			//dotaz zlyhal
			echo 'Chyba pri výbere z databázy. Prosím, skúste to znova neskôr.';
		}
		else
		{
			if(mysql_num_rows($result) == 0)
			{
				//nie sú kategórie, takže téma nemôže byť vytvorená
				if($_SESSION['user_level'] == 1)
				{
					echo 'Nevytvorili ste ešte kategórie.';
				}
				else
				{
					echo 'Než budete môcť písať tému, musíte počkať na admina aby vytvoril nejaké kategórie.';
				}
			}
			else
			{

				echo '<form method="post" action="">
					Predmet: <input type="text" name="topic_subject" /><br />
					Kategória:'; 

				echo '<select name="topic_cat">';
					while($row = mysql_fetch_assoc($result))
					{
						echo '<option value="' . $row['cat_id'] . '">' . $row['cat_name'] . '</option>';
					}
				echo '</select><br />';	

				echo 'Správa: <br /><textarea name="post_content" /></textarea><br /><br />
					<input type="submit" value="Vytvoriť príspevok" />
				 </form>';
			}
		}
	}
	else
	{
		//start the transaction
		$query  = "BEGIN WORK;";
		$result = mysql_query($query);

		if(!$result)
		{
			//Sakra! dotaz zlyhal
			echo 'Došlo k chybe pri vytváraní témy. Prosím, skúste to znova neskôr.';
		}
		else
		{

			$sql = "INSERT INTO 
						topics(topic_subject,
							   topic_date,
							   topic_cat,
							   topic_by)
				   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)
			{
				//niečo sa zase pokazilo
				echo 'Došlo k chybe pri vkladaní dát. Prosím, skúste to znova neskôr.<br /><br />' . mysql_error();
				$sql = "ROLLBACK;";
				$result = mysql_query($sql);
			}
			else
			{
				//Prvá otázka predmetu, teraz začína druhá, príspevku
				//načítať id čerstvo vytvorenej témy pre použitie v posts dotaze
				$topicid = mysql_insert_id();

				$sql = "INSERT INTO
							posts(post_content,
								  post_date,
								  post_topic,
								  post_by)
						VALUES
							('" . mysql_real_escape_string($_POST['post_content']) . "',
								  NOW(),
								  " . $topicid . ",
								  " . $_SESSION['user_id'] . "
							)";
				$result = mysql_query($sql);

				if(!$result)
				{

					echo 'Došlo k chybe pri vkladaní tvojho ​​príspevku. Prosím, skúste to znova neskôr.<br /><br />' . mysql_error();
					$sql = "ROLLBACK;";
					$result = mysql_query($sql);
				}
				else
				{
					$sql = "COMMIT;";
					$result = mysql_query($sql);

					//dotaz úspešný!
					echo 'Úspešne ste vytvorili <a href="topic.php?id='. $topicid . '">vašu novú tému</a>.';
				}
			}
		}
	}
}

include 'footer.php';
?>

Spočiatku sú polia definované, až potom hodnoty budú vložené. Videli sme prvý z nich, je to len reťazec, ktorý je vyrobený v bezpečí pomocou mysql_real_escape_string (). Druhá hodnota, NOW (), je SQL funkcia pre aktuálny čas. Tretia hodnota, je hodnota ktorú sme nevideli. To sa odkazuje na (platné) id kategórie. Posledná hodnota sa vzťahuje k (súčasné) USER_ID, ktoré je v tomto prípade hodnota $ _SESSION [user_id ‘]. Táto premenná bola vyhlásená v priebehu prihlásenia procesu.


Krok 10: Zobrazenie príspevkov

Ak vytvoríte príspevok,logický sa musí aj správne zobraziť. Na to slúži súbor topic.php

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

$sql = "SELECT
			topic_id,
			topic_subject
		FROM
			topics
		WHERE
			topics.topic_id = " . mysql_real_escape_string($_GET['id']);

$result = mysql_query($sql);

if(!$result)
{
	echo 'éma sa nedá zobraziť, skúste to prosím neskôr znovu.';
}
else
{
	if(mysql_num_rows($result) == 0)
	{
		echo 'Príspevok&prime;t neexistuje.';
	}
	else
	{
		while($row = mysql_fetch_assoc($result))
		{
			//zobraziť post dáta
			echo '<table class="topic" border="1">
					<tr>
						<th colspan="2">' . $row['topic_subject'] . '</th>
					</tr>';

			//načítať príspevky z databázy
			$posts_sql = "SELECT
						posts.post_topic,
						posts.post_content,
						posts.post_date,
						posts.post_by,
						users.user_id,
						users.user_name
					FROM
						posts
					LEFT JOIN
						users
					ON
						posts.post_by = users.user_id
					WHERE
						posts.post_topic = " . mysql_real_escape_string($_GET['id']);

			$posts_result = mysql_query($posts_sql);

			if(!$posts_result)
			{
				echo '<tr><td>Tieto príspevky sa nedájú zobraziť, skúste to prosím neskôr znovu.</tr></td></table>';
			}
			else
			{

				while($posts_row = mysql_fetch_assoc($posts_result))
				{
					echo '<tr class="topic-post">
							<td class="user-post">' . $posts_row['user_name'] . '<br/>' . date('d-m-Y H:i', strtotime($posts_row['post_date'])) . '</td>
							<td class="post-content">' . htmlentities(stripslashes($posts_row['post_content'])) . '</td>
						  </tr>';
				}
			}

			if(!$_SESSION['signed_in'])
			{
				echo '<tr><td colspan=2>Musíte sa <a href="signin.php">prihlásiť</a> pre pridanie odpovede. Ak nie ste registrovaný <a href="signup.php">zaregistrujte</a> si účet.';
			}
			else
			{
				//zobraziť odpoveď box
				echo '<tr><td colspan="2"><h2>Odpoveď:</h2><br />
					<form method="post" action="reply.php?id=' . $row['topic_id'] . '">
						<textarea name="reply-content"></textarea><br /><br />
						<input type="submit" value="Odoslať odpoveď" />
					</form></td></tr>';
			}

			//dokončiť tabuľku
			echo '</table>';
		}
	}
}

include 'footer.php';
?>

 


 

Krok 11: Odpovede na už vytvorené témata

Ak niekto vytvorí nejakú tému,tak na fórach je zvykom,že iný uživatelia môžu do danej témy prispievať vlastnými prśipevkami tzv. Odpoveď. Na to bude slúžiť súbor reply.php

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

if($_SERVER['REQUEST_METHOD'] != 'POST')
{
	//niekto volá súbor priamo
	echo 'Tento súbor nemôže byť volaný priamo.';
}
else
{
	//skontrolujte označenie stavu
	if(!$_SESSION['signed_in'])
	{
		echo 'Musíte byť prihlásený, aby ste mohli písať odpoveď.';
	}
	else
	{
		//skutočný užívateľ zaslal skutočnú odpoveď
		$sql = "INSERT INTO 
					posts(post_content,
						  post_date,
						  post_topic,
						  post_by) 
				VALUES ('" . $_POST['reply-content'] . "',
						NOW(),
						" . mysql_real_escape_string($_GET['id']) . ",
						" . $_SESSION['user_id'] . ")";

		$result = mysql_query($sql);

		if(!$result)
		{
			echo 'Vaša odpoveď nebola uložená, skúste to prosím neskôr znovu.';
		}
		else
		{
			echo 'Vaša odpoveď bola uložená, pozrite sa <a href="topic.php?id=' . htmlentities($_GET['id']) . '">na tému</a>.';
		}
	}
}

include 'footer.php';
?>

 


Krok 12: Odhlásenie prihláseneho uživatela

Tak a sme pri konci našého návodu. Fórum máme hotové,ale budeme ešte potrebovať skript,ktorý nam odhlási prihláseneho uživateľa. Vytvoríme si signout.php do ktorého vložíme následujúci skript:

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

echo '<h2>Odhlásiť sa</h2>';

//skontroluje uživateľa
if($_SESSION['signed_in'] == true)
{
	//strážiť všetky premenné
	$_SESSION['signed_in'] = NULL;
	$_SESSION['user_name'] = NULL;
	$_SESSION['user_id']   = NULL;

	echo 'Úspešne ste sa odhlásili, ďakujeme vám za návštevu.';
}
else
{
	echo 'Nie ste prihlásený <a href="signin.php">zaregistrujte sa</a>?';
}

include 'footer.php';
?>

Skript len použije session ktorý sa uložil pri prihásení a odpojí ho od databázi.

 


Hurá máme vytvorené fórum. Hoc som tento článok písal 5 hodín použil som na pomoc pár zahraničných fór a stránok,čiže preklad,vypracovanie a oprava nejakých kódov dala zabrať,ale som rád že sa podaril a dúfam že sa vám páči. Tvorba fóra nieje jednoduchá vec,ale tento návod je jeden z najjednoduchších ako si vytvoriť celkom pekné fórum a použiť len tie najdôležitejšie php kódy a tabuľky. Vy môžte aj naďalej experimentovať,vložiť do fóra nejaké logá pomocou html,tý šikovnejší môžu vložiť do registrácii CAPTCHA kódy,alebo umožniť odosielať odpovede neregistrovaným,pomocou nejakého zabezpečovacieho kódu a tak. V podobných návodoch budem pokračovať,ukážem vám ako si vytvoriť vlastný e-shop,redakčný systém a podobné veci ktoré dnes letia :)


 

Takže hotové fórum si môžte vyskúšať tu:

 

www.pocitacovyexpert.6f.sk/php/forum/


Tu si môžte stiahnuť hotové súbory

forum-pocitacovyexpert.6f.sk

11 thoughts on “Vytvorenie vlastného fóra pomocou PHP a MYSQL

  1. Stránka je naozaj super a teším sa na ďalšie veci.

    K tomu fóru ešte. Vedeli by ste poradiť ako do správy pri vytváraní témy zakomponovať jednoduchý editor textu ?

  2. Zdravíčko mám taký problém keď vyplním zložku registrovať tak mi zobrazí že niečo nieje v poriadku a že to mám skúsiť neskôr neviete kde by mohla byť chyba ?

  3. Už som to odstránil sám :) … spravil som chybu v databáze :) … ďakujem krásne za tento návod hodne mi pomohol pri tvorbe môjho ročníkového projektu :)

  4. Ahojte
    Stranka je super vinkajuco vysvetlene skusam prvy krat programovat html a php sice programujem C-cku, visual basic, PLC,Fanuc,DSM, a ani neviem este co ale v tomto pripade sa mi javy proble viete mi niekto pomoct prihlasim sa ako administrator vsetko ok.
    Len ked dam vytvorit kategoriu nastave problem a to je toto

    chybaTable ‘users.categories’ doesn’t exist

    v com mam problem
    Dakujem za rychlu odpoved

  5. ja mam web kde mam v mamber.php nastavene.: ze kazdich 10 min ked user klikne na button claim points tak mu do balance prirata 5 bodou. ja by som potreboval spravit lvl 1 2 3 adt to by nebol problem. skopirujem celi php mamber ulozim ako mamber1php a vnom nastavim na 10min 20bodou. problem mam v tom ze ako to mam spravit aby ked uzivatel si zakupi lvl alebo ho ziska to je fuk. sa po prihlaseni automaticki prihlasi uz ako lvl xy teda do mamber1. php kde uz ma tich 10min 20 bodou. taktiez potrebujem aby to bolo aj casovo obmedzene teda lvl xy by bol cca 10 dni a potom automaticky sa stal zas LVL 0 cize navrat do mamber.php kde je 10 min uz len 5 bodou

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *