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 Systém dostupný na
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. mysqli_connect(…) $mysqli = new mysqli(…) mysqli_init(…) $mysqli = new mysqli
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(…)
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(…)
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()
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
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(…)
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
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(…);
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);
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 ( Firebird/Interbase 6 IBM (IBM DB2) INFORMIX - IBM Informix Dynamic Server MYSQL ( MySQL 3.x/4.0 OCI ( Oracle Call Interface ODBC: ODBC v3 (IBM DB2 and unixODBC) PGSQL ( PostgreSQL SQLITE ( SQLite 3.x Dostupní na
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(); }
Oracle DB v PHP Podpora databázového stroje Oracle je zajištěna prostřednictvím extenzí: Oracle OCI8 PDO Oracle Instant client ( Úč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
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);
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);
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);
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);
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);
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); }
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";
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
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
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);
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);