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
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.
Vložíme príkaz:
A klikneme na Vykonaj
Vytvorí sa nám prvá tabuľka z názvom users a vnej polia ktoré sme už definovali
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;
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;
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;
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.
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:
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
2. Klikneme na Registrovať
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.
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:
Celkom dole kde je user_level je ta 0 a mi ju zmeníme na 1 a klikneme na Vykonaj
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:
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:
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 ′' . $row['cat_name'] . '′ 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
2. Vyplníme a klikneme na Pridať kategóriu
Ak je všetko správne,malo by nám ukázať toto:
3. Teraz klikneme na domov,teda na index.php a úvodna stránka vyzerá takto:
4. Po kliknutí na kategóriu by sa nám malo ukazať toto,keďže ešte nemáme žiadnu tému
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′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
Fantastický tutík! Admin, klobúk dole a moc ďakujem :-)
Ďakujeme,bude toho oveľa viac,neskôr pridáme administráciu,profili a iné. Taktiež chystáme PHP tutoriál.
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 ?
Stiahnete si TinyMCE editor,vložíte ho do rootu stránky http://www.tinymce.com/download/download.php ,otvoríte su súbor create_topic.php a tam vložíte príkaz
tinyMCE.init({
…
plugins : „table,contextmenu,paste,-externalplugin“
});
Funguje ako hodinky, ďakujem :-)
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 ?
Zdravím,neviem akú chybu máte na mysli.
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 :)
Taktiež sme radi že vám pomohla naša práca :)
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
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