Dnes: 21. ledna 2018    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    Systémový katalog
    Struktury, ve kterých jsou uloženy informace o dané databázi, případně databázovém serveru. Někdy je možné se z anglického Data Dictionary setkat s pojmem datový slovník.

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Databáze a PHP XII.


    [Vývoj] - Ve dvanáctém pokračování našeho rozsáhlého seriálu věnovaného problematice PHP ve spojení s databázovými technologiemi budeme pokračovat v praktickém příkladu diskusního webového fóra – hlavním tématem i dnes bude přidávání nových příspěvků.



    V minulé části jsme se zabývali především způsobem zobrazení a základním rozhraním navrhovaného diskusního fóra. Nyní se konečně podívejme na jeden z možných způsobů přidávání nových příspěvků do diskuse. Jako první jsou samozřejmě příspěvky, které zakládají nové téma diskuse. Logika přidání těchto příspěvků je velice jednoduchá, protože zakládané téma prozatím nemá žádné vazby na již existující příspěvky. Uživatelské rozhraní nabízí tlačítko Přidat, které vyvolá skript pridat.php

    . Technicky je tato strana fóra velice jednoduchá, neboť obsahuje jenom naformátovaný formulář, který slouží buď ke čtení existujícího nebo přidání nového příspěvku. Rozlišení těchto dvou odlišných stavů je provedeno pomocí hodnoty ID_rodic. Nové téma ji má nastavenou ve výchozím stavu 0.

    <?
        .....
        echo "<font size=+1>";
        if($ID_rodic>0)
          echo "Odpověď na příspěvek";
        else
          echo "Vkládání nového příspěvku";
        echo "</font>";
        .....
    ?>
    

    Dále si povšimněte nastavení textového pole, které obsahuje titulekpříspěvku. Vzhledem k tomu, že je dále zpracováván tvar titulku, je potřeba zachovat jeho přesný tvar. Pro odpověď má pak toto pole navíc vlastnost read-only. Ke každé odpovědi je dále přidáno Re:, přičemž úroveň zanoření je možno zjistit z počtu těchto předpon.

    <th>
      Titulek:   
    </th>
    <td>
      <input type="text" name="titulek" size="40" maxlength="100"
             value="<? if($ID_rodic>0) echo "Re: $titul\" readonly";
                       else echo "Bez titulku\""; ?>>
    </td>
    

    Na konci skriptu je pak ještě k formuláři připojena proměnná pridat s hodnotou 1, která je kontrolována před zápisem do databáze. Dále je zajištěn další přenos ID hodnoty příspěvku. Potvrzení tohoto formuláře nás pak zavede zpátky ke skriptu index.php. Zde jsou předpřipravením příspěvku splněny podmínky pro spuštění kódu provádějícího vlastní zápis do databáze, tj. proměnná obsahující text příspěvku je neprázdný řetězec a stavová proměnná $pridat má hodnotu 1 (true). Zapsání příspěvku do databáze je odděleno do funkce pridat().

    Opět se nám tu "proplétá" doplněný kód pro případ, že se jedná již o odpověď na existující téma. Tento případ poznáme podle hodnoty $ID_rodic a musíme u rodiče nového příspěvku aktualizovat hodnotu potomek na 1. Podle této hodnoty je při zobrazování rozpoznán list stromu od uzlu s potomky.

    <!-- Ověření, jestli není třeba vložit nový příspěvek -->
    <?
       if($pridat && isset($telo)):
         pridat();                // přidání nového tématu
         if($ID_rodic>0){         // označit rodiče pro odpověď
           // Pozor! Číslo u potomka neznačí počet potomků,
           // ale pouze jestli má/nemá potomky, tj. informace 0/1
           $dotaz="update hlavicka set potomek=1 ".
                  "where ID_prispevku=".$ID_rodic;
           $vysledek=mysql_query($dotaz);
           if(!$vysledek):
             echo "<b>(3) Nastala chyba při aktualizaci".
                  " rodiče ve stromu diskuse!</b>";
           endif;
         }
       endif;
    ?>
    

    Ve funkci pridat() jsou nejdříve připraveny potřebné informace pro zápis. Globální proměnné jsou ve funkci zpřístupněny pomocí global a je získán aktuální čas zápisu položky. Zápis do tabulky hlavicka provedeme pomocí insert. Proběhne-li vše v pořádku, je zrealizován i zápis do tabulky text, kde je uložen příslušný text příspěvku. Pro uložení je využito stejné ID_prispevku, jaké bylo přiřazeno v tabulce hlavicka. Zjistíme jej pomocí funkce mysql_insert_id().

    // Přidání dalšího tématu do stromu diskuse, 
    // navrací true/false dle úspěšnosti akce
    function pridat(){
      global $autor, $titulek, $telo, $ID_rodic;   // globální proměnné
    
      $cas=Date("Y-m-d H-i-s");
      $dotaz="insert into hlavicka(rodic,autor,titulek,cas)".
             " values(\"$ID_rodic\",\"$autor\",\"$titulek\",\"$cas\")";
      $vysledek=mysql_query($dotaz);      // vkládání hlavičky příspěvku
      if(!$vysledek):
        echo "<b>(1) Nastala chyba při zápisu do stromu diskuse!</b>";
        return false;
      else:
        $ID=mysql_insert_id();            
           // zjištění hodnoty posledního ID
        $dotaz="insert into text(ID_prispevku,zprava)".
               " values ($ID,\"$telo\")";
        $vysledek=mysql_query($dotaz); // vkládání hlavičky příspěvku
                                       // generovaného příkazem insert
        if(!$vysledek):
          echo "<b>(2) Nastala chyba při zápisu do stromu diskuse!</b>";
          return false;
        endif;
      endif;
      return true;
    }
    

    Diskuse

    Doposud jsme ale opomíjeli jednu z nejdůležitějších vlastností při výpisu stromové struktury fóra. Pokud si chceme kterékoliv téma, na které již bylo odpovězeno, rozbalit, musíme zajistit uchování informace o rozbalení/sbalení jednotlivých větví. Jde to několika způsoby, přičemž většina z nich byla popsána v minulých dílech našeho seriálu. Zde je vybráno uchování stavu pomocí session proměnné $pole_strom. Její hodnota a hodnota další proměnné $barva je inicializována výchozím nastavením při prvním spuštění hlavního skriptu aplikace – index.php.

    <?
      session_start();
      if(!session_is_registered('pole_strom')){
        // pole_strom uchovává aktuální stav stromu
        $pole_strom=array();   // počáteční inicializace
        $barva=1;              // barva řádku diskuse
        session_register('pole_strom','barva');
      }
    ?>
    

    Nastavování hodnot pole $pole_strom by mělo být jasnější při nahlédnutí na následující část kódu skriptu index.php. První dvě větve se odkazují na hromadné rozbalení/sbalení celého stromu. Tyto možnosti by nastaly pouze při výběru příslušných položek z hlavní nabídky uživatelského rozhraní. Poslední možností je rozbalení pouze větve, jejíž uzel má ID uchováno v proměnné $rozbal. Hodnota této proměnné je součástí sestaveného odkazu pro jednotlivé příspěvky.

    <?
      if($rozbal1_x>0)                // Rozbalit vše
        rozbalit_vse();
      else if($rozbal2_x>0){          // Sbalit vše
        sbalit_vse();
      } else if($pole_strom[$rozbal]): 
           // po vybrání rozbalení/sbalení příslušné větve
              $pole_strom[$rozbal]=!$pole_strom[$rozbal];
            else:
              $pole_strom[$rozbal]=1;
            endif;
      $barva=1;
    ?>
    

    Dnešní díl zakončíme výpisem obsahu krátkého kódu funkcí rozbalit_vse() a sbalit_vse(). V podstatě v nich jde o hromadné označení uzlů pro rozbalení/sbalení. U rozbalení jsou do $pole_strom "sesbírána" všechna ID_prispevku, u kterých již existuje alespoň jeden potomek. Naopak u sbalení potřebujeme pole $pole_strom vynulovat, což nejjednodušeji provedeme zrušením pole a jeho znovuzavedením (odregistrováním a zaregistrováním session proměnné).

    // Funkce označující k rozbalení všechny větve s potomky
    function rozbalit_vse(){
      global $pole_strom;
    
      $dotaz="select ID_prispevku from hlavicka where potomek>0";
      $vysledek=mysql_query($dotaz);
      for($i=0;$i<mysql_num_rows($vysledek);$i++)
        $pole_strom[mysql_result($vysledek,$i)]=1;
    }
    
    // Funkce zajišťující sbalení všech větví
    function sbalit_vse(){
      global $pole_strom;
    
      // vymazání provedeno zrušením 
      // a znovuzavedením proměnné pole
      session_unregister($pole_strom);
      $pole_strom=array();   // počáteční inicializace
      session_register('pole_strom');
    }
    

    Pro ukončení aplikace nám tedy zůstává vytvořit skript pro čtení existujících příspěvků, propojit ho s již předpřipraveným skriptem pro přidání reakce na příspěvek a konečně plné zobrazení stromu v závislosti na výběru rozbalených/sbalených uzlů.

    Související články:
    Databáze a PHP XIV. (09.06.2005)
    Databáze a PHP XIII. (03.06.2005)
    Databáze a PHP XI. (12.05.2005)
    Databáze a PHP X. (07.05.2005)
    Databáze a PHP IX. (29.04.2005)
    Databáze a PHP VIII. (20.04.2005)
    Databáze a PHP VII. (07.04.2005)
    Databáze a PHP VI. (24.03.2005)
    Databáze a PHP V. (10.03.2005)
    Databáze a PHP IV. (01.03.2005)
    Databáze a PHP III. (22.02.2005)
    Databáze a PHP II. (15.02.2005)
    Databáze a PHP I. (08.02.2005)

    ( Celý článek! | Autor: Martin Pokorný | Počet komentářů: 1 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1557 hl.)
    Do 1 000,- Kč 
     (1074 hl.)
    Do 10 000,- Kč 
     (1003 hl.)
    Do 25 000,- Kč 
     (1385 hl.)
    Do 50 000,- Kč 
     (1019 hl.)
    Do 75 000,- Kč 
     (1183 hl.)
    Více než 75 000,- Kč 
     (1022 hl.)

    Celkem hlasovalo: 8243


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Leden  >>
    PoÚtStČtSoNe
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena