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

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

Návrh a tvorba WWW Přednáška 6 PHP II – Databáze.

Podobné prezentace


Prezentace na téma: "Návrh a tvorba WWW Přednáška 6 PHP II – Databáze."— Transkript prezentace:

1 Návrh a tvorba WWW Přednáška 6 PHP II – Databáze

2 MySQL Výhody široká komunita uživatelů otevřený zdrojový kód rychlost sytému k dispozici pro mnoho platforem Nevýhody nedostatečný výkon při náročných operacích nepodporuje pokročilé databázové techniky Systém dostupný na

3 MySQL a PHP Rozhraní PHP mysql mysqli

4 Rozhraní mysqli I. Otevření spojení se serverem MySQL. Argumenty: hostitel uživatelské jméno heslo název databáze port TCP unixový doménový soket Inicializace rozhraní MySQLi. Vrací objekt, jenž bude používán společně s funkcí mysqli_real_connect. mysqli_connect(…) $mysqli = new mysqli(…) mysqli_init(…) $mysqli = new mysqli

5 Rozhraní mysqli II. Nastavení předvoleb spojení. Otevření spojení se serverem. Uzavření spojení se serverem. Načtení posledního chybového kódu resp. Zprávy vztahující se k neuskutečněnému spojení. mysqli_options(…) $mysqli->options(…) mysqli_close(…) $mysqli->close(…) mysqli_connect_errno() mysqli_connect_error() mysqli_real_connect(…) $mysqli->real_connect(…)

6 Dotazy Odeslání dotazu na DB server. Argumenty: objekt spojení dotaz režim (s vyrovnávací pamětí, nebo bez ní) Odeslání více dotazů na DB server. Argumenty: objekt spojení dotazy mysqli_query(…) mysqli_multi_query(…) Mysqli->multi_query(…)

7 Zpracování výsledku Zpracování dotazu a načtení řádku výsledku. Zpracování dotazu a načtení výsledku do asociativního pole. Zpracování dotazu a načtení výsledku do objektu. mysqli_fetch_row() $mysqli->fetch_row() mysqli_fetch_assoc() $mysqli->fetch_assoc() mysqli_fetch_object() $mysqli->fetch_object()

8 Binding (vázání proměnný) Vázání vstupních proměnných 1.Příprava příkazu 2.Svázání příkazu a vstupních proměnných 3.Přiřazení hodnot proměnným 4.Spuštění příkazu mysqli_prepare(…) $mysqli->prepare() mysqli_stmt_bind_param(…) $stmt->bind_param(…) mysqli_stmt_execute(…) $stmt->execute

9 Binding (vázání proměnný) Vázání výstupních proměnných 1.Příprava příkazu 2.Spuštění příkazu 3.Svázání příkazu a výstupními proměnnými 4.Načtení dat do výstupních proměnných mysqli_prepare(…) $mysqli->prepare() mysqli_stmt_fetch(…) $stmt->bind_fetch mysqli_stmt_execute(…) $stmt->execute mysqli_stmt_bind_result(…) $stmt->bind_result(…)

10 SQLite Výhody samostatnost, nezávislost součástí PHP 5 jednoduchost a rychlost procedurální i objektové rozhraní Nevýhody neexistence serverového procesoru soubory nejsou binárně bezpečné transakce zamykají soubory Systém dostupný na

11 SQLite Otevření spojení k databázi SQLite. Argumenty: název souboru oprávnění (chmod) chybová zpráva Uzavření spojení sqlite_open(…) $sqlite = new SQLiteDatabase(…) sqlite_close(…);

12 SQLite příklad $dbhandle = sqlite_open('db/test.db', 0666, $error); if (!$dbhandle) die ($error); $query = "SELECT Name, Sex FROM Friends"; $result = sqlite_query($dbhandle, $query); if (!$result) die("Cannot execute query."); $row = sqlite_fetch_array($result, SQLITE_ASSOC); print_r($row); sqlite_rewind($result); $row = sqlite_fetch_array($result, SQLITE_NUM); print_r($row); sqlite_rewind($result); $row = sqlite_fetch_array($result, SQLITE_BOTH); print_r($row); sqlite_close($dbhandle);

14 Příklad PDO Více příkladů např. na PDO.html#4.3 try { $dbh = new PDO("mysql:host='localhost';dbname=mysql", 'username', 'password'); echo 'Spojeno s DB'; $count = $dbh->exec("INSERT INTO people(name, sex) VALUES ('cegan', 'male')"); $sql = "SELECT * FROM people"; foreach ($dbh->query($sql) as $row){ print $row['name'].' - '. $row['sex']. ' '; } $dbh = null; //ukončení spojení } catch(PDOException $e){ echo $e->getMessage(); }

15 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 df

16 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);

17 Select 1.Rozebrání příkazu (Parse) – parsování dotazu pro vykonání 2.Přiřazení dat (Bind) – přiřazení dat do dotazu pro lepší výkon a bezpečnost 3.Vykonání (Execute) – vykonání dotazu 4.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 ' '; while ($row = oci_fetch_array($s, OCI_NUM+OCI_RETURN_NULLS)) { print ' '; foreach ($row as $item) print ' '.htmlentities($item).' '; print ' ‘; } print ' '; oci_free_statement($s);

18 Zpracování výsledku 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);

19 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);

20 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_execute($s, OCI_DEFAULT); // don't commit oci_rollback($c);

21 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 var_dump($e); } $rc = oci_fetch_all($s, $results); if (!$rc) { $e = oci_error($s); // Statement resource passed var_dump($e); }

22 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']." \n";

23 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

24 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

25 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);

26 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);


Stáhnout ppt "Návrh a tvorba WWW Přednáška 6 PHP II – Databáze."

Podobné prezentace


Reklamy Google