15. Komunikace s databází

Vlastní komunikace z hlediska skriptu PHP vypadá následovně:

  1. připojení k databázovému serveru MySQL a výběr databáze
  2. zaslání příkazů a převzetí výsledných dat (či aktualizace těchto dat) z databázového serveru MySQL
  3. odpojení se od databázového serveru MySQL

Než tyto tři kroky provedeme, měli bychom znát několik základních funkcí PHP, kterými "ovládáme" databázi. Tyto funkce používáme za pomoci ovladačů. Nejčastější typy ovladačů:

  • mysql (pouze pro verze PHP 5.5 a nižší, zastaralé a již se nedoporučuje používat)
  • mysqli (MySQL Improved, parametry se do dotazů předávají velmi nepohodlně)
  • PDO (PHP Database Objects, jedná se o nejnovější a velmi kvalitní objektový ovladač, který se jednoduše používá a podporuje kromě MySQL ještě několik databází.
  • a další

Funkcím, které začínají výrazem mysql, je již v PHP lepší se úplně vyhnout. Pro PHP do verze 5.4 se mohlo používat funkce MySQL. Od vyšších verzí PHP je nutné používat funkci MySQLi nebo PDO_MySQL.

Více informací najdete např. v tomto článku (odkaz na web http://jecas.cz)

Několik základních příkazů pro práci s databází:

  • mysqli_connect - otevírá spojení se serverem MySQL
  • mysqli_select_db - vybíra MySQL databázi
  • mysqli_query - posíla MySQL příkaz
  • mysqli_num_rows - vrací počet řádků výsledku příkazu
  • mysqli_affected_rows - vrací počet řádků, které byly ovlivněny poslední operaci
  • mysqli_fetch_array - zpracovává jeden řádek výsledku příkazu, vrací asociativní pole, číselné pole či oboje
  • mysqli_fetch_row - zpracovává jeden řádek výsledku příkazu, vrací číselné pole
  • mysqli_fetch_assoc - zpracovává jeden řádek výsledku příkazu, vrací asociativní pole
  • mysqli_unbuffered_query - posílá MySQL příkaz bez automatického zpracování výsledku a bez ukládání do vyrovnávací paměti
  • mysqli_error - vrací chybný řádek posledního MySQL příkazu
  • mysqli_change_user - mění uživatele pro určité připojení
  • mysqli_free_result - uvolňuje paměť od výsledku příkazu
  • mysqli_result - vrací data výsledku příkazu
  • mysqli_fetch_object - zpracovává jeden řádek výsledku příkazu a vrací objekt
  • mysqli_client_encoding - vrací kódování spojení
  • mysqli_close - ukončuje spojení s MySQL serverem
  • mysqli_pconnect - vytvoří trvalé připojení se serverem MySQL
  • mysqli_create_db - vytvoří MySQL databázi
  • mysqli_db_name - vrací název databáze
  • mysqli_db_query - přepíná se na uvedenou databázi a posílá příkaz
  • mysqli_field_len - vrací délku pole
  • mysqli_get_host_info - vrací informaci o MySQL připojení
  • mysqli_get_client_info - vrací informaci o MySQL uživateli
  • mysqli_field_flags - vrací atributy uvedeného pole
  • mysqli_drop_db - smaže MySQL databázi

Připojení k databázovému serveru MySQL a výběr databáze

Pro připojení k databázovému serveru MySQL slouží funkce mysqli_connect. Často se doplňuje o kontrolu, zda se připojení podařilo. Dále se provádí samotné dotazy do databáze a nasleduje odpojení, i když to PHP provede většinou samo i bez našeho přičinění. Patří to ale ke slušnému stylu:

<?php 
 $server = "localhost";
 $uzivatel = "xy";
 $heslo = "xy";
 $databaze = "xy";
// Vytvoření připojení
 $spojeni = mysqli_connect ($server, $uzivatel, $heslo, $databaze);
// Kontrola připojení s případnou hláškou 
if (!$spojeni)
 {
 echo 'Spojení s mysql serverem se nepodařilo navázat.<br>';
 }
 else
 {
 echo 'Spojení s mysql serverem bylo úspěšně navázáno.<br>';
// Následuje nastavení kódování a následná práce s daty 
 mysqli_set_charset($spojeni, "utf8");

// Odpojení od databáze s kontrolou
 $zavreni = mysqli_close($spojeni);
 if(!$zavreni)
 {
 echo 'Spojení s mysql serverem se nepodařilo ukončit.';
 }
 else
 {
 echo 'Spojení s mysql serverem se podařilo ukončit.';
 }
}
?>

Tento zdrojový kód můžete mít přímo v souboru s jakýmkoliv dalším skriptem nebo bývá často jako samostatný soubor, např. db.php.

Zaslání příkazů a převzetí výsledných dat

Výpis dat z databáze se prování nejčastěji pomocí příkazu jazyka SQL, což je příkaz SELECT Jeho základní struktura je tato:

  • SELECT - seznam požadovaných položek
    • FROM seznam tabulek
    • WHERE – podmínka
    • GROUP BY - seznam položek
    • HAVING - skupinová podmínka
    • ORDER BY - třídění;

Následuje výběr tabulky z databáze. V našem příkladu to bude tabulka "knihy". V minulé kapitole byla vytvořena a následně smazána, proto si ji musíte vytvořit znovu:

create table knihy
(
CisloKnihy integer not null primary key,
NazevKnihy varchar(60) not null,
Autor varchar(60) not null
)

Dále ještě znovu vložíme 3 knihy:

insert into knihy values (1, 'Malý Bobeš','J.V.Pleva');
insert into knihy values (2, 'R.U.R.','Karel Čapek');
insert into knihy values (3, 'Bylo nás pět','Karel Poláček');

Výběr tabulky provedeme funkcí mysqli_query např. takto:

$vyber_tabulky = mysqli_query("SELECT * FROM knihy;");

Abychom výsledná data skutečně viděli, je třeba, abychom byli připojeni na databázi a aby data ve volané tabulce existovaly.

<?php
include 'db.php';

$vyber_tabulky = mysqli_query('SELECT * FROM knihy;');

echo $vyber_tabulky;
?>

Dále si necháme vypsat data z této tabulky a to funkcí mysqli_fetch_array. Cyklus WHILE obsahuje nově vzniklou proměnnou $vysledek, která pak postupně načítá data do polí s určitým názvem. Název pole odpovídá názvům sloupců z tabulky v databázi.

<?php
if (!$vyber_tabulky)
{
echo 'Chyba zaslání příkazu SQL';
}
else {
while ($vysledek = mysqli_fetch_array($vyber_tabulky))
  {
  echo "<br>".$vysledek['CisloKnihy']." - ".$vysledek['NazevKnihy']." - ".$vysledek['Autor']."<br>";
  }
}
?>

Celý kód vypadá takto:

<?php
    $server   = "localhost";
    $uzivatel = "xy";
    $heslo    = "xy";
    $databaze = "xy";
//  Krok 1: Vytvoření připojení
    $spojeni  = mysqli_connect($server, $uzivatel, $heslo, $databaze);
    if(!$spojeni)
    {
      echo 'Spojení s mysql serverem se nepodařilo navázat.<br>';
    }
    else
    {
      echo 'Spojení s mysql serverem bylo úspěšně navázáno.<br>';
//  Krok 2: Sestavení a odeslání dotazu
      mysqli_set_charset($spojeni, "utf8");
      $dotaz = mysqli_query($spojeni, "SELECT * FROM knihy");
      if(!$dotaz)
      {
        echo 'Dotaz vykazuje chybu.<br>';
      }
      else
      {
        echo 'Dotaz byl úspěšně vykonán.<br>';
//  Krok 3: Zpracování výsledku dotazu
        while($radek = mysqli_fetch_assoc($dotaz))
        {
          echo
          "Číslo knihy: ".$radek["CisloKnihy"]."<br>".
          "Název knihy: ".$radek["NazevKnihy"]."<br>".
          "Autor: ".$radek["Autor"]."<br><hr>";
        }
      }
    }
//  Krok 4: Odpojení od databáze
    $zavreni = mysqli_close($spojeni);
    if(!$zavreni)
    {
      echo 'Spojení s mysql serverem se nepodařilo ukončit.';
    }
    else
    {
      echo 'Spojení s mysql serverem se podařilo ukončit.';
    }
?>

Pokud chceme seřadit vypsané záznamy podle nějakého kritéria (v tomto případě podle čísel knih od největšího po nejmenší), přidáme k příkazu SELECT následující:

$dotaz = mysqli_query("SELECT * FROM knihy ORDER BY CisloKnihy DESC");

Dále můžeme vypsat např. počet záznamů v tabulce funkcí mysql_num_rows:

$pocet = mysqli_num_rows($dotaz);
echo '<br>Celkový počet záznamů v tabulce je: '.$pocet;

Kompletní zdrojový kód:

<?php
 $server = "localhost";
 $uzivatel = "xy";
 $heslo = "xy";
 $databaze = "xy";
// Krok 1: Vytvoření připojení
 $spojeni = mysqli_connect($server, $uzivatel, $heslo, $databaze);
 if(!$spojeni)
 {
 echo 'Spojení s mysql serverem se nepodařilo navázat.<br>';
 }
 else
 {
 echo 'Spojení s mysql serverem bylo úspěšně navázáno.<br>';
// Krok 2: Sestavení a odeslání dotazu
 mysqli_set_charset($spojeni, "utf8");
 $dotaz = mysqli_query($spojeni, "SELECT * FROM knihy ORDER BY CisloKnihy DESC");
 if(!$dotaz)
 {
 echo 'Dotaz vykazuje chybu.<br>';
 }
 else
 {
 echo 'Dotaz byl úspěšně vykonán.<br>';
// Krok 3: Zpracování výsledku dotazu
 while($radek = mysqli_fetch_assoc($dotaz))
 {
 echo
 "Číslo knihy: ".$radek["CisloKnihy"]."<br>".
 "Název knihy: ".$radek["NazevKnihy"]."<br>".
 "Autor: ".$radek["Autor"]."<br><hr>";
 }
 // výpis celkového počtu knih
 $pocet = mysqli_num_rows($dotaz);
 echo 'Celkový počet záznamů v tabulce je: '.$pocet."<br>";
 }
 }
// Krok 4: Odpojení od databáze
 $zavreni = mysqli_close($spojeni);
 if(!$zavreni)
 {
 echo 'Spojení s mysql serverem se nepodařilo ukončit.';
 }
 else
 {
 echo 'Spojení s mysql serverem se podařilo ukončit.';
 }
?>

SQL příkazy za pomoci ovladače PDO

Protože ovladač mysqli přináší určitá bezpečnostní rizika (především SQL injection), je vhodnější používat ovladač PDO. Zdrojový kód pro vložení dat by pak vypadal takto:

<?php
$servername = "localhost";
$username = "xy";
$password = "xy";
$dbname = "xy";
try {
 $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
 // set the PDO error mode to exception
 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $conn->exec("set names utf8");
 $sql = "INSERT INTO knihy (CisloKnihy, NazevKnihy, Autor)
 VALUES ('4', 'Létající Čestmír', 'Karel Jarolím')";
 // use exec() because no results are returned
 $conn->exec($sql);
 echo "Nová kniha byla vložena";
 }
catch(PDOException $e)
 {
 echo $sql . "<br>" . $e->getMessage();
 }$conn = null;
?>

Zdroj - http://jecas.cz/pdo