Do nového roku jako lepší programátoři? Znovu otevíráme večerní školu programování. Nette framework, návrhové vzory, testování nebo vůbec poprvé kurzy ASP.NET dostupné odkudkoli v republice.

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 (54)

Avatar
Enigmated
Člen
Avatar
Enigmated:

Dobrý den,

funguje tady XSS ochrana pomocí toho htmlspecialchars()? Mně přijde, že i když to htmlspecialchars tam nedám, tak stejně žadné značky ani scripty nefungují... Například, že bych chtěl uložit jako popisek textu obrázek, tak se stejně vypíše jen kód.

Jsem z toho nějaký zmatený. Díky

Editováno 29.5.2016 17:01
 
Odpovědět 29.5.2016 17:00
Avatar
pgarsky
Člen
Avatar
pgarsky:

Nešlo by místo toho UPDATE clanky SET blablabla dát SET * ?

 
Odpovědět 19.8.2016 11:43
Avatar
ur.andrej
Člen
Avatar
ur.andrej:

Čaute, pri pokuse o odoslanie článku do databázy na mňa vyskočí toto. Viete čo s tým môže byť?
Warning: PDO::prepare(): SQLSTATE[42000]: Syntax error or access violation: 1064 You
have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 in /Applications/XAM­PP/xamppfiles/htdoc­s/ners/Db.php on line 60

Fatal error: Call to a member function execute() on boolean in /Applications/XAM­PP/xamppfiles/htdoc­s/ners/Db.php on line 61

 
Odpovědět 22.11.2016 11:49
Avatar
Peter Schoeller:

Ahojte,
mam otazku ohladne vylepsenia (notifikacie emailom) tejto casti kodu:

else
        {
                $_SESSION['uzivatel_id'] = $uzivatel['uzivatele_id'];
                $_SESSION['uzivatel_jmeno'] = $_POST['jmeno'];
                $_SESSION['uzivatel_admin'] = $uzivatel['admin'];
                header('Location: administrace.php');
                exit();
        }

a sice, kde a ako treba vlozit cast kodu, aby mi pri vlozeni noveho uzivatela prisiel email.
Skusal som tuto cast vlozit aj pred "header", aj pred "exit", ale nefunguje.

        // our modified code for sending the email notification
@mail(
        /* comma-separated list of recipients */
        "xxxxx@gmail.com",

        /* message subject */
        "New order added",

        /* message contents */
        "A new record has been added".\n\n".
        "To view it, please go to:\n".
        "https://www.xxxxxxx.xxx",

        /* we must add sender email similar to this */
        "From: admin@xxxxxxx.xxx"
);
 
Odpovědět 29.12.2016 12:00
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Peter Schoeller
IT Man:

Ve funkci mail() máš ve třetím parametru uvozovky navíc. Nemělo by to být takto?

mail(
        "xxxxx@gmail.com",
        "New order added",
        "A new record has been added\n\n" .
        "To view it, please go to:\n" .
        "https://www.xxxxxxx.xxx",
        "From: admin@xxxxxxx.xxx"
);
Odpovědět  +1 29.12.2016 15:37
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Odpovídá na IT Man
Peter Schoeller:

Dakujem za opravu, bola to chyba, ale aj tak to neprechadzalo, az ked som zmenil Gmail. Neviem preco na gmail sa to neda odoslat. Po zmene vsetko funguje ako ma. :)

 
Odpovědět 29.12.2016 18:00
Avatar
michal.smatlak:

Zdravím, potrebujem poradiť. Keď vytvorím článok tak v url sú medzery nahradené znakom %20 napr: index.php?cla­nok=Samsung%20Ga­laxy%20J5%20Du­os. Ja ale chcem aby namiesto %20 bola medzera nahradená - napr: index.php?cla­nok=Samsung-Galaxy-J5-Duos. Poraďte mi prosím vás ako už pri vytváraní článku nahradím medzeru -. Za všetky rady vopred ďakujem.

 
Odpovědět 2. ledna 17:50
Avatar
IT Man
Redaktor
Avatar
Odpovídá na michal.smatlak
IT Man:
$newUrl = str_replace(' ', '-', $_POST['url']);

A pak tuto proměnnou vložíš do DB místo toho $_POST.

Odpovědět 2. ledna 18:05
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Odpovídá na IT Man
michal.smatlak:

Ďakujem, funguje to a ešte mám jednú otázku. Teraz URL adresa vyzerá takto: http://www.recension4u.com/index.php?… ale ja chcem aby vyzerala takto: http://www.recension4u.com/…axy-J5-Duos/ čiže nice URL čo znamená že tam už nebude index.php?clanok= ale rovno len titulok článku. Viem že časť z toho sa robí cez .htaccess a tak som použil toto:

RewriteCond %{REQUEST_URI} !\.[[:alnum:]]+$
RewriteRule ^(.+[^/])$ http://www.recension4u.com/$1/ [R=301]

ale keď načítam článok tak stále sa zobrazuje tá url ktorú nechcem a keď z nej dám preč index.php?clanok= a dám ju načítať tak mi namiesto článku vyhodí Error 404. Chcem sa teda spýtať čo ešte treba urobiť v php aby to fungovalo. Za všetky rady vopred ďakujem.

 
Odpovědět 2. ledna 20:32
Avatar
IT Man
Redaktor
Avatar
Odpovídá na michal.smatlak
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!
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 64. Zobrazit vše