Slevový týden - Květen Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

Lekce 4 - Programujeme neobjektový redakční systém v PHP (NERS)

V minulé lekci, Formulář a výpis dat z databáze do tabulky v PHP, jsme si udělali krátký úvod do databází a vytvořili si databázi pro náš web.

Úplné základy práce s databázi tedy již ovládáme a nic nám nebrání k tomu, abychom si naprogramovali plnohodnotný redakční systém v PHP.

NERS

V několika málo dílech vytvoříme systém, pomocí kterého se budeme moci na náš web přihlašovat a nahrávat na něj články pomocí editoru. Systém jsem pojmenoval NERS (NEobjektový Redakční Systém). Má tyto atributy:

  • Celý systém je napsaný jen základními PHP funkcemi, tedy bez objektů a bez šablon. Jedinou výjimkou je databázový wrapper, bez kterého se bohužel neobejdeme.
  • Celý systém je obsažen pouze v 6ti PHP souborech
  • Délka žádného souboru systému nepřesahuje 100 řádků. (asi o 5 řádků je delší jen editor.php, kde jsem nechal nějaké mezery kvůli přehlednosti).
  • Systém stihneme vytvořit velmi rychle a to pouze ve čtyřech tutoriálech
  • Systém obsahuje uživatelské role, registraci, přihlašování, výpis článků a interaktivní editor článků

Systém byl napsán tak, aby ho mohl používat a rozšiřovat kdokoli bez ohledu na jeho znalosti PHP. Bez objektů, knihoven a všeho dalšího se obešel díky kompromisům, zjednodušením a minimálním požadavkům. Systém není určený pro vážné projekty a neukazuje, jak se v PHP správně programují informační systémy. Ukazuje, jak lze co nejjednodušeji dosáhnout požadovaného výsledku. Pro vážné informační systémy musíte použít MVC framework. Na ITnetworku je na toto téma spoustu pokročilých seriálů a materiálů.

Příprava projektu

Než začneme programovat PHP skripty, připravíme si layout stránky a databázovou strukturu.

Layout

Nejprve budeme potřebovat nějaký layout (HTML kostru), do kterého doprogramujeme pomocí PHP požadované funkce. Určitě ho nebudeme tvořit od znovu, ale vypůjčíme si ho z místního ukázkového webu od Honzy Bittnera. V seriálu Webové stránky krok za krokem si otevřete poslední díl a kompletní web si stáhněte a prohlédněte. Pokud čemukoli nerozumíte, v seriálu naleznete detailní vysvětlení každé části. Web je jen čisté HTML, takže byste s ním neměli mít problém.

HoBiho web v HTML a CSS

Založte si nový PHP projekt a přesuňte do něj obsah archivu s HoBiho webem. Všechny HTML stránky z něj odstraňte, nebudeme je potřebovat.

Databáze

Do projektu si vložte náš wrapper Db.php (ke stažení v 2. dílu tohoto seriálu).

Přejděte do PHPMyAdmin a vytvořte si nějakou novou databázi, já si ji pojmenoval ners_db. Nezapomeňte nastavit porovnávání na utf8_czech_ci.

Vytvoření databáze v phpMyAdmin
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Databázi si otevřete. Nyní si vytvoříme tabulky, budou jen dvě.

Uživatelé

Vytvořte si novou tabulku uzivatele. Bude mít celkem 4 sloupce (pole):

  • uzivatele_id - typ int - primární klíč, autoincrement
  • jmeno - typ varchar - délka 255
  • heslo - typ varcha - délka 255
  • admin - typ int, výchozí: 0 (vyberte možnost "Dle zadání" a poté zadejte 0, viz obrázek níže)

Sloupec admin určuje zda je uživatel administrátor (0/1).

Naklikaná tabulka by měla vypadat takto:

Vytvoření tabulky uživatelů v phpMyAdmin

(Nezapomeňte na primární klíč a AI u pole uzivatele_id. Na screenshotu to není vidět)

Uložíme tlačítkem Uložit níže.

Články

Přidáme ještě tabulku clanky. Ta bude obsahovat 6 sloupců (polí).

  • clanky_id - typ int - primární klíč, autoincreament
  • titulek - typ varchar - délka 255
  • obsah - typ text
  • url - varchar - délka 255
  • popisek - varchar - délka 255
  • klicova_slova - varchar - délka 255

Naklikaná tabulka:

