6. díl - NERS - Editor článků v PHP

PHP Databáze pro začátečníky NERS - Editor článků v PHP American English version English version

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulém dílu našeho seriálu tutoriálů o databázích v PHP pro úplné začátečníky jsme dokončili administrační stránku jednoduchého redakčního systému. V dnešním dílu přidáme přihlašování.

Přihlašování

Vytvoříme skript prihlaseni.php. Jeho HTML část bude následující:

<!DOCTYPE html>
<html lang="cs-cz">
<head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="styl.css" type="text/css" />
        <title>Přihlášení do administrace</title>
</head>

<body>
        <article>
                <div id="centrovac">
                        <header>
                                <h1>Přihlášení do administrace</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 />
                                        <input type="submit" value="Přihlásit" />
                                </form>

                                <p>Pokud ještě nemáte účet, <a href="registrace.php">zaregistrujte se</a>.</p>
                        </section>
                        <div class="cistic"></div>
                </div>
        </article>
</body>
</html>

Vidíme PHP direktivu pro výpis chybové zprávy (pokud existuje) a formulář se jménem a heslem. Kód je téměř totožný s tím u registračního formuláře a měl by být tedy srozumitelný.

Nad HTML vložíme následující PHP blok:

<?php
session_start();
require('Db.php');
Db::connect('127.0.0.1', 'ners_db', 'root', '');

if (isset($_SESSION['uzivatel_id']))
{
        header('Location: administrace.php');
        exit();
}

