Zpět na seznam článků     Číst komentáře (50)     Verze pro tisk

Vytváříme si vlastní redakční systém - 1. část

Autor: DjH   
22.4.2008

V prvním díle bude trocha teorie, a vytvoříme si jednoduchou kostru redakčního systému, která se bude umět přihlásit a odhlásit =)


Vytváříme si vlastní redakční systém v PHP

1. díl


Mnoho lidí se učí PHP, a chtějí si udělat vlastní stránky. Mnozí je však mnohdy dělají neefektivní a hlavně nezabezpečené. Proto bych vám chtěl ukázat postup při tvorbě takového redakčního systému (dále jen RS). Nejdříve si však musíme uvědomit, jak má náš redakční systém vypadat. Já vám budu prezentovat postup při tvoření jednoduchého RS, který bude sloužit jako jednoduchý weblog. Bude v něm tedy administrace článků (tj. vytváření, editace, mazání), administrace statických stránek (tedy něco jako: „O mě“, „Kontakt“, „Doporučuji“…), jednoduchá diskuze se stránkováním (např. 10 příspěvků na stránce), práce s novinkami a úprava hlavního menu. V tomto seriále vás však základy PHP ani MySQL učit nebudu, a zdůrazňuji, že nebudu požívat OOP (Objektově Orientované Programování), protože se mi prostě nelíbí. V PHP OOP umím, ale zdá se mi zbytečné, jde to totiž i bez něj. považuji to za samozřejmost do puštění se do tvoření RS. Celý seriál budu prezentovat na tomto designu, který si, pokud chcete, stáhněte.

Čím začneme?

