Date post: | 02-Jan-2016 |
Category: |
Documents |
Upload: | ainsley-webb |
View: | 34 times |
Download: | 0 times |
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.
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ých1. Příprava příkazu
2. Svázání příkazu a vstupních proměnných3. 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ých1. 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 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í
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 (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/): SQLite 3.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
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'] . '<br />'; } $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(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 ManualChristopher Jones, Alison Hollowayhttp://www.oracle.com/us/technologies/026973.pdf
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čnost3. Vykonání (Execute) – vykonání dotazu4. 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);
Zpracování výsledku
Funkce načteníoci_fetch_all() – vrátí výsledek najednouoci_fetch_array() – vrátí výsledek v polioci_fetch_assoc() – vrátí výsledek v asociativním polioci_fetch_object() – vrátí výsledek jako objektoci_fetch_row() – vrátí výsledek v indexovaném poli
Parametry pro funkci oci_fetch_array() OCI_ASSOC – vrátí výsledek jako asociativní poleOCI_NUM – vrátí výsledek jako číselně indexované poleOCI_BOTH – vrátí výsledek jako indexované i asociativní pole (výchozí hodnota)OCI_RETURN_NULLS – vrátí PHP NULL hodnotu pro NULL dataOCI_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 transakcemioci_execute($s, OCI_DEFAULT); - bez provedení commituoci_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 commitoci_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'] ."<br>\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);