Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

Unicorn College ONEbit hosting 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.


 

 

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

 

 

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

Avatar
mkores.mk
Člen
Avatar
mkores.mk:25. ledna 11:58

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:25. ledna 12:20

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:25. ledna 15:44

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

Odpovědět  +2 25. ledna 15:44
Cokoliv a kdokoliv může jednou uspět.
Avatar
mkores.mk
Člen
Avatar
Odpovídá na IT Man
mkores.mk:25. ledna 19:23

Máš pravdu, děkuju :)

 
Odpovědět  +1 25. ledna 19:23
Avatar
marasol
Člen
Avatar
marasol:2. března 21:19

Ahoj :-) potřeboval bych poradit, články se mi neukazují v databázi. Mohl by mi někdo pomoci? Pošlu co mám. Díky

 
Odpovědět 2. března 21:19
Avatar
Odpovídá na marasol
Michal Pácal [Mysak0CZ]:4. března 13:25

Ahoj, hází ti to nějakou chybu,nebo všechno proběhne v pořádku ale článek se neuloží?

 
Odpovědět 4. března 13:25
Avatar
marasol
Člen
Avatar
Odpovídá na Michal Pácal [Mysak0CZ]
marasol:4. března 13:29

Všechno proběhne v pořádku, ale do databáze se nic neuloží. Názvy v databázi souhlasí s tím co mám ve scriptu. Nejsem tak zkušený, tak nevím, kde jinde bych měl hledat chybu.

 
Odpovědět 4. března 13:29
Avatar
Peter Schoeller:4. března 15:20

Ahojte, mam otazku ohladne kontroly duplicity emailu pri registracii, ak sa nachadza vo dvoch stlpcoch.
Ide o tuto cast kodu:

$existuje_mail = Db::querySingle('
                        SELECT COUNT(*)
                        FROM members
                        WHERE email=?
                        LIMIT 1
                ', $_POST['email']); // nastavenie duplicity emailu

Skusal som to modifikovat tymto, ale nefunguje to.

$existuje_mail = Db::querySingle('
                        SELECT COUNT(*)
                        FROM members
                        WHERE email=? OR email_2=?
                        LIMIT 1
                ', $_POST['email']); // nastavenie duplicity emailu

Mam obsadene obe polia (email aj email2), ale len pri prvom mi hlasi, ze email sa uz pouziva. Pri druhom prebehne riadne registracia, co je neziaduce.
Viete mi poradit ako to vyriesit?
Dakujem

 
Odpovědět 4. března 15:20
Avatar
Peter Schoeller:4. března 15:32

Ospravedlnujem sa, ale hned ako som odoslal otazku, som nasiel riesenie :)

$existuje_mail = Db::querySingle('
                        SELECT COUNT(*)
                        FROM members
                        WHERE (?) IN (email, email_2)
                        LIMIT 1
                ', $_POST['email']); // nastavenie duplicity emailu
 
Odpovědět 4. března 15:32
Avatar
Odpovídá na Peter Schoeller
Michal Pácal [Mysak0CZ]:4. března 21:19

2 otazníky => 2 hodnoty ;-)

$existuje_mail = Db::querySingle('
                        SELECT COUNT(*)
                        FROM members
                        WHERE email=? OR email_2=?
                        LIMIT 1
                ', $_POST['email'], $_POST['emai]); // nastavenie duplicity emailu
 
Odpovědět 4. března 21:19
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 79. Zobrazit vše