Vytvoření tabulky článků v phpMyAdmin

(Opět nezapomeňte na primární klíč a autoinkrementaci u pole clanky_id)

Sloupec URL je url adresa, přes kterou budeme k článku přistupovat. Např. pro článek s titulkem "Úvodní článek" by URL mohlo vypsat jako "uvodni-clanek". Některé systémy články zobrazují jen podle číselného ID, což je však nepříjemné jak pro uživatele, tak pro vyhledávače. Pro text článku zvolíme datový typ text, varchar je vhodný zejména pro kratší texty.

Potvrdíme tlačítkem Uložit. Nyní máme vše připravené pro to, abychom se pustili do samotných PHP skriptů.

PHP Skripty

PHP skriptů bude tedy celkem 6. Každý skript bude rozdělen na 2 části. V první polovině bude PHP blok s obsluhou, v druhé polovině bude HTML kód se stránkou a nějakou příměsí PHP kódu s výpisem výstupu obsluhy. Tyto 2 části se v aplikaci většinou striktně oddělují do samostatných souborů, ale to pro naše účely zanedbáme. Jak jsem již uváděl, na prvním místě tohoto projektu je jednoduchost, díky které bude návrh aplikace trochu trpět. Malý projekt to zvládne, s něčím větším by to byl již problém.

Jako první se musíme do našeho systému zaregistrovat. Proto do kořenové složky s projektem přidáme soubor registrace.php

Do souboru vložíme nejprve následující HTML kód:

<!DOCTYPE html>
<html lang="cs-cz">
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="styl.css" type="text/css" />
    <title>Registrace</title>
</head>

<body>
    <article>
        <div id="centrovac">
            <header>
                <h1>Registrace</h1>
            </header>
            <section>
                <?php
                    if (isset($zprava))
                        echo('<p>' . $zprava . '</p>');
                ?>

                <form method="post">
                    Jméno<br />
                    <input type="text" name="jmeno" /><br />
                    Heslo<br />
                    <input type="password" name="heslo" /><br />
                    Heslo znovu<br />
                    <input type="password" name="heslo_znovu" /><br />
                    Zadejte aktuální rok (antispam)<br />
                    <input type="text" name="rok" /><br />
                    <input type="submit" value="Registrovat" />
                </form>
            </section>
            <div class="cistic"></div>
        </div>
    </article>
</body>
</html>

Je krátký a jednoduchý. Obsahuje HTML strukturu a v ní formulář pro registraci nového uživatele do systému. Uživatel zadá jméno, 2x heslo (pro kontrolu) a zadá aktuální rok, což je jednoduchá ochrana proti spamu. V HTML kódu je malá příměs PHP, která vypisuje text v proměnné $zprava, pokud tato proměnná existuje. Proměnnou budeme používat pro přenos zprávy z PHP bloku do HTML bloku.

Stránka vypadá nyní takto:

Registrace nového uživatele systému v PHP

V příští lekci, NERS - Registrace uživatelů v PHP, si připravíme projekt NERS - NEobjektový Redakční Systém v PHP a vytvoříme nový PHP skript.


 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
34 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Formulář a výpis dat z databáze do tabulky v PHP
Všechny články v sekci
Databáze v PHP pro začátečníky
Miniatura
Následující článek
NERS - Registrace uživatelů v PHP
Aktivity (5)

 

 

Komentáře

Avatar
Libor Šimo (libcosenior):29.3.2014 9:10

Ahoj, po otvorení stránky sa mi zobrazí vypísané meno root a heslo ******.
Asi to robí prehliadač zo zapamätaných údajov.
Je to v poriadku?

Odpovědět
29.3.2014 9:10
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:29.3.2014 9:15

To vypadá na prohlížeč. Budeš mu to muset zakázat v HTML.

Odpovědět
29.3.2014 9:15
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Libor Šimo (libcosenior):29.3.2014 9:27

Rád by som, ale ako? Navyše keď to zakážem, prestane mi fungovať automatické dopĺňanie hesiel, nie?

Editováno 29.3.2014 9:29
Odpovědět
29.3.2014 9:27
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovědět
29.3.2014 9:34
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Libor Šimo (libcosenior):29.3.2014 9:38

Díky, autocomplete="off" to vyriešilo.

Odpovědět
29.3.2014 9:38
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Josef Kuchař - Pepa489:31.3.2014 20:44

