Hlavní navigace

Příklad webu ve spojení PHP a MySQL

Petr Hodan 20. 4. 2000

Základem tvorby internetové prezentace je vždy znalost HTML jazyka. Každý zkušenější designer webových stránek by měl mít na paměti jeho omezení. Stejně tak nesmí zapomínat, že většinou stejná stránka vypadá úplně jinak v Microsoft Exporeru a Netscape Navigatoru, o Lynxu nemluvě. V podstatě to samé platí o skriptovacích jazycích.

Zkusíme vytvořit jednoduchou webovou stránku. Bude obsahovat nadpis nahoře uprostřed, vlevo v úzkém sloupci bude seznam článků a vpravo samotný článek, přičemž při příchodu na stránku se zobrazí něco jako úvodník. Z rozložení vyplývá, že bude vhodné stránku navrhnout jako tabulku. Její podoba bude takováto:

+--------------------------------+
|           Nadpis               |
+-------+------------------------+
| Sez-  |                        |
| nam   |                        |
|       |                        |
| člá-  |                        |
| nků   |     článek             |
|       |                        |
|       |                        |
|       |                        |
+-------+------------------------+

Graficky stránku řešit nebudeme, jako nadpis budeme dávat jméno článku uzavřené do tagů h1, jinak vše bude prostý text členěný na odstavce. Nejdříve ale musíme navrhnout strukturu tabulky na SQL serveru, z níž budeme data tahat. Navrhuji následující věci:

  1. každý článek je unikátní, měl by mít unikátní identifikační číslo (dále jen id)
  2. články se nepíšou sami, tudíž by zde měl být uveden autor
  3. do databáze nebudeme dávat celé články, jen odkazy kde je najdeme (snazší správa při opravách v článku)
  4. každý článek má název, datum vytvoření a na konci odkazy na související články

Při troše chuti dojdeme asi k následujícím tabulkám (ano, tabulkám, jedna hlavní a ostatní jen jako číselníky – pochopíte ihned jakmile uvidíte):

Tabulka 1.
+---+-------+-------+----------+-------+--------+
|id | Název | Místo | Autor_id | Datum | Odkazy |
+---+-------+-------+----------+-------+--------+
|   |       |       |          |       |        |

Tabulka 2.
+---+-------+------+---------+
|id | Autor | mail | telefon |
+---+-------+------+---------+
|   |       |      |         |

Tabulka 3.
+-----------+----------+---------+
| id_odkazu | k_clanku | hodnota |
+-----------+----------+---------+
|           |          |         |

Máme tři tabulky. V první budeme klást omezení. Id musí být nenulové a unikátní, název nenulový, stejně tak i místo, autor a datum. Sloupec odkazy bude obsahovat jen hodnoty „ano“ a „ne“. Ve druhé tabulce bude nenulový a unikátní sloupec id, sloupec autor bude muset být nenulový. No a konečně v poslední tabulce stejně jako v minulých. Sloupec id_odkazu nenulový a unikátní, sloupec k článku nenulový a stejně tak i hodnota.

Vytvořme nyní tyto tabulky:

Tabulka 1:

create table main (id int not null unique, nazev varchar(125) not null, misto varchar(125) not null, autor_id int not null, datum date not null, odkazy enum(„ano“,„ne“));

Tabulka 2:

create table authors (id int not null unique, autor varchar(125) not null, mail varchar(60), telefon varchar(30));

Tabulka 3:

create table odkazy (id_odkazu int not null unique, k_clanku int not null, hodnota varchar(255) not null);

Tímto máme vytvořeny tabulky v databázi. Již jen stačí napsat takový PHP skript, který vygeneruje požadovanou stránku podle id článku a sám zjistí autora a případné odkazy a při jejich existenci je zobrazí dole na stránce.

Začneme tak, že si nejprve celou stránku napíšeme čistě v HTML. Nazveme ji index.html a umístíme na server. Mohla by vypadat asi takto:

<html>
<head>
 <title>Nějaká stránka</title>
</head>

<body bgcolor="white">
 <table width="780" height="1" border="1">
 <tr>
 <td colspan="2">
  <h2>Vítejte na mojí první PHP stránce</h2>
 </td>
 </tr>
 <tr>
 <td width="200" height="1">
  <p>
    Sem přijde seznam článků řazený od nejnovějšího
    k nejstaršímu
  </p>
 </td>
 <td>
  <p>
    A tady bude článek, dole pak odkazy a jméno autora
    jako link na mailto:______
  </p>
 </td>
 </tr>
 </table>
</body>
</html>

Vidíme asi jak to bude vypadat a kam budeme vkládat skript. Prvním úkolem je vytvořit seznam článků. K tomu potřebujeme jen id článku a jeho název. Vybereme všechny články sestupně podle data dotazem:

