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:
CREATE TABLE `uzivatele` (
`id` int(64) NOT NULL AUTO_INCREMENT,
`user` varchar(1024) collate utf8_czech_ci NOT NULL,
`pass` varchar(40) collate utf8_czech_ci NOT NULL,
`mail` varchar(1024) collate utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`)
) 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:
//funkce: connect()
//vstupni hodnoty: <nic>
//vystupni hodnoty: <nic>
//popis: Pripoji se k danemu MySQL serveru, a vybere danou databazi
function connect() {
mysql_connect("mysql.webzdarma.cz",
"kolemjdouci",
"xxxxx");
//pripojime k serveru }
//funkce: hashuj($str)
//vstupni hodnoty: string = string, ktery budeme hashovat
//vystupni hodnoty: vystupni hash
//popis: vytvori a vrati hash ze vstupniho stringu
function hashuj($string) {
return sha1("kD0a1".
md5("xA4".
$string).
"f4A");
}
//funkce: login($user, $pass)
//vstupni hodnoty: $user = string, uzivatel
// $pass = string, heslo (zahashovane funkci hashuj())
//vystupni hodnoty: <nic>
//popis: ulozi do cookies phpsessid
function login ($user, $pass) {
}
//funkce: prihlaseny()
//vstupni hodnoty: <nic>
//vystupni hodnoty: true -> je prihlaseny, false -> neni
//popis: zjisti pres session, zda-li jsme prihlaseni
function prihlaseny() {
$pass = $_SESSION["pass"];
$rsrc_login =
mysql_query("SELECT * FROM uzivatele WHERE user='$user' and pass='$pass'");
return true;
} else {
return false;
}
}
//funkce: logout
//vstupni hodnoty: <nic>
//vystupni hodnoty: <nic>
//popis: odhlasi uzivatele a vymaze phpsessid
function logout(){
}
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:
/****************************************************\
|* AKCE *|
\****************************************************/
connect(); //pripojime se k databazi
//pokud se odhlasujeme
if(isset($_GET["logout"])) { logout();
header("Location: index.php");
}
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:
<?php
include "funkce.php"; //inkludujeme soubor s funkcemi
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
<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
<div class="contentc">
<?php
if(isset($_GET["strana"])){ //budeme inkludovat stranku if(file_exists("./".
$_GET["strana"].
".php") &&
//zjistime, jestli stranka existuje (zamezeni RFI) (substr_count($_GET["strana"],
"../") ==
0) &&
//omezime vkladani podrazenych slozek (linux) (substr_count($_GET["strana"],
"..\\") ==
0)){ //to same pro win include_once "./$_GET[strana].php"; //pokud jsme vsim prosli, inkludujeme
} else { //pokud nic neinkludujeme
echo "<h3>Nic neinkludujeme, může zde být tedy HomePage =)</h3>";
}
}
?>
</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
<?php
if(isset($_POST["btn_ok"])) { //pokud bylo stisle tlacitko "submit", pri prichodu na tuto stranku $pass = hashuj($_POST["pass"]); //promenna $pass se prozene nasi hashovaci funkci
$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 login($user, $pass); //prihlasime ho
} else { //uzivatel neexistuje
echo "<h1>Špatné uživatelské jméno, nebo heslo!!</h1>\r\n";
//vypiseme chybovou hlasku }
}
if(prihlaseny() == false) { //pokud nejsme prihlaseni
//dole: formular pro prihlaseni
?>
...
...
<?php
} else { //pokud jsme prihlaseni, vypiseme Administratorske menu (zatim jen odhlaseni ;))
?>
<ul>
<li><a href="?logout">Odhlásit se</a></li>
</ul>
<?php
}
?>
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:
<?php
header("Location: ../index.php?strana=admin/admin");
?>
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 :-)