Nebylo by lepší na ten sloupec admin dát small int?

Odpovědět
31.3.2014 20:44
2x piš, jednou debuguj
Avatar
Jan Lupčík
Šéfredaktor
Avatar
Jan Lupčík:6.8.2014 17:50

Nevíte, jak se přihklásit do phpmyadmin přes net? Stahoval jsem si Db.php z lekce 2., vyplnil tam své přihlašovací údaje a furt mi to nešlo (nenačetlo se ani na hostingu registrace.php).
Předem děkuji za odpověď. :)

Odpovědět
6.8.2014 17:50
TruckersMP vývojář
Avatar
l.kvapil9
Člen
Avatar
l.kvapil9:15.12.2014 19:27
:)
Editováno 15.12.2014 19:27
 
Odpovědět
15.12.2014 19:27
Avatar
Martin Píštěk (Denir):5.2.2015 14:12

Nebylo by dobrý v tabulce uživatele hned při vytváření zadat u sloupce admin hodnotu 0? Při vkládání uživatelů se to v dotazu nezadává a doplní se tam potom NULL.

 
Odpovědět
5.2.2015 14:12
Avatar
blazoid
Člen
Avatar
blazoid:5.1.2016 23:04

Ahoj, mám na vás dotaz s prosbou :-) Zkoušel jsem můj projekt založený na tomto projektu hodit na web (mám hosting u OneBIT), při spuštění registrace.php vypíše prohlížeč chybu 500 (interní chyba serveru), přitom na Apache na lokálu to funguje korektně. Do "Db::connect(.....) jsem doufám správně zadal požadované - to jest heslo, uživatel atd...když v souboru registrace.php zakomentuji řádek s Db::connect, stránka se normálně otevře...(samoz­řejmě pak nefunguje práce s databází). Díky za všechnu pomoc.

 
Odpovědět
5.1.2016 23:04
Avatar
Odpovídá na blazoid
Dominik Gavrecký:5.1.2016 23:09

Posli ho sem a zmeň údaje a mi ti na to pozrieme.

Odpovědět
5.1.2016 23:09
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
David Adámek:27.4.2017 13:25

Zdravim,

mam problem s cestinou. Pri zakladani DB ners_db jsem nastavil utf8_czech_ci, tabulky vidim vytvorene s utf8_czech_ci, ale na strance registrace.php vidim misto diakritiky otazniky. Zkousel jsem smazat DB a vytvoril znova, ale nepomohlo to...

Mozna na to casem prijdu.
Ale kdyby me nekdo nakopnul, tak bych se vubec nezlobil... :-)

Diky, D.

Editováno 27.4.2017 13:27
 
Odpovědět
27.4.2017 13:25
Avatar
Jiří Fencl
Člen
Avatar
Odpovídá na David Adámek
Jiří Fencl:27.4.2017 13:38

Zkus hned po pripojeni do db poslat query

set names utf8

Pak taky pozor na utf-8 na samotne vypisove strance

 
Odpovědět
27.4.2017 13:38
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
David Adámek:27.4.2017 13:46

To asi nebude tim, problem bude podle me nekde jinde.
Dela mi to, i kdyz mam v prihlaseni.php pouze HTML kod (viz HTML kod nahore)

 
Odpovědět
27.4.2017 13:46
Avatar
David Adámek:27.4.2017 13:54

Jeste doplnim, ze kdyz vyhodim radek <meta charset="utf-8" /> tak se stranka zobrazi korektne...

 
Odpovědět
27.4.2017 13:54
Avatar
Zdeněk Jurák:5.2.2018 19:39

Ahoj, potreboval bych poradit s kodem. Snazim se udelat aby se mi pri najeti na index.php nacetl posledni napsany clanek (zaznam). Takze ctu z DB id zaznamu, ale pokazde mi to misto jednoho cisla, ktere potrebuji zadat do odkazu nacte array. Nevim co mam spatne. PS: cele jsem si to predelal k obrazu svemu, takze se nejedna o originalni kod. Dekuji za rady

<?php
session_start();
require('Db.php');
Db::connect('127­.0.0.1', 'maintenance', '', '');