Nejlepší je podle mého názoru začít se samotným administračním rozhraním. Tedy jako první věc si vytvoříme přihlašování/odhlašování do systému. Začneme si tvořit vlastní funkce, a tabulky. Jako optimální tabulku do začátku, bych doporučoval asi takovouto: tabulka „uzivatele“, čtyři sloupce (id, user, pass, mail), kde id je int(64) + auto_increment + primary_key, user a mail varchar(1024), a pass varchar(40). Tabulku vytvořte třeba v phpMyAdminovi ručně, nebo zadáním tohoto kódu:
  1. CREATE TABLE `uzivatele` (
  2. `id` int(64) NOT NULL AUTO_INCREMENT,
  3. `user` varchar(1024) collate utf8_czech_ci NOT NULL,
  4. `pass` varchar(40) collate utf8_czech_ci NOT NULL,
  5. `mail` varchar(1024) collate utf8_czech_ci NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci ;

Přidejte si do ní jednoho uživatele
INSERT INTO `uzivatele` (user, pass, mail) VALUES ('admin', 'e028ce357c65423e8fa383c38f202f25284bced0', 'admin@admin.cz');

Hash 'e028ce357c65423e8fa383c38f202f25284bced0' je výplodem funkce hashuj(), kterou si za chvíli vytvoříme. V plaintextu znamená slovo ‚admin‘. Tedy uživatelské jméno = „admin“, heslo = „admin“. V PHP si tedy vytvoříme funkci login();, která nám uloží do cookies hodnotu PHPSESSID, tedy až po tom, co zjistíme, zdali se v databázi nachází řádek se zadaným jménem a heslem. V téhle session se bude ukládat user a pass šifrované nějakým algoritmem, například sha1("kD0a1".md5("xA4".$user)."f4A"). Dále si vytvoříme funkci, která nás odhlásí a session vymaže, třeba logout(). Chybí nám jediná důležitá funkce, která bude zjišťovat, zdali jsme přihlášeni, budeme ji nazývat prihlasen(), a bude vracet true, pokud zjistí, že jsme přihlášení nebo false, pokud nebudeme přihlášení. No a co by nám v žádném případě nemělo chybět, je funkce na připojení do databáze. Funkce by vypadali asi takto:
  1. //funkce: connect()
  2. //vstupni hodnoty: <nic>
  3. //vystupni hodnoty: <nic>
  4. //popis: Pripoji se k danemu MySQL serveru, a vybere danou databazi
  5. function connect() {
  6. mysql_connect("mysql.webzdarma.cz", "kolemjdouci", "xxxxx"); //pripojime k serveru
  7. mysql_select_db("kolemjdouci"); //vybereme databazi
  8. }
  9.  
  10. //funkce: hashuj($str)
  11. //vstupni hodnoty: string = string, ktery budeme hashovat
  12. //vystupni hodnoty: vystupni hash
  13. //popis: vytvori a vrati hash ze vstupniho stringu
  14. function hashuj($string) {
  15. return sha1("kD0a1".md5("xA4".$string)."f4A");
  16. }
  17.  
  18. //funkce: login($user, $pass)
  19. //vstupni hodnoty: $user = string, uzivatel
  20. // $pass = string, heslo (zahashovane funkci hashuj())
  21. //vystupni hodnoty: <nic>
  22. //popis: ulozi do cookies phpsessid
  23. function login ($user, $pass) {
  24. session_register("user", $user);
  25. session_register("pass", $pass);
  26. }
  27.  
  28. //funkce: prihlaseny()
  29. //vstupni hodnoty: <nic>
  30. //vystupni hodnoty: true -> je prihlaseny, false -> neni
  31. //popis: zjisti pres session, zda-li jsme prihlaseni
  32. function prihlaseny() {
  33. $user = mysql_escape_string($_SESSION["user"]);
  34. $pass = $_SESSION["pass"];
  35.  
  36. $rsrc_login = mysql_query("SELECT * FROM uzivatele WHERE user='$user' and pass='$pass'");
  37. if(mysql_num_rows($rsrc_login) != 0) {
  38. return true;
  39. } else {
  40. return false;
  41. }
  42. }
  43.  
  44. //funkce: logout
  45. //vstupni hodnoty: <nic>
  46. //vystupni hodnoty: <nic>
  47. //popis: odhlasi uzivatele a vymaze phpsessid
  48. function logout(){
  49. }

Tyto funkce si uložte do jednoho souboru, který se bude jmenovat funkce.php. Je dobré si vytvořit buď nový soubor akce.php, který bude dělat věci, které se budou provádět operace, které jsou nutné provést ještě před načtením samotné stránky, nebo si je zapisovat také do souboru funkce.php. Já jsem zastánce kódu, který je v co nejméně souborech, a proto budu přidávat "akce" do souboru funkce.php. Jednak nejdůležitější funkce, kterou je nutné provést bezprostředně před načtením stránky je připojení do databáze. Tedy na konec souboru funkce.php vložíme connect();. Dále je důležité ještě před načtením stránky zjistit, zdali se neodhlašujeme. Za f-cí connect(); to můžeme zjistit. Pod funkcemi může být třeba tento kód:
  1. /****************************************************\
  2. |* AKCE *|
  3. \****************************************************/
  4. connect(); //pripojime se k databazi
  5.  
  6. //pokud se odhlasujeme
  7. if(isset($_GET["logout"])) {
  8. logout();
  9. header("Location: index.php");
  10. die();
  11. }

Nyní se vrhneme do úprav indexu. Po stažení dané šablony si index.html přejmenujeme na index.php a prostudujeme v nějakém editoru nebo nějakém prostředí, doporučuji PSPad. Důležitou věcí (hlavně ve starších verzích PHP) je start sessions. Toho docílíme funkcí session_start(), kterou připište hned na první řádek do souboru index.php. Dále bychom v indexu měli ikludovat soubor funkce.php a vypnout reportování chyb. Soubor index.php tedy musí začínat takto:
  1. <?php
  2. session_start(); //zavedeni sessions
  3. error_reporting(0); //vypneme reportovani chyb a notices
  4. include "funkce.php"; //inkludujeme soubor s funkcemi
  5. ?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  7. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  8. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
  9. <head>

Po prostudování HTML kódu zjistíme, že obsah stránky se nám nachází v tagu <div class="contentc">. Do tohoto tagu vložíme
  1. <div class="contentc">
  2. <?php
  3. if(isset($_GET["strana"])){ //budeme inkludovat stranku
  4. if(file_exists("./".$_GET["strana"].".php") && //zjistime, jestli stranka existuje (zamezeni RFI)
  5. (substr_count($_GET["strana"], "../") == 0) && //omezime vkladani podrazenych slozek (linux)
  6. (substr_count($_GET["strana"], "..\\") == 0)){ //to same pro win
  7. include_once "./$_GET[strana].php"; //pokud jsme vsim prosli, inkludujeme
  8. } else { //pokud nic neinkludujeme
  9. echo "<h3>Nic neinkludujeme, může zde být tedy HomePage =)</h3>";
  10. }
  11. }
  12. ?>
  13. </div>

Tedy, když budeme chtít inkludovat stránku "dabel.php", která je ve složce "stranky", bude URL vypadat takto: www.somebody.cz/index.php?strana=stranky/dabel nebo zkráceně www.somebody.cz/?strana=stranky/dabel. My si vytvoříme složku "admin" vytvoříme, a vložíme do něj soubor „admin.php“, který bude dělat jen jedno – přihlašovat, a když budeme přihlášeni, tak odhlašovat. Řekněme, že <input type="text"> pro zadání uživatele se jmenuje "user", pro zadání hesla "pass", a potvrzovací <input type="submit"> se jmenuje btn_ok
  1. <?php
  2. if(isset($_POST["btn_ok"])) { //pokud bylo stisle tlacitko "submit", pri prichodu na tuto stranku
  3. $user = mysql_escape_string($_POST["user"]); //asociace promenne $user
  4. $pass = hashuj($_POST["pass"]); //promenna $pass se prozene nasi hashovaci funkci
  5. $rsrc_login = mysql_query("SELECT * FROM uzivatele WHERE user='$user' and pass='$pass'"); //dotaz na databazi, jestli existuje nejaky vysledek, s daty $user a $pass
  6. if(mysql_num_rows($rsrc_login) != 0) { //uzivatel existuje
  7. login($user, $pass); //prihlasime ho
  8. } else { //uzivatel neexistuje
  9. echo "<h1>Špatné uživatelské jméno, nebo heslo!!</h1>\r\n"; //vypiseme chybovou hlasku
  10. }
  11. }
  12. if(prihlaseny() == false) { //pokud nejsme prihlaseni
  13. //dole: formular pro prihlaseni
  14. ?>
  15. ...
  16. ...
  17. <?php
  18. } else { //pokud jsme prihlaseni, vypiseme Administratorske menu (zatim jen odhlaseni ;))
  19. ?>
  20. <ul>
  21. <li><a href="?logout">Odhlásit se</a></li>
  22. </ul>
  23. <?php
  24. }
  25. ?>

Jelikož na zobrazení administrace se vám asi nebude chtít zapisovat celé www.somebody.cz/index.php?strana=admin/admin, je praktičtější zadávat www.somebody.cz/admin. Máme dvě možnosti jak to udělat. Buď do složky "admin" vytvoříme ještě "index.php", který bude obsahovat:
  1. <?php
  2. header("Location: ../index.php?strana=admin/admin");
  3. ?>

nebo vytvořit soubor .htaccess také ve složce admin, který bude obsahovat:
RewriteEngine On
RewriteRule /admin /index.php?strana=admin/admin [R=301]

Tedy po přístupu na www.somebody.cz/admin nás skript automaticky přesměruje na www.somebody.cz/index.php?strana=admin/admin. To je pro dnešek vše, dnešní kompletní práci (i s designem a databází) si můžete stáhnout zde. Příště si vytvoříme jednoduchou diskuzi, i se stránkováním :-)

Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 2.65/176

1  2  3  4  5    
(známkování jako ve škole)