260 likes | 370 Views
Návrh a tvorba WWW Přednáška 6. PHP II – Databáze. 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
E N D
Návrh a tvorba WWWPřednáška 6 PHP II – Databáze
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 http://www.mysql.com/.
MySQL a PHP Rozhraní PHP • mysql • mysqli
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.
Rozhraní mysqliII. 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í.
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
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.
Binding (vázání proměnný) Vázání vstupních proměnných • Příprava příkazu • Svázání příkazu a vstupních proměnných • Přiřazení hodnot proměnným • Spuštění příkazu
Binding (vázání proměnný) Vázání výstupních proměnných • Příprava příkazu • Spuštění příkazu • Svázání příkazu a výstupními proměnnými • Načtení dat do výstupních proměnných
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 http://www.sqlite.org/.
SQLite Otevření spojení k databázi SQLite. Argumenty: • název souboru • oprávnění (chmod) • chybová zpráva Uzavření spojení
PDO PDO je rozšíření PHP (od verze 5.1) umožňující jednotným způsobem komunikovat s různými databázemi. PDO podporuje • DBLIB: FreeTDS / Microsoft SQL Server / Sybase • Firebird(http://firebird.sourceforge.net/): Firebird/Interbase 6 • IBM (IBM DB2) • INFORMIX - IBM Informix Dynamic Server • MYSQL (http://www.mysql.com/): MySQL 3.x/4.0 • OCI (http://www.oracle.com): Oracle Call Interface • ODBC: ODBC v3 (IBM DB2 and unixODBC) • PGSQL (http://www.postgresql.org/): PostgreSQL • SQLITE (http://sqlite.org/): SQLite3.x Dostupní na http://www.php.net/manual/en/book.pdo.php.
Příklad PDO Více příkladů např. na http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html#4.3
Oracle DB v PHP Podpora databázového stroje Oracle je zajištěna prostřednictvím extenzí: • Oracle • OCI8 • PDO OracleInstant client (http://www.oracle.com/technetwork/database/features/instant-client/index-097480.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 http://www.oracle.com/us/technologies/026973.pdf
Spojení Otevření spojení Uzavření spojení Změna hesla
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
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.
Insert, delete, update, create, drop Pro vykonání Data DefinitionLanguage (DDL) and Data ManipulationLanguage (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).
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
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
Přiřazení dat Bindingje 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.
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.
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.
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
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