ELEKTRO
CHEMIE
PROGRAMOVÁNÍ
FOTKY
BLOG
E-SHOP

Elektro

  • Novinky
  • Aktuality
  • PHP
  • MySQL
  • JavaScript
  • .NET
  • Download
  • Odkazy
  • Anketa
  • Návštěvní kniha
  • Mapa webu
  • O webu
  • RSS

  • © by Hugo moravec.zd@gmail.com

    Výběr náhodného citátu z databáze

    Administrace ---- Seznam použitých funkcí

    Tento skript umožňuje vybrat náhodnou položku z databáze a zobrazit ji. Dále umí do databáze přidávat další položky nebo je mazat. Pro zprovoznění je nutné mít přístup na server, kde běží MySQL a PHP. Protože se jedná o relativně rozsáhlý projekt (alespoň vzhledem k předchozím skriptíkům), je rozvržen do několika (9) souborů.


    Nejprve musíme v databázi vytvořit dvě tabulky. První tabulka se jmenuje citat a obsahuje tři sloupce. K jejímu vytvoření můžeme použít následující SQL příkaz.

    CREATE TABLE citat (
      ID int(4) NOT NULL auto_increment,
      Autor varchar(30) NOT NULL default '',
      Citat varchar(255) NOT NULL default '',
      PRIMARY KEY (ID)
    );

    Tento příkaz můžete buď zadat ručně v řádkovém klientu MySQL (obr) nebo použit aplikaci typu phpMyAdmin (obr). První sloupec tabulky je primární klíč, který musí být pro každou položku jedinečný. Druhý sloupec obsahuje jméno autora a ve třetím sloupci je uložen citát.

    Pro výběr náhodné položky použijeme následující dotaz:

    SELECT Autor, Citat FROM citat ORDER BY Rand() LIMIT 1;

    Tento dotaz řekne databázi, že chceme získat jeden řádek (LIMIT 1), který obsahuje hodnoty sloupců Autor a Citat (SELECT Autor, Citat) tabulky citat (FROM citat). Pokud bychom použili jen toto zadání, tak bychom vždy získali pouze první řádek tabulky, proto je v dotazu ještě navíc formulace ORDER BY Rand(), která zajistí výběr náhodného řádku. Zpracování výsledků tohoto dotazu je již záležitostí PHP. Skript, který je vypsaný dole (soubor index.php) se nejdříve připojí k databázi, pomocí výše uvedeného dotazu získá citát a jméno autora a to pak vypíše pomocí funkce print.

    <?php
    //HTTP HLAVICKY
    Header ('Pragma: no-cache');
    Header ('Cache-Control: no-cache, must-revalidate');
    Header ('Expires: Mon, 20 Sep 2004 10:12:23 GMT');
    Header ('Last-Modified: ' GMDate('D, d M Y H:i:s') . ' GMT');
    //KODOVANI
    Header ('Content-type: text/html; charset=UTF-8');

    //PRIPOJENI K DATABAZI
    $connect MySQL_PConnect ('localhost','test','test');
    if (!
    $connect)
    {
      print 
    'Database error!';
      exit;
    }
    MySQL_Select_DB ('test');
    //VYBER NAHODNEHO CITATU
    $SelectQuery MySQL_Query ("SELECT Autor, Citat FROM citat ORDER BY Rand() LIMIT 1");
    //NACTENI CITATU A AUTORA DO POLE $data
    $data MySQL_Fetch_Array ($SelectQuery);
    ?>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">

    <html>
    <head><title>Citát</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <meta http-equiv="language" content="czech">
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    </head>
    <body>
    <h1>Citát</h1>
    <p class="citat"><?php print $data['Citat']; ?></p>
    <p>Autor: <span class="autor"><?php print $data['Autor']; ?></span></p>
    </body>
    </html>

    Na začátku skriptu jsou uvedeny HTTP hlavičky, které zakážou ukládání stránky v cachy, následuje deklarace kódování. Pro práci s MySQL není kódování windows-1250 vhodné, proto použijeme UTF-8. Pro editaci souborů psaných v UTF-8 již nelze použít notepad a je nutné si opatřit nějaký lepší textový editor. Já již několik měsíců používám PSPad, jsem s ním velmi spokojen a můžu ho vřele doporučit. Dalším krokem je připojení k databázi. K tomu slouží funkce MySQL_PConnect. Pokud bylo úspěšně navázáno spojení s databázovým serverem, tak funkcí MySQL_Select_DB zvolíme databázi, kterou budeme používat (v našem případě jde o databázi test).

    Teď musíme databázi odeslat dotaz, to provedeme pomocí funkce MySQL_Query, která vrací referenci na výsledek dotazu. Pomocí funkce MySQL_Fetch_Array načteme získané údaje do asociativního pole $data. A nakonec vygenerujeme HTML dokument, do kterého vložíme vybraný citát pomocí funkce print. (Obr. výstupu)

    V tuto chvíli máme skript, který umí načítat položky z databáze, ale ještě nemáme nástroj na její naplnění. Můžeme samozřejmě použít přímo klienta MySQL nebo phpMyAdmin, ale to není pro tyto účely moc pohodlné. Proto vytvoříme jednoduchou administraci, která umožní vkládání a mazání položek v databázi.


    Vkládání položek do databáze

    Nyní máme hotový skript, který dokáže vybrat citát z databáze. Ale ještě musíme nějak dostat citáty do databáze. Můžeme samozřejmě použít MySQL klienta nebo phpMyAdmin, ale to není příliš pohodlné. Proto si vytvoříme jednoduchou administraci, která bude umět vkládat a mazat citáty.

    Přístup do administrace by neměl mít každý, proto se před vstupem budem muset zalogovat. Autorizaci provedeme pomocí session. Nejdřív ale musíme vytvořit v databázi tabulku user, ve které budou uloženy údaje o administrátorech. Heslo budeme šifrovat pomocí asymetrické šifry MD5. Pro její vytvoření použijeme následující SQL příkaz:

    CREATE TABLE user (
      ID int(2) NOT NULL auto_increment,
      Name varchar(20) NOT NULL default '',
      Passwd varchar(32) NOT NULL default '',
      PRIMARY KEY (ID)
    );

    Před prvním vstupem do administrace musíme do tabulky vložit minimálně jednoho uživatele:

    INSERT INTO user VALUES (
      '', 'administrator', MD5( 'heslo' )
    );

    Teď už můžeme připravit vstupní stránku (soubor vstup-admin.html), v níž bude jednoduchý formulář, který umožní odeslat skriptu login a heslo (náhled).

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">

    <html>
    <head><title>Vstup do administrace</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <meta http-equiv="language" content="czech">
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    </head>

    <body>
    <h1>Vstup do administrace</h1>
    <form name="vstup" action="login.php" method="post">
    <table border="0">
    <tr><td><label for="login">Login:</label></td><td><input type="text" id="login" name="login" size="20" class="vstup"></td></tr>
    <tr><td><label for="passwd">Heslo:</label></td><td><input type="password" id="passwd" name="passwd" size="20" class="vstup"></td></tr>
    <tr><td colspan="2"><input type="submit" name="submit" value="Odeslat"></td></tr>
    </table>
    </form>
    </body>
    </html>

    Po odeslání formuláře se předají zadané parametry skriptu login.php. Ten se nejprve připojí k databázi a poté se pokusí najít v tabulce řádek s odpovídajícím login. V případě úspěchu zkontroluje heslo a pokud souhlasí tak se spustí session, zaregistrují se příslušné proměnné (login a heslo) a dojde k přesměrování do administrace.

    <?php
    //HTTP HLAVICKY
    Header ('Pragma: no-cache');
    Header ('Cache-Control: no-cache, must-revalidate');
    Header ('Expires: Mon, 20 Sep 2004 10:12:23 GMT');
    Header ('Last-Modified: ' GMDate('D, d M Y H:i:s') . ' GMT');
    //KODOVANI
    Header ('Content-type: text/html; charset=UTF-8');

    //PRIPOJENI K DATABAZI
    $connect MySQL_PConnect ('localhost','test','test');
    if (!
    $connect)
    {
      print 
    'Nepovedlo se připojení k databázi!';
      exit;
    }
    MySQL_Select_DB ('test');
    //AUTORIZACE UZIVATELE
    $UserQuery MySQL_Query ("SELECT Name, Passwd FROM user WHERE Name = '".$_POST['login']."' LIMIT 1");
    if (
    MySQL_Num_Rows ($UserQuery) == 1)
    {
      
    $Auth MySQL_Fetch_Array ($UserQuery);
      if (
    $Auth['Passwd'] != MD5($_POST['passwd']))
      {
        print 
    'Špatné heslo';
        exit;
      }
    }

    else
    {
      
    Header ('Location: vstup-admin.html');
      exit;
    }

    //START SESSION
    Session_Start();
    //REGISTRACE PROMENNYCH SESSION
    $_SESSION['login'] = $_POST['login'];
    $_SESSION['passwd'] = $Auth['Passwd'];
    Header ('Location: admin.php');
    exit;
    ?>

    Protože budeme potřebovat více skriptů, kde bude nutné provést autorizaci a připojení k MySQL, vytvoříme nejprve soubor config.php, který tyto záležitosti obstará.

    <?php
    //HTTP HLAVICKY
    Header ('Pragma: no-cache');
    Header ('Cache-Control: no-cache, must-revalidate');
    Header ('Expires: Mon, 20 Sep 2004 10:12:23 GMT');
    Header ('Last-Modified: ' GMDate('D, d M Y H:i:s') . ' GMT');
    //KODOVANI
    Header ('Content-type: text/html; charset=UTF-8');

    //START SESSION
    Session_Start();

    if (!IsSet (
    $_SESSION['login']))
    {
      
    Header ('Location: vstup-admin.html');
      exit;
    }

    //PRIPOJENI K DATABAZI
    $connect MySQL_PConnect ('localhost','test','test');
    if (!
    $connect)
    {
      print 
    'Nepovedlo se připojení k databázi!<br>';
      print 
    MySQL_Error();
      exit;
    }
    MySQL_Select_DB ('test');
    //AUTORIZACE UZIVATELE
    $UserQuery MySQL_Query ("SELECT Name, Passwd FROM user WHERE Name = '".$_SESSION['login']."' LIMIT 1");
    if (
    MySQL_Num_Rows ($UserQuery) == 1)
    {
      
    $Auth MySQL_Fetch_Array ($UserQuery);
      if (
    $Auth['Passwd'] != $_SESSION['passwd'])
      {
        print 
    'Špatné heslo';
        exit;
      }
    }

    else
    {
      
    Header ('Location: vstup-admin.html');
      exit;
    }
    ?>

    Nejdříve jsou odeslány HTTP hlavičky. Potom pomocí funkce Session_Start() spustime novou session. Aby session běžely je nutné mít v prohlížeči povolené cookies, protože do nich se ukládá identifikátor nově otevřené session. V dalším kroku zkontrolujeme, jestli se uživatel korektně přihlásil, pokud ano je v proměnné $_SESSION['login'] uložen řetězec o nenulové délce. Pokud tomu tak není je uživatel přesměrován na vstupní stránku. Je-li vše v pořádku, připojíme se k databázi a zkontrolujeme jestli heslo odpovídá loginu.

    Po úspěšném nalogování se dostaneme na stránku (admin.php), která umožňuje vložit nový citát, přip. smazat staré (náhled).

    <?php
    require_once ('config.php');
    //NACTENI VSECH CITATU Z DATABAZE
    $SelectQuery MySQL_Query ("SELECT * FROM citat ORDER BY ID DESC");
    while (
    $data MySQL_Fetch_Array ($SelectQuery))
    {
      static 
    $i=0;
      
    $ID[$i] = $data['ID'];
      
    $Autor[$i] = $data['Autor'];
      
    $Citat[$i] = $data['Citat'];
      
    $i++;
    }
    ?>

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">

    <html>
    <head><title>Citát</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <meta http-equiv="language" content="czech">
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
    </head>

    <body>
    <h1>Vkládání citátů do databáze</h1>
    <p><a href="logout.php">Odhlásit</a></p>
    <strong>Počet citátů v databázi: <?php print Count($Citat); ?></strong>
    <h2>Vložení nového citátu</h2>
    <div id="insert">
    <form name="form_insert" action="insert.php" method="post">
    <fieldset>
    <legend>Vložení citátu</legend>
    <table border="0">
    <tr><td><label for="autor">Autor:</label></td><td><input type="text" name="autor" id="autor" size="20"></td></tr>
    <tr><td><label for="citat">Citát:</label></td><td><input type="text" name="citat" id="citat" size="100"></td></tr>
    </table>
    </fieldset>
    <input type="submit" value="Odeslat">
    </form>
    </div>
    <?php
    if (Count ($Autor) > 0)
    {
    ?>
    <h2>Smazání citátů</h2>
    <form name="delete" action="delete.php" method="post">
    <table border="0" cellpadding="2" cellspacing="2">
    <tr><th>Smazat</th><th>Autor</th><th>Citát</th></tr>
    <?php
      
    foreach ($Autor AS $k => $v)
      {
    ?>
    <tr onmouseover="this.style.background='#dddddd'" onmouseout="this.style.background='white'">
    <td><input type="checkbox" name="del[]" value="<?php print $ID[$k]; ?>" id="del<?php print $ID[$k]; ?>"></td><td><?php print $v?></td>
    <td><?php print $Citat[$k]; ?></td></tr>
    <?php
      
    }
    ?>

    <tr><td colspan="3">
    <input type="submit" value="Odeslat">
    </td></tr>
    </table>
    </form>
    <?php
    }
    ?>
    </body>
    </html>

    Kód je velmi jednoduchý, nejprve načteme z tabulky všechny řádky a poté je uložíme do polí. Dál následuje HTML kód, ve kterém jsou dva formuláře. První pro vložení citátu a druhý pro vymazání citátů z databáze.

    Dalším krokem bude vytvoření skriptu na přidávání citátů do databáze.

    <?php
    require_once ('config.php');

    if (
    $_POST['autor'] == '' || $_POST['citat'] == '')
    {
      print 
    'Nejsou zadány všechny údaje';
      exit;
    }

    $InsAutor MySQL_Real_Escape_String ($_POST['autor']);
    $InsCitat MySQL_Real_Escape_String ($_POST['citat']);

    $InsertQuery MySQL_Query ("INSERT INTO citat VALUES ('', '".$InsAutor."', '".$InsCitat."')");
    if (!
    $InsertQuery)
    {
      print 
    'Chyba';
      exit;
    }

    Header ('Location: admin.php');
    exit;
    ?>

    Nejdříve zkontrolujeme jestli jsou zadány oba údaje. Pokud ano, tak vstupy ošetříme funkcí MySQL_Real_Escape_String, která před nebezpečné znaky vloží zpětné lomítko. Pak data zapíšeme do tabulky a pokud neojde k chybě, tak se skript přesměruje zpět na administrátorské rozhraní.

    Další části skriptu je mazání citátů. Ve formuláři je každý citát charakterizován pomocí jeho identifikační čísla (ID). Takže stačí pouze toto ID předat databázi v příkazu DELETE.

    <?php
    require_once ('config.php');

    if (
    Count ($_POST['del']) == 0)
    {
      print 
    'Musíte zvolit alespoň jeden citát!';
      exit;
    }

    foreach (
    $_POST['del'] AS $v)
    {
      if (!
    Is_Numeric ($v))
      {
        print 
    'Špatně zadané údaje';
        exit;
      }
      
    $DelQuery MySQL_Query ("DELETE FROM citat WHERE ID = ".$v." LIMIT 1");
      if (!
    $DelQuery)
      {
        print 
    'Chyba';
        exit;
      }
    }
    Header ('Location: admin.php');
    exit;
    ?>

    Na začátku musíme samozřejmě zkontrolovat vstupy, aby se předešlo problémům s databázi. Protože jediný předávaný údaj je ID, stačí použít funkci Is_Numeric(). Další bezpečnostní opatření je použití klauzule LIMIT 1 v databázovém dotazu. To nám zaručí, že nemůže dojít ke smazání více než jednoho řádku pro každé ID. V tomto případě by sice dotaz parvděpodobně fungoval dobře i bez tohoto omezení, ale z preventivních důvodů je dobré ho tam ponechat.

    V tuto chvíli už je administrace hotová, zbývá už jen odlogování uživatele. O to se stará skript logout.php.

    <?php
    require_once ('config.php');

    //ZRUSENI SESSION
    session_unset();

    Header ('Location: vstup-admin.html');
    ?>

    Jak je vidět, skript je velmi jednoduchý. Pouze nastartuje session a následně ji na serveru zruší.


    Závěr

    Tento projekt byl myšlen jako úvod k práci s PHP/MySQL. Samozřejmě, že výběr náhodné položky nepatří mezi nejčastější typy aplikací, ale pro ilustrační účely by měl bohatě postačovat.

    Všechny soubory je možné stáhnout na této adrese.


    Seznam použitých funkcí

    Count, Header, Is_Numeric, IsSet, MySQL_Error, MySQL_Fetch_Array, MySQL_Num_Rows, MySQL_PConnect, MySQL_Query, MySQL_Select_DB Print, Session_Start, Session_Destroy,

    Odkazy na web

    MySQL Web
    Český manuál k MySQL


    LICENCE

    Všechny skripty na tomto webu jsou poskytovány, pokud není uvedeno jinak, bez jakýchkoliv licenčních požadavků a také bez záruk.