7. díl - NERS - Výpis článků v PHP

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

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 editor článků jednoduchého redakčního systému a vytvořili úvodní stránku. V dnešním dílu vytvoříme indexovou stránku, která bude články zobrazovat.

Chybová stránka

Pomocí editoru článků si vytvořte článek s URL chyba a uložte ho do databáze. Tento článek se zobrazí v případě, když se uživatel pokusí zobrazit článek, která neexistuje.

Článek pro chybu 404 v PHP

Výpis článku

Pro výpis jednotlivých článků vytvoříme soubor index.php, do kterého vložíme následující HTML blok:

<!DOCTYPE html>
<html lang="cs-cz">

        <head>
                <meta charset="utf-8" />
                <meta name="description" content="<?= htmlspecialchars($clanek['popisek']) ?>" />
                <meta name="keywords" content="<?= htmlspecialchars($clanek['klicova_slova']) ?>" />
                <link rel="shortcut icon" href="obrazky/ikona.ico" />
                <link rel="stylesheet" href="styl.css" type="text/css" />
                <title><?= htmlspecialchars($clanek['titulek']) ?></title>
        </head>

        <body>
                <header>
                        <div id="logo"><h1>HoBi</h1></div>
                        <nav>
                                <ul>
                                        <li><a href="index.php?clanek=uvod">Domů</a></li>
                                        <li><a href="clanky.php">Články</a></li>
                                        <li><a href="index.php?clanek=kontakt">Kontakt</a></li>
                                </ul>
                        </nav>
                </header>

                <article>
                        <div id="centrovac">
                                <header>
                                        <h1><?= htmlspecialchars($clanek['titulek']) ?></h1>
                                </header>

                                <section>
                                        <?= $clanek['obsah'] ?>
                                </section>
                                <div class="cistic"></div>
                        </div>
                </article>

                <footer>
                        Vytvořil &copy;HoBi 2013 pro <a href="http://devbook.cz">DEVBOOK.CZ</a>
                        <a href="administrace.php">Administrace</a>
                </footer>
        </body>
</html>

V kódu opět používáme proměnnou $clanek. Tentokrát z ní vypisujeme data do HTML hlavičky a obsah článku do těla stránky.

Jako vždy stránku doplníme ještě obslužným PHP blokem, který vložíme nad HTML blok:

<?php

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

if (isset($_GET['clanek']))
        $url = $_GET['clanek'];
else
        $url = 'uvod';

$clanek = Db::queryOne('
        SELECT *
        FROM clanky
        WHERE url=?
', $url);
if (!$clanek)
{
        if ($url != 'chyba')
        {
                header('Location: index.php?clanek=chyba');
                exit();
        }
        else
                die('Nebyl nalezen chybovy clanek');
}

?>

Kód je extrémně jednoduchý. Po připojení k databázi se podíváme do GETu, zda máme v adrese zadané url článku. Pokud ano, nastavíme proměnnou $url na tuto hodnotu. Pokud ne, nastavíme ji na úvodní stránku.

Podle URL se pokusíme načíst daný článek z databáze do proměnné $clanek. Pokud se to nepovedlo, přesměrujeme na článek s url chyba. Pokud nastala chyba na článku chyba (i to se může stát :) ), ukončíme běh aplikace s chybovou hláškou.

To je vše. Přejděme na index.php:

Zobrazení článku z databáze v PHP

Vidíme, že se článek načetl z databáze a vypadá stejně, jako jsme ho napsali v editoru.

Výpis seznamu článků

Kromě jednoho článku by měl náš systém umět vypsat i seznam všech článků v databázi, seřazených od nejnovějších po nejstarší. Pokud je přihlášený administrátor, měl by mít možnost články v seznamu editovat a mazat.

Vytvoříme soubor clanky.php s následujícím HTML blokem:

<!DOCTYPE html>
<html lang="cs-cz">

<head>
        <meta charset="utf-8" />
        <link rel="shortcut icon" href="obrazky/ikona.ico" />
        <link rel="stylesheet" href="styl.css" type="text/css" />
        <title>Seznam článků</title>
</head>

