Tvorba dotazů, datové typy

Top  Previous  Next

Čtení dat z databáze je možné realizovat dvěma způsoby:

 

1. SQL funkce

Vzhledem k tomu, že se naše SQL funkce v průběhu vývoje občas mění, doporučujeme využívat PHP-funkce (mysql_query(), mssql_query(), sql_srv_query(), oci_execute() apod.). Berte ovšem v úvahu často rozdílnou znakovou sadu databáze a KEVISu a nezapomeňte data náležitě zpracovat pomocí funkce iconv()!

 

2. Funkce Kevisu

Pro zjednodušení složitějších dotazů můžete využívat funkci db_select, jejíž využití nejlépe ukážu na příkladu. Základní tabulkou jsou "Osoby", navíc budeme joinovat tři různé tabulky pro demonstraci jednotlivých typů vazeb.

 

  $fields = array(

    "SYS_Klic"     => "Osoby__SYS_Klic",

    "SYS_ID"       => "Osoby__SYS_ID",

    "SYS_Platnost" => "Osoby__SYS_Platnost",

    "Jmeno"        => "Osoby__Jmeno",

    "Prijmeni"     => "Osoby__Prijmeni",

  );

 

  $joins = array(

    // 1. priklad vazby do ciselniku (N:1)

    "C__Ciselnik" => array(

      "table"  => "kes_cishodnota",

      "cond"   => "Osoby.Ciselnik = C__Ciselnik.SYS_ID and ((Osoby.SYS_Platnost_do is null and C__Ciselnik.SYS_Platnost_do is null) or

                  (C__Ciselnik.SYS_Platnost_od<=Osoby.SYS_Platnost_do and (C__Ciselnik.SYS_Platnost_do>=Osoby.SYS_Platnost_do

                  or C__Ciselnik.SYS_Platnost_do IS NULL)))",

      "fields" => array("hodnota" => "Osoby__Ciselnik"),

    ),

 

    // 2. priklad vazby M:N

    "rel_Osoby_Auta_1" => array(

      "table"  => "rel_Osoby_Auta_1",

      "cond"   => "Osoby.SYS_ID = rel_Osoby_Auta_1.ID_1 and (rel_Osoby_Auta_1.SYS_Platnost_od <= Osoby.SYS_Platnost_do and

                   (rel_Osoby_Auta_1.SYS_Platnost_do >= Osoby.SYS_Platnost_do or rel_Osoby_Auta_1.SYS_Platnost_do IS NULL)

                   or (Osoby.SYS_Platnost='1' and rel_Osoby_Auta_1.SYS_Platnost='1'))",

      "fields" => array(),

    ),

    "N__Auta" => array(

      "table"  => "Auta",

      "cond"   => "rel_Osoby_Auta_1.ID_2 = N__Auta.SYS_ID and (N__Auta.SYS_Platnost_od <= Osoby.SYS_Platnost_do and

                   (N__Auta.SYS_Platnost_do >= Osoby.SYS_Platnost_do or N__Auta.SYS_Platnost_do IS NULL)

                   or (Osoby.SYS_Platnost='1' and N__Auta.SYS_Platnost='1'))",

      "fields" => array(

                    "SYS_Klic" => "N__Auta__SYS_Klic",

                    "SYS_ID"   => "N__Auta__SYS_ID",

                    "SYS_CV"   => "N__Auta__SYS_CV",

                    "Znacka"   => "N__Auta__Znacka",

                    "Barva"    => "N__Auta__Barva",

                  ),

    ),

 

    // 3. priklad vazby 1:N

    "N__Hodinky" => array(

      "table"  => "Hodinky",

      "cond"   => "Osoby.SYS_ID = N__Hodinky.Majitel and (N__Hodinky.SYS_Platnost_od <= Osoby.SYS_Platnost_do and

 

                   or (Osoby.SYS_Platnost='1' and N__Hodinky.SYS_Platnost='1'))",

      "fields" => array(

                    "SYS_Klic" => "N__Hodinky__SYS_Klic",

                    "SYS_ID"   => "N__Hodinky__SYS_ID",

                    "SYS_CV"   => "N__Hodinky__SYS_CV",

                    "Znacka"   => "N__Hodinky__Znacka",

                    "Cena"     => "N__Hodinky__Cena",

                  ),

    ),

  );

 

  $where = "Osoby.SYS_Klic > 1";

 

  $order = array(

    "by"  => array("Osoby.SYS_ID", "Osoby.SYS_Klic"),

    "how" => array("asc"         , "desc")

  );

 

  $listovani = array(

    "from"  => 1,

    "count" => 50,

  );

 

  $polozky = vrat_polozky($params, "kes_polozka.id_tabulka='".$params["id_tabulka"]."'", "kes_polozka.poradi asc");

  reset($polozky); $datove_typy = array();

  foreach($polozky as $polozka)

    $datove_typy[$polozka["nazev_polozka"]] = $polozka;

 

  $zaznamy = db_select("Osoby", $fields, $joins, $where, $order, $listovani, $datove_typy);

 

Funkce db_select už v každém případě vrací data ve správné znakové sadě.