PHP

Web o webu

Výpis dat

Objektové metody pro výpis dat

vypisy.zip

Schématický postup při výpisu dat:

  1. new mysqli - připojení k databázi - include souboru spojeni.php
  2. set_charset - nastavení UTF8 - v souboru spojeni.php
  3. isset - zjištění hodnot proměnných (řazení, vyhledávání apod.)
  4. real_escape_string - ošetření proměnných (řazení, vyhledávání apod.) proti SQL injection
  5. prepare - připravení dotazu SELECT s propojením tabulek pomocí JOIN
  6. bind_result - přiřazení výstupních proměnných
  7. execute - spuštění dotazu
  8. fetch - v cyklu - postupné načítání záznamů do výstupních proměnných a jejich vypsání
  9. close - uzavření dotazu

Výpis dat

Obsah těla souboru vypis.php:

<h1>Výpis dat z databáze</h1>
<?php
//připojení k MySQL a nastavení UTF8 v spojeni.php - proměnná $spojeni
include "spojeni.php";
//načtení dat z tabulek
$dotaz=$spojeni->prepare("SELECT kategorie.kategorie,vyrobci.nazev AS znacka,
       vyrobky.nazev,cena FROM vyrobky
       JOIN kategorie ON vyrobky.id_kategorie=kategorie.id
       JOIN vyrobci ON vyrobky.id_vyrobce=vyrobci.id");
$dotaz->bind_result($kategorie,$znacka,$nazev,$cena);
$dotaz->execute();
//výpis dat do tabulky
echo "<table>";
echo "<tr><th>Kategorie</th><th>Značka</th><th>Název</th><th>Cena</th></tr>";
while($dotaz->fetch()){
  echo "<tr><td>$kategorie</td><td>$znacka</td><td>$nazev</td>
        <td class='right'>$cena</td></tr>";
}
echo "</table>";
$dotaz->close();
?>

Výpis s řazením dat

Ukázka výpisu výrobků s řazením

Údaj s požadovaným řazením předáme stránce metodou get prostřednictvím odkazu s příslušnou hodnotou v url adrese parametru href (viz Odesílání dat - Odkazy).

Ukázka kódu a postupu

V nadpisových buňkách tabulky vytvoříme odkazy na stránku s výpisem s proměnnou pro seřazení podle daného pole databáze (případně použijeme alias vytvořený v dotazu, např. znacka):

echo "<tr><th><a href='vypis.php?razeni=kategorie'>Kategorie</a></th>
          <th><a href='vypis.php?razeni=znacka'>Značka</a></th>
          <th><a href='vypis.php?razeni=nazev'>Název</a></th>
          <th><a href='vypis.php?razeni=cena'>Cena</a></th></tr>";

Před vytvořením dotazu přidáme podmínku pro získání hodnoty z url adresy po kliknutí na odkaz (metoda get) či nastavení standartního řazení (např. podle názvu), pokud jsme ještě na odkaz neklikli a proměnná $_GET["razeni"] neexistuje. Zároveň ošetříme hodnotu proměnné $_GET["razeni"] proti sql injection metodou real_escape_string:

if(isset($_GET["razeni"])){
   $razeni=$spojeni->real_escape_string($_GET["razeni"]);
}
else {$razeni="nazev";}

V dotazu přidáme ORDER BY $razeni:

$dotaz=$spojeni->prepare("SELECT kategorie.kategorie,vyrobci.nazev AS znacka,
 vyrobky.nazev,cena FROM vyrobky JOIN kategorie ON vyrobky.id_kategorie=
 kategorie.id JOIN vyrobci ON vyrobky.id_vyrobce=vyrobci.id ORDER BY $razeni");

Výpis dat z databáze s omezeným počtem záznamů na stránku

Ukázka výpisu výrobků se stránkováním

Číslo stránky v odkazu na další stránku výpisu zvýšíme o 1, v odkazu na předchozí číslo stránky snížíme. Tuto hodnotu připojíme k url adrese v parametru href odkazu. Hodnota proměnné $strana bude poslána metodou get a poté tedy získána v poli $_GET["strana"] - viz Odesílání dat - Odkazy.

Číslo stránky pak použijeme pro výpočet limitu zobrazovaných záznamů - v dotazu SELECT přidáme LIMIT od čísla stránky krát počet záznamů na stránku mínus počet záznamů na stránku, druhá hodnota pak určuje počet záznamů na stránku.

Ukázka kompletního kódu výpisu se stránkováním

<h1>Výpis dat z databáze s omezeným počtem záznamů na stránku</h1>
<?php
//připojení k MySQL
include "spojeni.php";
//získání čísla stránky po kliknutí na odkaz na předchozí či další stránku
if(isset($_GET["strana"])){
      $strana=strval($_GET["strana"]);  // převedení na číslo
}
else {$strana=1;}
//načtení dat z tabulek
$dotaz=$spojeni->prepare("SELECT kategorie.kategorie,vyrobci.nazev AS znacka,
  vyrobky.nazev,cena FROM vyrobky
  JOIN kategorie ON vyrobky.id_kategorie=kategorie.id
  JOIN vyrobci ON vyrobky.id_vyrobce=vyrobci.id ORDER BY vyrobky.nazev
  LIMIT ".($strana*10-10).",10");
$dotaz->bind_result($kategorie,$znacka,$nazev,$cena);
$dotaz->execute();
//výpis dat do tabulky
echo "<table>";
echo "<tr><th>Kategorie</th><th>Značka</th><th>Název</th><th>Cena</th></tr>";
while($dotaz->fetch()){
      echo "<tr><td>$kategorie</td><td>$znacka</td><td>$nazev</td>
            <td>$cena</td></tr>";
}
echo "</table>";
//odkazy na předchozí a další stránku
echo "<div class='stranky'>";
if($strana>1){
  echo "<a href='strankovani.php?strana=".($strana-1)."'>«&nbsp;předchozí</a>";
}
echo "<span>strana $strana</span>";
if($dotaz->num_rows==10){
  echo "<a href='strankovani.php?strana=".($strana+1)."'>další&nbsp;»</a>";
}
echo "</div>";
$dotaz->close();
?>

Vyhledávání dat

Ukázka vyhledávání a výpisu vyhledaných dat

Pro zadání hledaného textu vytvoříme formulář s textovým polem a odesílacím tlačítkem. Hledaný text pak použijeme v dotazu v podmínce WHERE s operátorem LIKE %hledaný text%.

Tlačítko pro opětovné zobrazení všech záznamů vytvoříme jednoduše jako odkaz na vyhledavani.php bez parametru.

Ukázka kompletního kódu výpisu s vyhledáváním

<h1>Vyhledání podle zadaného názvu nebo části názvu</h1>
<form method="post">
  <input type="search" name="hledat">
  <input type="submit" value="Najít">
  <a href="vyhledavani.php">Zobrazit vše</a>
</form>
<?php
include "spojeni.php";  //připojení k MySQL a nastavení UTF8 - objekt $spojeni

if(isset($_GET["hledat"])){
  // $_GET["hledat"] existuje, pokud se odeslal formulář s hledaným textem
  // ošetření SQL injection
  $_GET["hledat"]=$spojeni->real_escape_string($_GET["hledat"]);
  $podminka="WHERE vyrobky.nazev LIKE '%{$_GET["hledat"]}%'";
}
else {$podminka="";}

//načtení dat z tabulek
$dotaz=$spojeni->prepare("SELECT kategorie.kategorie,vyrobci.nazev AS znacka,
  vyrobky.nazev,cena FROM vyrobky
  JOIN kategorie ON vyrobky.id_kategorie=kategorie.id
  JOIN vyrobci ON vyrobky.id_vyrobce=vyrobci.id $podminka ORDER BY nazev");
$dotaz->bind_result($kategorie,$znacka,$nazev,$cena);
$dotaz->execute();
//výpis dat do tabulky
echo "<table>";
echo "<tr><th>Kategorie</th><th>Značka</th><th>Název</th><th>Cena</th></tr>";
while($dotaz->fetch()){
  echo "<tr><td>$kategorie</td><td>$znacka</td><td>$nazev</td>
        <td class='right'>$cena</td></tr>";
}
echo "</table>";
$dotaz->close();
?>

Formulář můžeme odeslat metodou get i metodou post. Použijeme-li metodu get, bude se nám lépe kombinovat vyhledávání s řazením (soubor vyhledavani_razeni.php ve stažených ukázkách) nebo se stránkováním (vypis_administrace.php).

Filtrování dat

Ukázka filtrování dat výběrem určité kategorie

Pro výběr určitých dat (např. určité kategorie) vytvoříme formulář s výběrovým polem (<select>). Položky výběrového pole (<option>) načteme z příslušné tabulky (např. kategorie) a vypíšeme cyklem stejně jako řádky tabulky ve výpisech výše. Hodnotou (value) bude zpravidla id (id kategorie) a zobrazeným textem název (název kategorie).

Ukázka kódu pro vytvoření výběrového pole

<h1>Výběr dat podle kategorie</h1>
<form method="get">
  <select name="kategorie">
    <option value="">Vyberte kategorii</option>

    <?php
    include "spojeni.php";  //připojení k MySQL a nastavení UTF8

    //načtení záznamů z tabulky kategorie a vypsání do option selectu
    $dotaz=$spojeni->prepare("SELECT id,kategorie FROM kategorie
                              ORDER BY kategorie");
    $dotaz->bind_result($id,$kategorie);
    $dotaz->execute();
    while($dotaz->fetch()){
      echo "<option value='$id'>$kategorie</option>";
    }
    $dotaz->close();
    ?>

  </select>
  <input type="submit" value="Zobrazit zvolené">
  <a href="filtr.php">Zobrazit vše</a>
</form>

Následuje zjištění, zda existuje proměnná $_GET["kategorie"], vytvoření podmínky WHERE a vypsání dat do tabulky obdobně jako v předchozích příkladech.

Výpis v jiném formátu s odkazem na detailní zobrazení zvoleného záznamu

Ukázka výpisu do různých html značek s odkazem na detail

Výpis s odkazy pro administraci dat - vložení, upravení a mazání údajů

Ukázka výpisu pro administraci dat

V dotazu přidáme načtení id záznamu a ve výpisu přidáme odkazy upravit a smazat s hodnotou id v parametru href. Stránky upravit.phpsmazat.php si načtou hodnotu id z pole $_GET["id"]. Přidáme také odkaz na stránku vlozit.php (bez id) pro vložení nového záznamu.

Ukázka kódu odkazů pro vložení, úpravu a mazání dat

//výpis dat do tabulky
echo "<table>";
echo "<tr><th>Kategorie</th><th>Značka</th><th>Název</th><th>Cena</th>
      <th colspan='2'><a href='vlozeni.php'>vložit nový záznam</a></th></tr>";
while($dotaz->fetch()){
  echo "<tr><td>$kategorie</td><td>$znacka</td>
        <td><a href='zobrazeni.php?id=$id'>$nazev</a></td>
        <td>$cena</td>
        <td><a href='upraveni.php?id=$id'>upravit</a></td>
        <td><a href='smazani.php?id=$id'>smazat</a></td></tr>";
}
echo "</table>";

Stažení zdojových kódů všech ukázek - vypisy.zip