select id, nazev from main order by datum desc;

Nyní již jen zbývá převést tento dotaz do PHP skriptu a zpracovat výstup. Ještě předtím by se hodila zmínka o tom, jak se PHP skriptu předávají data (proměnné). Nechť je url něčeho „http://www.ne­co.com/clanek­.php3?id=7“. Pak se při otvírání této stránky spustí PHP skript clanek.php3 a předá se mu hodnota id=7. Pokud je hodnot více, oddělují se „&“, třeba „http://www.ne­co.com/clanek­.php3?id=7&va­lue=no“.

Skript pro výtah seznamu článků by mohl vypadat asi takto:

01: <?php
02:   $db = mysql_connect("localhost", "user","heslo");
03:   mysql_select_db("moje_databáze",$db);
04:   $vysledek = mysql_query("select id, nazev from
      main order by datum desc;",$db);
05:   while ($radek = mysql_fetch_row($vysledek))
06:   {
07:     printf ("<a href=\"clanek.php3?id=%s\">%s</a>
        <br>",$radek[0],$radek[1]);
08:   }
09:   mysql_close($db);
10: ?>

Na řádku 2 otevřeme spojení se serverem. Nesmíme zapomenout uvést správný login a heslo. Na třetím řádku vybereme používanou databázi. Zde je rovněž nutné mít práva k přístupu do ní. Nejdůležitější je řádek číslo 4. Na něm se serveru ptáme na požadované položky. Na řádcích 5 až 8 je smyčka, která tiskne tag „<a href=“…„>Název</a><br>“ podle obsahu databáze. WHILE je použito proto, aby se smyčka opakovala až do doby kdy už není co vracet. Jednotlivé sloupce tabulky jsou reprezentovány proměnnou $radek[0] a $radek[1]. Indexy 0 a 1 vyplývají z pořadí sloupců na které jsme se tázali. „id = $radek[0]“ a „nazev = $radek[1]“. Na řádku 9 se se serverem rozloučíme.

Vložme tento skript no našeho html kódu:

<body bgcolor="white">
 <table width="780" height="1" border="1">
 <tr>
  <td colspan="2">
   <h2>Vítejte na mojí první PHP stránce</h2>
  </td>
 </tr>
 <tr>
  <td width="200" height="1">
 <p>
 <?php
  $db = mysql_connect("localhost", "user","heslo");
  mysql_select_db("moje_databáze",$db);
  $vysledek = mysql_query("select id, nazev
  from main order by datum desc;",$db);
  while ($radek = mysql_fetch_row($vysledek))
  {
    printf ("<a href=\"clanek.php3?id=%s\">%s</a>
    <br>",$radek[0],$radek[1]);
  }
   mysql_close($db);
 ?>

 Sem přijde seznam článků řazený od nejnovějšího
 k nejstaršímu
 </p>
 </td>
 <td>
  <p>
   A tady bude článek, dole pak odkazy a jméno autora
   jako link na mailto:______
  </p>
 </td>
 </tr>
 </table>
</body>
</html>

Naplňte databázi nějakými údaji a zkuste se na stránku podívat. Pokud se objeví Vámi zadané věci je to v pořádku. Pokud ne, někde jste udělali chybu. Zkontrolujte databázi, uživatelské jméno a heslo.

Tímto máme jakýsi skelet pro úvodní stránku. Dále musíme vytvořit ještě skript clanek.php3, který bude zobrazovat zadané články. Použijeme tu samou kostru HTML dokumentu, dokonce i sekce pro seznam článků zůstane. Budeme muset akorát přidat sekci, která zajistí natáhnutí požadovaného článku, změní nadpis stránky a uvede dole jméno autora a příslušné odkazy.

Vyjdeme z našeho index.php3 a přidáme označené řádky:

+ <?php
+     $db = mysql_connect("localhost", "root","command");
+     mysql_select_db("root",$db);
+     $result = mysql_query("select nazev,misto,autor_id,
      datum,odkazy from main where id=".$id.";",$db);
+     $radek = mysql_fetch_row($result);
      /* v této sekci si zjistíme všechny údaje o řádku v
      tabulce, budou uloženy v proměnných $radek[0] az $radek[4]
      */
+  ?>


<html>
<head>
   <title>
+   <?php
+     printf("%s",$radek[0]);
      /* Vytiskneme název článku to titulku okna prohlížeče */
+   ?>
</title>
</head>

<body bgcolor="white">
   <table width="780" height="1" border="1">
   <tr>
    <td colspan="2" align="center">
      <h2>
+     <?php
+      printf("%s",$radek[0]);
       /* Vytiskneme název článku do horní buňky tabulky */
+     ?>
      </h2>
    </td>
   </tr>
   <tr>
    <td width="200" height="1">
     <p>
     <?php
        $result = mysql_query("select id,nazev from main
        order by datum desc;",$db);
        while ($radek1 = mysql_fetch_row($result))
          {
        printf ("<a href=\"clanek.php3?id=%s\">%s</a><br>",
        $radek1[0],$radek1[1]);
          }
           mysql_close($db);
         ?>
        </p>
    </td>
    <td>
     <p>
+    <?php
+        $filename = "html/".$radek[1];
          /* Nastavujeme jméno souboru s článkem */
+         $fd = fopen( $filename, "r" );
          /* otevíráme ho pro čtení */
+         $contents = fread( $fd, filesize( $filename ) );
          /* čteme jeho obsah */
+         fclose( $fd );
          /* zavíráme soubor */
+         printf($contents);
          /* a tiskneme ... */
+   ?>
    </p>
    -------
    Sem přijde vložit kus kódu - Autor... a odkazy...
    -------
    </td>
    </tr>
    </table
</body>
</html>

Struktura adresářů je asi taková, že v „html/“ adresáři (to je adresář v adresáři kde je index.php3 a clanek.php3 – poněkud krkolomné) jsou soubory nazvané podle sloupce misto v hlavní tabulce respektive v tabulce jsou uvedeny jejich jména. Nezapomeňte změnit v části zabezpečující generování seznamu proměnnou radek za radek1, pak by Vám to nechodilo jako mě a marně byste přemýšleli :-)

Už nám chybí jen jméno autora a odkazy. Na to použijeme stejné postupy jako do této doby. Víme-li autorovo id (autor_id), stačí se jen zeptat na jeho jméno a email. Dotaz bude vypadat následovně:

select autor, mail from authors where id=author_id;

Část PHP kódu, kterou budeme vkládat, bude vypadat nějak takto (už i se sekcí pro odkazy… vysvětlení níže).

<p>
<?php
  $result3 = mysql_query("select autor,mail from authors where
  id=".$radek[2].";",$db);
  $radek2 = mysql_fetch_row($result3);
  printf ("<a href=\"mailto:%s\">%s</a>",
  $radek2[1],$radek2[0]);
?>

</p>
<p>

<?php
if($radek[4]="ano")
{
   $result4 = mysql_query("select hodnota from odkazy
   where k_clanku=".$radek[2].";",$db);
   while ($radek3 = mysql_fetch_row($result4))
   {
    printf ("<a href=\"%s\">%s</a><br>",
    $radek3[0],$radek3[0]);
   }
}
mysql_close($db);
?>
</p>

A vložíme ho na označené místo předchozího výpisu. Je nesmíme zapomenout přesunout příkaz mysql_close() až na konec. Dotaz na odkazy vypadá tak, že se nejdříve ptáme, zda k danému článku existují odkazy. To je podmínka IF. Je-li splněna, nic nebrání v tom, abychom se ptali dál přímo na url odkazů:

select hodnota from odkazy where k_clanku=id;

Přičemž id víme. Pak je to již standardní problém zpracování výstupu SQL serveru do rozumné formy. Smyčka WHILE je tu proto, že nevíme kolik odkazů je v databázi. Proto čteme stále dokud je co.

Mnozí zkušenější uživatelé a administrátoři by to určitě nikdy nenapsali tak jako já teď, ale je to jen školní případ. Pokud se někdo bude chtít touto problematikou zabývat hlouběji, zjistí že vše lze zapsat jednoduše a vizuálně lépe.

Zkuste databázi nakrmit nějakými údaji, udělejte nějaké soubory (jako HTML) a hrajte si s tím, to je nejlepší cesta jak se naučit jednotlivé vztahy mezi tabulkami a propojujte to s PHP skripty. Tvořte složitější dotazy… učený z nebe nespadl…

Našli jste v článku chybu?

1. 10. 2011 20:33

FilPyr (neregistrovaný)

clanek.php
+ <?php
+ $db = mysql_connect("lo­calhost", "root","");
+ mysql_select_db("in­dexinzerce",$db);
$sql = "SELECT `nazev` , `misto` , `autor_id` , `datum` , `odkazy`
FROM `main` WHERE `id`='".$_GET['id']­."'";
+ $result = mysql_query($sql, $db);
+ $radek = mysql_fetch_row($sql);
/* v této sekci si zjistíme všechny údaje o řádku v
tabulce, budou uloženy v proměnných $radek[0] az $radek[4]
*/

?>

<html>
<head>
<title>
+ <?php
+ printf("%s",$ra­dek[0]);
/* …













1. 9. 2000 16:41

gabo bagita (neregistrovaný)

Ten clanok sa mi paci, akurat chcel by som upozornit na jednu chybycku.
Program generuje odkazy podla AUTOR_ID, a nie podla ID clanku.

sorry, za prazdne odkazy, ale Enter sa mi volako zasekol :(


120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život