if ($_POST)
{
        $uzivatel = Db::queryOne('
                SELECT uzivatele_id, admin
                FROM uzivatele
                WHERE jmeno=? AND heslo=SHA1(?)
        ', $_POST['jmeno'], $_POST['heslo'] . "t&#ssdf54gh");
        if (!$uzivatel)
                $zprava = 'Neplatné uživatelské jméno nebo heslo';
        else
        {
                $_SESSION['uzivatel_id'] = $uzivatel['uzivatele_id'];
                $_SESSION['uzivatel_jmeno'] = $_POST['jmeno'];
                $_SESSION['uzivatel_admin'] = $uzivatel['admin'];
                header('Location: administrace.php');
                exit();
        }
}
?>

První řádky nám zpřístupní session a připojí se k databázi. Pokud je uživatel přihlášený, tak mu přihlašovací stránku zobrazovat nebudeme a přesměrujeme ho rovnou na administraci a skript zastavíme.

Pokud byl odeslán formulář, osolíme zadané heslo stejnou solí, jako při registraci a uděláme z něj opět stejný otisk pomocí SQL funkce SHA1(). Uživatele se zadaným jménem a otiskem se následně pokusíme najít. Pokud ho nenajdeme, uložíme chybovou hlášku. V případě úspěchu uložíme načtené informace o uživateli do session a tím ho přihlásíme. Dále ho přesměrujeme na administraci.

Můžete se zkusit přihlásit. Pokud jste ještě přihlášení z registrace, tak se odhlaste a přihlaste znovu.

Přihlašování uživatelů v PHP

Přidělení role administrátora

V našem systému máme u každého uživatele sloupec admin. Ten bude nabývat hodnoty 0 nebo 1 podle toho, zda je uživatel administrátor. Tuto hodnotu může nastavit nově registrovanému uživateli pouze administrátor webu pomocí phpMyAdmin. Přesuneme se tedy do phpMyAdmin a přepneme hodnotu admin u našeho účtu na 1 (na políčko stačí jen poklikat a hodnotu přepsat).

Administrátorská práva v phpMyAdmin

Nyní se odhlaste a přihlaste.

Editor článků

Přejděme k editoru článků. Vytvořme soubor editor.php a vložme do něj HTML blok:

<!DOCTYPE html>
<html lang="cs-cz">
<head>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="styl.css" type="text/css" />
        <title>Editor článků</title>
</head>

<body>
        <article>
                <div id="centrovac">
                        <header>
                                <h1>Editor článků</h1>
                        </header>
                        <section>
                                <?php
                                if (isset($zprava))
                                        echo('<p>' . $zprava . '</p>');
                                ?>

                                <form method="post">
                                        <input type="hidden" name="clanky_id" value="<?= htmlspecialchars($clanek['clanky_id']) ?>" /><br />
                                        Titulek<br />
                                        <input type="text" name="titulek" value="<?= htmlspecialchars($clanek['titulek']) ?>" /><br />
                                        URL<br />
                                        <input type="text" name="url" value="<?= htmlspecialchars($clanek['url']) ?>" /><br />
                                        Popisek<br />
                                        <input type="text" name="popisek" value="<?= htmlspecialchars($clanek['popisek']) ?>" /><br />
                                        Klíčová slova<br />
                                        <input type="text" name="klicova_slova" value="<?= htmlspecialchars($clanek['klicova_slova']) ?>" /><br />
                                        <textarea name="obsah"><?= htmlspecialchars($clanek['obsah']) ?></textarea>
                                        <input type="submit" value="Odeslat" />
                                </form>
                        </section>
                        <div class="cistic"></div>
                </div>
        </article>
        <script type="text/javascript" src="//tinymce.cachefly.net/4.0/tinymce.min.js"></script>
        <script type="text/javascript">
                tinymce.init({
                        selector: "textarea[name=obsah]",
                        plugins: [
                                "advlist autolink lists link image charmap print preview anchor",
                                "searchreplace visualblocks code fullscreen",
                                "insertdatetime media table contextmenu paste"
                        ],
                        toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
                        entities: "160,nbsp",
                        entity_encoding: "named",
                        entity_encoding: "raw"
                });
        </script>
</body>
</html>

Kód obsahuje opět jen jednoduchý HTML formulář a výpis chybové zprávy. Data se do formulářových polí vypisují z pole $clanek. Formulář má ještě jednu zvláštnost a tou je skryté pole s ID daného článku. Podle tohoto pole poznáme, zda vkládáme nový článek (bude prázdné) nebo zda editujeme existující (bude v něm ID tohoto článku).

Zajímavý je JavaScript na konci souboru, ve které načteme WYSIWYG editor TinyMCE. To je editor vzhledově podobný např. MS Wordu, který nám generuje HTML kód podle toho, co v něm naklikáme.

První skript je odkaz na online úložiště, ze kterého si prohlížeč TinyMCE stáhne. Druhý skript obsahuje nastavení editoru, zvolíme, že editor chceme vytvořit z textarea s názvem obsah. Další řádky nastavují pluginy a vypínají převod české diakritiky na entity, což je jinak poměrně nepříjemná záležitost.

Nad HTML kód dodejme obslužný PHP blok:

<?php
session_start();
if (empty($_SESSION['uzivatel_admin']))
        die('Nedostatecna opravneni');

require('Db.php');
Db::connect('127.0.0.1', 'ners_db', 'root', '');

$clanek = array(
        'clanky_id' => '',
        'titulek' => '',
        'obsah' => '',
        'url' => '',
        'popisek' => '',
        'klicova_slova' => '',
);
if ($_POST)
{
        if (!$_POST['clanky_id'])
        {
                Db::query('
                        INSERT INTO clanky (titulek, obsah, url, popisek, klicova_slova)
                        VALUES (?, ?, ?, ?, ?)
                ', $_POST['titulek'], $_POST['obsah'], $_POST['url'], $_POST['popisek'], $_POST['klicova_slova']);
        }
        else
        {
                Db::query('
                        UPDATE clanky
                        SET titulek=?, obsah=?, url=?, popisek=?, klicova_slova=?
                        WHERE clanky_id=?
                ', $_POST['titulek'], $_POST['obsah'], $_POST['url'], $_POST['popisek'], $_POST['klicova_slova'], $_POST['clanky_id']);
        }
        header('Location: index.php?clanek=' . $_POST['url']);
        exit();
}
else if (isset($_GET['url']))
{
        $nactenyClanek = Db::queryOne('
                SELECT *
                FROM clanky
                WHERE url=?
        ', $_GET['url']);
        if ($nactenyClanek)
                $clanek = $nactenyClanek;
        else
                $zprava = 'Článek nebyl nalezen';
}

?>

Pokud uživatel není administrátor, zastavíme celý skript s chybovou hláškou. Pro kontrolu přihlášení administrátora nám nestačí isset(), ale musíme použít empty(). V session totiž může existovat klíč 'uzivatel_admin', ale může mít hodnotu 0.

Dále se připojíme k databázi a do proměnné $clanek si připravíme pole s prázdnými hodnotami. To aby se do formuláře nic nevypsalo a zároveň nám PHP neohlásilo chybu s neexistující proměnnou.

Pokud byl odeslán formulář, podíváme se do skrytého pole. Pokud je prázdné, vložíme nový článek do databáze. Pokud je v skrytém poli nějaká hodnota, updatujeme článek s tímto ID. SQL příkaz UPDATE jsme si ještě nepředstavovali, ale je velmi jednoduchý. Pomocí SET jednoduše nastavíme pole která potřebujeme. Co je důležité je nezapomenout na klauzuli WHERE, kde určíme které řádky se mají takto updatovat. Bez ní by se updatovaly všechny články na tyto hodnoty!

Po přidání nebo editaci článku na něj přesměrujeme.

Pokud nebyl odeslaný formulář, podíváme se, zda nemáme v GET url článku. To by znamenalo, že chceme nějaký editovat a proto se do pole $clanek pokusíme nahrát data z článku s tímto URL. Data se potom předvyplní do polí formuláře. Při neúspěchu vypíšeme chybovou hlášku.

Nyní si editor spusťte a vložte si článek s URL "uvod". To bude hlavní stránka našeho webu:

Editor článků TinyMCE v PHP

Článek uložte do databáze. Příště budeme pokračovat.


 

  Aktivity (2)

Článek pro vás napsal David Čápka
Avatar
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 se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (9 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Databáze v PHP pro začátečníky
Miniatura
Následující článek
NERS - Výpis článků v PHP

 

 

Komentáře
Zobrazit starší komentáře (63)

Avatar
IT Man
Redaktor
Avatar
IT Man:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /?clanok=$1 [L]

Našel jsem to na netu, nezkoušel jsem to. Snad si poradíš, když to nepůjde.

Odpovědět 2. ledna 21:20
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Peter Schoeller:

Zdravim komunitu...
Viete mi poradit, ako rozsirit prihlasenie do administracie o pripad, ak uzivatel zabudne heslo?
Doteraz to funguje tak, ze mi on posle mail, ze zabudol heslo, ja ho vymazem z databaze a on sa potom nanovo zaregistruje a ja mu nakoniec zas pridelim admin prava. (zmena z hodnoty 0 na 1).
Jednoduchsie by to bolo pridanim stranky "reset.php", kde by dotycny vyplnil svoj email a ak by sa ten nachadzal v databaze, poslal by mu email, ze heslo bolo zresetovane a potom presmerovanie na dalsiu stranku "new_password­.php", kde by sa vygenerovalo nove heslo a dosadilo do jestvujuceho zaznamu uzivatela. Nasledne by ho to presmerovalo na uvodnu stranku, kde by sa uz prihlasil svojim loginom a novym heslom.
Na webe som nasiel tento navod navod, ale neviem si s nim poradit.
Dakujem za odpovede.

Editováno 20. ledna 21:58
 
Odpovědět 20. ledna 21:56
Avatar
Ormy
Člen
Avatar
Odpovídá na Peter Schoeller
Ormy:

Zatim jsem nic podobnyho nedelal, ale asi bych to resil tak, ze bych pro uzivatele vygeneroval nejakej klic (treba 20 nahodnejch cislic a pismen), ulozil bych ho do db ke konkretnimu uzivateli a emailem mu poslal odkaz na zmenu hesla, kde by byl v get parametru prave ten klic, pomoci nehoz bych overoval uzivatele

 
Odpovědět  +1 21. ledna 14:50
Avatar
Odpovídá na Ormy
Peter Schoeller:

No to uz je jednoduchsie ten zaznam vymazat a nech sa uzivatel registruje este raz.
Praveze ja by som chcel, nech si to uzivatel riesil sam...
Nieco ako scenar: Je email v databazi?
Nie? -> Koniec (resp. registracia)
Ano? -> odoslat na ten email odkaz, ktorym sa vymaze z databaze v riadku,kde je ten email, bunka password a umozni sa zadat nove heslo.

 
Odpovědět 21. ledna 15:43
Avatar
Ormy
Člen
Avatar
Odpovídá na Peter Schoeller
Ormy:

Jestli ti hosting umoznuje posilani emailu pres php, tak si na to muzes udelat script a bude se to delat automaticky

 
Odpovědět 21. ledna 16:53
Avatar
Odpovídá na Ormy
Peter Schoeller:

Bohuzial neumoznuje, ale uz som to vyriesil tak, ako som si to predstavoval :)
Vdaka za ochotu.

 
Odpovědět 22. ledna 1:28
Avatar
mkores.mk
Člen
Avatar
mkores.mk:

Ahoj,
mám takový problém s přihlášením do administrace - pokud kliknu na login (i když mám správně vyplněný formulář nebo ne), tak mi to vyhodí chybovou hlášku -

Warning: PDO::prepare(): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'uzivatele_id' in 'field list' in C:\xampp\htdocs\zwa - project\Db.php on line 42

Fatal error: Uncaught Error: Call to a member function execute() on boolean in C:\xampp\htdocs\zwa - project\Db.php:43 Stack trace: #0 C:\xampp\htdocs\zwa - project\Db.php(74): Db::executeSta­tement(Array) #1 C:\xampp\htdocs\zwa - project\prihla­seni.php(18): Db::queryOne('\r\n ...', 'test2', 'testt&#ssdf54gh') #2 {main} thrown in C:\xampp\htdocs\zwa - project\Db.php on line 43

Nemáte s tím někdo zkušenosti? Db.php jsem nijak neupravoval a jinak ten kód na přihlášení je v podstatě stejný jako je zde

 
Odpovědět 25. ledna 11:58
Avatar
mkores.mk
Člen
Avatar
Odpovídá na mkores.mk
mkores.mk:

Ještě tedy doplním, že databáze je taky stejná, akorát tam mám navíc sloupec email.

Pokud se registruju, tak mi to do administrace jde v pořádku jít, ale když se odhlásím a znovu se chci přihlásit, tak mi to tohle vypíše

Editováno 25. ledna 12:21
 
Odpovědět 25. ledna 12:20
Avatar
IT Man
Redaktor
Avatar
Odpovídá na mkores.mk
IT Man:

Sloupec uzivatele_id neexistuje. Buď ho nemáš v databázi nebo ho máš jinak pojmenovaný.

Odpovědět  +1 25. ledna 15:44
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
mkores.mk
Člen
Avatar
Odpovídá na IT Man
mkores.mk:

Máš pravdu, děkuju :)

 
Odpovědět  +1 25. ledna 19:23
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 10 zpráv z 73. Zobrazit vše