//tohle jsem pridal abych dostal cislo posledniho ID
$existuje = Db::queryALL('
SELECT id
FROM zaznam
ORDER BY id DESC
LIMIT 1
');

if (isset($_GET['z­aznam']))
$url = $_GET['zaznam'];
else
// a tady chci aby se mi to projevilo.
$url = $existuje;

$clanek = Db::queryOne('
SELECT *
FROM zaznam
WHERE id=?
', $url);

 
Odpovědět
5.2.2018 19:39
Avatar
Odpovídá na David Adámek
Zdeněk Jurák:5.2.2018 19:43

Jeste se podivej jestli mas cely soubor v utf8, to mi kdysi delalo problem.

 
Odpovědět
5.2.2018 19:43
Avatar
Tomáš Kala
Člen
Avatar
Tomáš Kala:24.5.2018 14:37

Co je přesně myšleno tím "zkopírování archivu"?
Mohl by mi někdo prosím vysvětlit, proč se mi u "registrace" nezobrazí CSS vzhled?
odkázaný na něj mám :D

zde mám kód
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Registra­ce</title>
</head>

<body>
<article>
<div id="centrovac">
<header>
<h1>Registrace</h1>
</header>
<section>
<?php
if (isset($zprava))
echo('<p>' . $zprava . '</p>');
?>

<form method="post">
Jméno

<input type="text" name="jmeno" />

Heslo

<input type="password" name="heslo" />

Heslo znovu

<input type="password" name="heslo_znovu" />

Zadejte aktuální rok (antispam)

<input type="text" name="rok" />

<input type="submit" value="Registrovat" />
</form>
</section>
<div class="cistic"></div>
</div>
</article>
</body>
</html>
<link type="text/css" rel="stylesheet" href="styl korálky.css"/>

 
Odpovědět
24.5.2018 14:37
Avatar
Josef Čada
Člen
Avatar
Odpovídá na Tomáš Kala
Josef Čada:13.6.2018 10:43

nevim jestli to chapu spravne ale to CSS bys mel mit nalinkovany v hlavicce ... o jeho pojmenovani pomlcim ;)

Odpovědět
13.6.2018 10:43
Kdybych nebyl kokot tak se asi nudim ;-)
Avatar
Odpovídá na David Adámek
Jaroslav Patrný:21.7.2018 1:12

Ahoj, podle toho jak popisuješ problém, nemáš soubor uložený v utf-8 (při ukládání z IDE).

 
Odpovědět
21.7.2018 1:12
Avatar
Marián Lesňák:24.7.2018 10:57

Ahoj.
tento príkaz mi padne
$heslo = password_hash($_POS­T['heslo'], PASSWORD_DEFAULT);
Ak ho nezadám a do
Db::query('
INSERT INTO uzivatelia (meno, heslo)
VALUES (?, ?)
', $_POST['meno'], $_POST['heslo'] );
tak funguje a pridá mi ho do databázy, len v databáze samozrejme vidím hesla.
V čom môže byť problém?

 
Odpovědět
24.7.2018 10:57
Avatar
michal Čepelák:6.8.2018 19:56

Zdravím,
zkoušel jsem si dělat registraci podle tohoto článku a není bezpečnostní chyba když vidím při odeslání jaké jsem dal heslo víc přiložené foto. děkuji

 
Odpovědět
6.8.2018 19:56
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na michal Čepelák
David Čápka:6.8.2018 22:34

To heslo se přece musí odeslat na server, aby ho zpracoval :) Na produkci pak budeš mít HTTPS, takže se odešle zašifrované.

Odpovědět
6.8.2018 22:34
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
michal Čepelák:6.8.2018 22:50

A pokud bych https nepoužil? Dá se odeslat heslo už zahesovane? Děkuji

 
Odpovědět
6.8.2018 22:50
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na michal Čepelák
David Čápka:6.8.2018 22:52

Pokud HTTPS nepoužiješ, tak ti to prohlížeče dnes už pomalu ani nezobrazí a vyhledávače nezaindexují, takže ho použiješ. Hesla se neheslují, ale hashují nebo šifrují. Hashovat heslo na frontendu je bezpečnostní riziko, algoritmus by neměl být na straně uživatele.

Edit: Koukám, že jsi psal zahashované, překoukl jsem se :)

Editováno 6.8.2018 23:24
Odpovědět
6.8.2018 22:52
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na Zdeněk Jurák
Radek Dřímal:8.10.2018 22:22

Nebo si nastav v databázi auto inkrementaci u příslušného pole .

 
Odpovědět
8.10.2018 22:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 26 zpráv z 26.