<body>
        <header>
                <div id="logo"><h1>HoBi</h1></div>
                <nav>
                        <ul>
                                <li><a href="index.php?clanek=uvod">Domů</a></li>
                                <li><a href="clanky.php">Články</a></li>
                                <li><a href="index.php?clanek=kontakt">Kontakt</a></li>
                        </ul>
                </nav>
        </header>

        <article>
                <div id="centrovac">
                        <header>
                                <h1>Seznam článků</h1>
                        </header>

                        <section>
                                <table>
                                <?php
                                        foreach ($clanky as $clanek)
                                        {
                                                echo('<tr><td><h2>
                                                                <a href="index.php?clanek=' . htmlspecialchars($clanek['url']) . '">
                                                                ' . htmlspecialchars($clanek['titulek']) . '</a>
                                                        </h2>' . htmlspecialchars($clanek['popisek']));
                                                        if (!empty($_SESSION['uzivatel_admin']))
                                                                echo(' <a href="editor.php?url=' . htmlspecialchars($clanek['url']) . '">Editovat</a>
                                                                           <a href="clanky.php?odstranit=' . htmlspecialchars($clanek['clanky_id']) . '">Odstranit</a>
                                                                ');
                                                echo('</td></tr>');
                                        }
                                ?>
                                </table>
                        </section>
                        <div class="cistic"></div>
                </div>
        </article>

        <footer>
                Vytvořil &copy;HoBi 2013 pro <a href="http://devbook.cz">DEVBOOK.CZ</a>
                <a href="administrace.php">Administrace</a>
        </footer>
        </body>
</html>

Pracujeme zde s proměnnou $clanky, ve které jsou uložené jednotlivé články z databáze. Ty vypíšeme pod sebe do tabulky a pokud je přihlášený administrátor, přidáme k nim i odkazy na vymazání a editaci. Editaci samozřejmě zajišťuje skript editor.php, vymazání provede skript clanky.php.

Nad HTML dodejme náš poslední PHP blok:

<?php
session_start();

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

if (isset($_GET['odstranit']) && !empty($_SESSION['uzivatel_admin']))
{
        Db::query('
                DELETE FROM clanky
                WHERE clanky_id=?
        ', $_GET['odstranit']);
        header('Location: clanky.php');
        exit();
}

$clanky = Db::queryAll('
        SELECT *
        FROM clanky
        ORDER BY clanky_id DESC
');

?>

Pokud je v GET parametr "odstranit" a je přihlášený administrátor, vymažeme článek s ID, které nám přišlo v GETu. Do proměnné $clanky načteme všechny články pomocí jednoduchého SQL dotazu.

Máme hotovo.

Seznam článků z databáze v PHP

Nyní můžete psát libovolné množství článků na svůj blog, web firmy, zápisník, zkrátka k čemu budete svůj systém používat :)

Ještě jednou zopakuji, že účelem tohoto seriálu bylo zejména prolomit ledy a umožnit vyzkoušet práci s databází úplně všem. Určitě se podívejte do sekce Objektově orientované programování v PHP, kde je krok za krokem vysvětleno jak se tvoří moderní informační systémy. Kompletní kód systému NERS je v příloze ke stažení.


 

Stáhnout

Staženo 1356x (1.1 MB)

 

  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 (21 hlasů) :
4.904764.904764.904764.904764.90476


 


Miniatura
Předchozí článek
NERS - Editor článků v PHP
Miniatura
Všechny články v sekci
Databáze v PHP pro začátečníky
Miniatura
Následující článek
Začínáme s databázemi

 

 

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

Avatar
Jan Bezdíček
Redaktor
Avatar
Jan Bezdíček:

V tom SQL dotazu mas

pridany_zaznam_id='id'

Zkus cely SQL dotaz nahradit za toto:

"DELETE FROM pridavanie WHERE pridany_zaznam_id=?"

a dotaz zavolej takto:

Db::query($sql, $id)
 
Odpovědět 25. listopadu 15:43
Avatar
Odpovídá na Jan Bezdíček
Peter Rumanovský:

Dakujem velmi pomohlo :) nerozumiem presne preco ale idem nastudovat preco to tak spravilo :-)

 
Odpovědět 25. listopadu 15:48
Avatar
Odpovídá na Jan Bezdíček
Peter Rumanovský:

Este taka hlupa otazka ako mam zakomponovat respektive aky prikaz je potrebne pouzit aby po zmazani daneho riadku v tabulke presunulo cely riadok do druhej tabulky (archivacia)

 
Odpovědět 25. listopadu 15:54
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Peter Rumanovský
Jan Bezdíček:

Zadny prikaz na "presun" neexistuje, takze vidim 2 reseni. Pridat do tabulky sloupec archivovano, ktery bude mit hodnoty 0 nebo 1, asi chapes co to znamena. NEBO jak chces ty, vytvorit novou tabulku a jednoduse ... nejdrive vezmes vsechny data z toho radku, ktery chces smazat (SELECT) a vlozis je do te nove tabulky (INSERT) a teprve pak smazes ten radek z puvodni tabulky (DELETE).

Osobne bych to resil tim prvnim zpusobem, kde bude archivovano 0 nebo 1.

Dejme tomu, ze jde o clanky ... vypisujes clanky, kde je pouze archivovano = 0. A kdyz nekdo chce videt archivovane clanky, zavolas ten samy dotaz jen s archivovano = 1. Je to dle me jednodussi nez hrabat do jinych tabulek.

 
Odpovědět 25. listopadu 15:59
Avatar
Peter Rumanovský:

Aha. A ako zadefinujem INSERT inej tabulky ze sa rovna vymazanemu zaznamu z inej tabulky? SELECT uz mam

 
Odpovědět 25. listopadu 16:52
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Peter Rumanovský
Jan Bezdíček:

Pokud maji obe tabulky stejnou strukturu tak:

INSERT INTO `table2` SELECT * FROM `table1` WHERE pridany_zaznam_id=NEJAKE_ID
 
Odpovědět 25. listopadu 19:55
Avatar
Odpovídá na Jan Bezdíček
Peter Rumanovský:

Dakujem musel som pouzit podmienku switch inak mi to nechcelo brat a ked chcem vypisat hlasku o uspesnej archivacii cez nacitanie require do indexu mi pise chybu avsak to ma az tak netrapi momentalne.

Este by som sa chcel spytat po preneseni z jednej tabulky do druhej je nezmeneny aj datum aj cas. Potreboval by som aby datum a cas pise taky aky bol ked sa kliklo na "archivovat" da sa to nejako lahko rozspisat aby nemusim riesit vypisovanie zvlast tabulky na cely obsah okrem datumu a casu a zvlast vypisovat datum ? Lebo mam pocit ze takyto sposob zbytocne zahlti "aplikaciu"

 
Odpovědět 26. listopadu 18:44
Avatar
Jan Bezdíček
Redaktor
Avatar
Odpovídá na Peter Rumanovský
Jan Bezdíček:

Precti si neco o "MySQL Trigger" ... je to "akce", kterou muzes nastavit tak, at se provede po kazdem pridani noveho zaznamu do tabulky toho archivu. Tzn. kdyz pridas novy zaznam, v triggeru ho hned vezmes a upravis jeho hodnoty v datu a casu.

 
Odpovědět 26. listopadu 18:47
Avatar
Peter Rumanovský:

Super dakujem :-)

 
Odpovědět 26. listopadu 18:48
Avatar
Peter Rumanovský:

