Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Návrh a tvorba WWW Cvičení 5

Podobné prezentace


Prezentace na téma: "Návrh a tvorba WWW Cvičení 5"— Transkript prezentace:

1 Návrh a tvorba WWW Cvičení 5
PHP (OOP, DB)

2 OOP v PHP Deklarace třídy Tvorba objektů Construktor, Destruktor
Deklaraci třídy (šablony objektu) provádíme prostřednictvím klíčového slova class, následuje název třídy a ve složených závarkách uvádíme seznam vlastností a metod. Tvorba objektů Instance objektů vytváříme pomocí klíčového slova new. Construktor, Destruktor Při vytvoření instance třídy je alokován v paměti prostor, dojde k vytvoření kopie všech vlastností třídy a je vykonán konstruktor (je-li definován). Destruktor je naopak vykonán v okamžiku kdy je objekt odebrán z paměti. $instance = New MojeTrida(); class MojeTrida { //seznam vlastnost function __construct() { ... } //seznam metod function __destruct() {

3 Metody a vlastnosti objektu
Metody a vlastnosti objektu jsou dostupné prostřednictvím speciální proměnné $this, která je odkazem na objekt. Za tuto proměnou lze pomocí zápisu „-> název“ přistupovat k vlastnostem i metodám objektu. Základními modifikátory pro přístup k vlastnostem a metodám jsou v PHP: public, protected, private. $this->mojeMetoda(); class MojeTrida { public $v = “Veřejný člen”; protected $c = “Chráněný člen”; private $s = “Soukromý člen”; public function vMetoda() { ... } protected function cMetoda() { private function sMetoda() {

4 Statické metody a vlastnosti
Statické metody a vlastnosti nepatří instancím, ale třídám. Deklarují se pomocí klíčového slova static. Dostupné jsou pomocí zápisu „jméno třídy::název vlastnosti/metody“. Uvnitř třídy lze použít identifikátor self. class MojeTrida { static $statickaVlastnost = 0; static function sV1() { self::sV2; } static function sV2() { echo “Statická metoda”; MojeTrida::$statickaVlastnost++; MojeTrida::$sV1();

5 Konstanty třídy Konstanty lze ve třídě definovat pomocí klíčového slova const. Názvy konstant se píši velkými písmeny. Práce s konstatntami je stejná jako s statickými vlastnostmi, nenáleží třídě, ale instanci. Konstanty nelze měnit ani odstranit. class MojeTrida { const BARVA = “modrá”; const CISLO = 1; static function tisk() { echo self::BARVA; } echo MojeTrida::CISLO;

6 Autoload tříd Funkce __autoload() zahrnuje do kódu automatickým způsobem třídy. Aplikace může obsahovat pouze jeden výskyt této funkce. MojeTrida.php autoload.php index.php class MojeTrida { const CISLO = 1; static function tisk() { echo self::CISLO; } function __autoload ($trida) { require_once (“/class/”.$trida.“.php”); } require_once “autoload.php”; MojeTrida::tisk();

7 Oracle DB v PHP Podpora databázového stroje Oracle je zajištěna prostřednictvím extenzí: Oracle OCI8 PDO Oracle Instant client (http://www.oracle.com/technetwork/database/features/instant-client/index html). Účet na DB vám vytvoří cvičící předmětu Databázové systémy 2. The Undeground PHP and Oracle Manual Christopher Jones, Alison Holloway

8 Spojení Otevření spojení Uzavření spojení Změna hesla
$c=oci_connect($username, $password, $dbname, $charset); oci_close($c); oci_password_change($c, $username, $oldPassword, $newPassword);

9 Select Rozebrání příkazu (Parse) – parsování dotazu pro vykonání
Přiřazení dat (Bind) – přiřazení dat do dotazu pro lepší výkon a bezpečnost Vykonání (Execute) – vykonání dotazu Načtení (Fetch) – vrácení výsledku dotazu z databáze $c = oci_connect("hr", "hrpwd", "localhost/XE"); $s = oci_parse($c, 'select city, postal_code from location'); oci_execute($s); print '<table border="1">'; while ($row = oci_fetch_array($s, OCI_NUM+OCI_RETURN_NULLS)) { print '<tr>'; foreach ($row as $item) print '<td>'.htmlentities($item).'</td>'; print '</tr>‘; } print '</table>'; oci_free_statement($s);

10 Zpracování výsledku Parametry pro funkci oci_fetch_array()
Funkce načtení oci_fetch_all() – vrátí výsledek najednou oci_fetch_array() – vrátí výsledek v poli oci_fetch_assoc() – vrátí výsledek v asociativním poli oci_fetch_object() – vrátí výsledek jako objekt oci_fetch_row() – vrátí výsledek v indexovaném poli Parametry pro funkci oci_fetch_array() OCI_ASSOC – vrátí výsledek jako asociativní pole OCI_NUM – vrátí výsledek jako číselně indexované pole OCI_BOTH – vrátí výsledek jako indexované i asociativní pole (výchozí hodnota) OCI_RETURN_NULLS – vrátí PHP NULL hodnotu pro NULL data OCI_RETURN_LOBS – vrátí aktuální LOB data místo OCI- LOB zdroje. $rowarray = oci_fetch_array($statement, $mode); $rowarray = oci_fetch_array($s, OCI_NUM + OCI_RETURN_NULLS);

11 Insert, delete, update, create, drop
Pro vykonání Data Definition Language (DDL) and Data Manipulation Language (DML) dotazů, jako například CREATE, INSERT, atd. je nejjednodušší použít příkaz pro parsování SQL dotazu (oci_parse) a jeho následné vykonání (oci_execute). $s = oci_parse($conn, "create table i1test (col1 number)"); oci_execute($s);

12 Transakce Transakce je logická jednotka zpracování dat, která se skládá z jednoho nebo více SQL příkazů provedených jedním uživatelem. Transakce končí buď úspěšným „commitnutím“, tedy promítnutím změn do databáze, nebo rollbackem, vrácením databáze do původního stavu, resp. neprovedením změn naakumulovaných v průběhu transakce. Funkce související s transakcemi oci_execute($s, OCI_DEFAULT); - bez provedení commitu oci_rollback($c); - vrácení databáze do původního stavu $c = oci_connect('hr', 'hrpwd', 'localhost/XE'); $s = oci_parse($c, "insert into mytable values ('abc')"); oci_execute($s, OCI_DEFAULT); // don't commit $s = oci_parse($c, "begin updatelog('INSERT attempted'); end;"); oci_rollback($c);

13 Obsluha chyb Obsluha chyb je v knihovně OCI řešena funkcí oci_error(). Funkce vyžaduje různé argumenty závisející na kontextu předešlého volání. Návratová hodnota funkce je pole. Prvky pole vrácen funkcí oci_error(): $e["code"] – číslo chyby $e["offset"] – pozice chyby v SQL dotazu $e["message"] – chybová zpráva $e["sqltext"] – SQL dotaz $c = oci_connect("hr", "not_hrpwd", "localhost/XE"); if (!$c) { $e = oci_error(); // No parameter passed var_dump($e); } $s = oci_parse($c, "select city from locations"); $rc = oci_execute($s); if (!$rc) { $e = oci_error($s); // Statement resource passed $rc = oci_fetch_all($s, $results);

14 Přiřazení dat Binding je vysoce doporučovaným prostředkem pro cachování dotazu na databázovém serveru a znovupoužití exekučních plánů. Dále nabízí způsob jak chránit dotazy proti SQL injection. $s = oci_parse($c, "select last_name from employees where employee_id = :eidbv"); $myeid = 101; oci_bind_by_name($s, ":eidbv", $myeid); oci_execute($s); $row = oci_fetch_array($s, OCI_ASSOC); echo "Last name is: ". $row['LAST_NAME'] ."<br>\n";

15 Omezení počtu řádku výsledku (limit)
Oracle nezná klíčové slovo LIMIT a proto je pro omezení počtu řádků výstupu SQL dotazu potřeba použít speciální konstrukci, která prostřednictvím vnořeného selectu toto omezení zprostředkuje. select * from ( select a.*, rownum as rnum from (-- Váš dotaz --) a where rownum <= MAX_ROWS ) where rnum >= MIN_ROWS

16 Omezení počtu řádku výsledku (limit)
Oracle nezná klíčové slovo LIMIT a proto je pro omezení počtu řádků výstupu SQL dotazu potřeba použít speciální konstrukci, která prostřednictvím vnořeného selectu toto omezení zprostředkuje. select * from ( select a.*, rownum as rnum from (-- Váš dotaz --) a where rownum <= MAX_ROWS ) where rnum >= MIN_ROWS

17 Auto-increment Autoinkrementování hodnoty sloupečku tabulky je v prostředí Oracle realizováno prostřednictvím sequence a trigeru. Vytvoření sequence a trigeru Příklad konkrétního použití při konstrukci dotazu acreate sequence myseq; create trigger mytrigger before insert on mytable for each row begin select myseq.nextval into :new.myid from dual; end; $s = oci_parse($c, "insert into mytable (mydata) values ('Hello')"); oci_execute($s);

18 Získání posledního vloženého ID
OCI8 nemá žádnou explicitní funkci “insert_id”, která by vracela poslední vložené ID. Místo toho lze použít RETURN INTO. Obdobně pomocí descriptoru $s = oci_parse($c, "insert into mytable (mydata) values ('Hello') return myid into :id"); oci_bind_by_name($s, ":id", $id, 20, SQLT_INT); oci_execute($s); echo "Data inserted with id: $id\n"; $rid = oci_new_descriptor($c, OCI_D_ROWID); $s = oci_parse($c, "insert into mytable (mydata) values ('Hello') return rowid into :rid"); oci_bind_by_name($s, ":rid", $rid, -1, OCI_B_ROWID); oci_execute($s);

19 Třída FORM zdrojový kód: blok_5/class/Form.php

20 Autoload tříd zdrojový kód: blok_5/c01.php

21 Použití třídy Form v kontaktu
zdrojový kód: blok_5/include/kontakt.php

22 Použití třídy Form v kontaktu I.
zdrojový kód: blok_5/include/kontakt.php

23 Použití třídy Form v kontaktu II.
zdrojový kód: blok_5/include/kontakt.php

24 Domácí úkol Doplňte třídu Form o formulářový prvek výběru (select).

25 Příprava pro práci s DB Vytvořte si tabulku users se sloupci username, password, realname, , description, created. Vytvořte si tabulku s se sloupci id, name, subject, , message, created. Vytvořte si sekvenci a triger pro autoinkremetování hodnoty id pro tabulku s.

26 Napojení na Oracle DB zdrojový kód: blok_5/c02.php

27 Vložení u do DB zdrojový kód: blok_5/include/kontakt2.php

28 Domácí úkol Vytvořte si třídu pro práci s DB Orace.

29 Kontrolní otázky Co je to instance třídy? Co je statická metoda třídy?
K čemu slouží v PHP funkce __autoload()? K čemu slouží knihovna OCI8? Jak omezíme v PHP počet řádků výsledků dotazu do DB? Jak u DB Oracle zajistíme inkrementování hodnoty?


Stáhnout ppt "Návrh a tvorba WWW Cvičení 5"

Podobné prezentace


Reklamy Google