Ahojte. Ako spravim aby mi hodnotu v tabulke (autor_id) menilo podla SESSION (prihlaseneho uzivatela) ked prihlaseneho uzivatela taha z jednej tabulky a zmenu hodnoty potrebujem spravit v inej tabulke (rovnaka databaza). Skusal som to naslednovne, kde vsetky case funguju okrem daneho problemu.

...

<?php

require_once('mysql.php');
require_once('Db.php');

switch( isset($_GET['id']) )

{
case 1:
$id = $_GET['id'];
$sql= "INSERT INTO archiv SELECT * FROM pridavanie WHERE pridany_zaznam_id=?";
$res= Db::query($sql, $id) or die("<meta http-equiv='refresh' content='0;url=aktivne.php'>".mysql_error());


case 2:
$ids = $_GET['id'];
$sqls= "UPDATE archiv SET datum_ukoncenia = NOW() WHERE pridany_zaznam_id=?";
$resq= Db::query($sqls, $ids) or die("<meta http-equiv='refresh' content='0;url=aktivne.php'>".mysql_error());

case 3:
$idsd = $_GET['id'];
$sqlsd= "UPDATE archiv SET autor_id = $_SESSION['ucko'] WHERE pridany_zaznam_id=?";
$resq= Db::query($sqlsd, $idsd) or die("<meta http-equiv='refresh' content='0;url=aktivne.php'>".mysql_error());

case 4:
$idd = $_GET['id'];
$sqll= "DELETE FROM pridavanie WHERE pridany_zaznam_id=?";
$ress= Db::query($sqll, $idd) or die("<meta http-equiv='refresh' content='0;url=aktivne.php'>".mysql_error());
echo "<meta http-equiv='refresh' content='0;url=aktivne.php'>";


}
?>
...

Samozrejme SESSION funguje mazanie atd podla id tak isto

 
Odpovědět 5. prosince 16:38
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 84. Zobrazit vše