PHP a Large Objecty v PostgreSQL



Podobné dokumenty
5. POČÍTAČOVÉ CVIČENÍ

Formuláře. Aby nám mohli uživatelé něco hezného napsat třeba co si o nás myslí!

Návrh a tvorba WWW stránek 1/14. PHP a databáze

1. Webový server, instalace PHP a MySQL 13

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

8.2 Používání a tvorba databází

1 Webový server, instalace PHP a MySQL 13

Bottle -- příklad. Databáze. Testovací data. id Jedinečný identifikátor řádku: Bude typu INT s AUTO_INCREMENT a nastavíme ho jako primární klíč

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

Návrh a tvorba WWW stránek 1/8. Formuláře

Klíčová slova: dynamické internetové stránky, HTML, CSS, PHP, SQL, MySQL,

Použití databází na Webu

Formuláře. Internetové publikování. Formuláře - příklad

Střední odborná škola a Střední odborné učiliště, Hořovice

Střední odborná škola a Střední odborné učiliště, Hořovice

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě

Vstupní požadavky, doporučení a metodické pokyny

MySQLi (objektově) Příklad vytvoření instance třídy včetně parametrů pro připojení: $mysqli = new mysqli('localhost', 'login', 'heslo', 'databaze');

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

PHP. Čtvrtek 8. září. Čtvrtek 15. září. Anonymní test znalostí

Zápisování dat do databáze

DUM 14 téma: Interakce s uživatelem

Jazyk SQL databáze SQLite. připravil ing. petr polách

STŘEDNÍ ŠKOLA INFORMAČNÍCH TECHNOLOGIÍ A SOCIÁLNÍ PÉČE

Databázové systémy. Cvičení 6: SQL

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Tvorba WWW stránek. přehled technologií používaných na webu principy jednotlivých technologií a možnosti jejich vzájemného kombinování

6. blok část C Množinové operátory

17. července :51 z moravec@yahoo.com

4. lekce Přístup k databázi z vyššího programovacího jazyka

Ing. Přemysl Brada, MSc., Ph.D. Ing. Martin Dostal. Katedra informatiky a výpočetní techniky, FAV, ZČU v Plzni

Inovace a zkvalitnění výuky prostřednictvím ICT Tvorba webových stránek. Ing. Zelinka Pavel Číslo: VY_32_INOVACE_35 17 Anotace:

Internet cvičení. ZS 2009/10, Cvičení 4., PHP. Tomáš Pop. DISTRIBUTED SYSTEMS RESEARCH GROUP

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Koláčky, sezení. Martin Klíma

Testování webových aplikací Seznam.cz

Obsah. Úvodem 9. Kapitola 1 Než začneme 11. Kapitola 2 Dynamické zobrazování obsahu 25. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika

SQL - trigger, Databázové modelování

Internet cvičení. ZS 2009/10, Cvičení 3., Tomáš Pop. DISTRIBUTED SYSTEMS RESEARCH GROUP

Semestrální práce z DAS2 a WWW

Databázové a informační systémy Informační systém prodejny nábytku. Jakub Kamrla, KAM087

Databáze II. 1. přednáška. Helena Palovská

AUTOMATICKÉ ŘÍZENÍ S INTERNETOVOU KOMUNIKACÍ V PHP Automatic Control with Internet Communication in PHP

Programování v jazyku C# II. 5.kapitola

Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

VISUAL BASIC. Práce se soubory

Databázové systémy. Doc.Ing.Miloš Koch,CSc.

PHP tutoriál (základy PHP snadno a rychle)

WWW technologie. HTTP protokol

Typy souborů ve STATISTICA. Tento článek poslouží jako přehled hlavních typů souborů v programu

II. Elektronická pošta

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

Protokol HTTP 4IZ228 tvorba webových stránek a aplikací

Jak vytvořit nebo předělat vlastní motiv pro SunLight CMS

Django Urls, views, templates

Střední odborná škola a Střední odborné učiliště, Hořovice

Databázové systémy Cvičení 5

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Slučování tabulek. Sloučení dvou tabulek

Střední odborná škola a Střední odborné učiliště, Hořovice

Databázové aplikace pro internetové prostředí PHP úvod, základní princip, vkládání skriptu, komentáře, výpis na obrazovku

Střední odborná škola a Střední odborné učiliště, Hořovice

Databáze MS-Access. Obsah. Co je to databáze? Doc. Ing. Radim Farana, CSc. Ing. Jolana Škutová

Současný svět Projekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámci Operačního programu Praha adaptabilita

Oracle XML DB. Tomáš Nykodým

Programování v Pythonu

Uživatelský manuál k prodejní aplikaci věrnostního systému Nestlé

Jak získat, instalovat a správně aktivovat produkty, které firma Autodesk zdarma nabízí studentům středních a vysokých škol?

Databázové systémy úvod

Aplikační vrstva. Úvod do Php. Ing. Martin Dostal

Databázové systémy a SQL

Vzorová úloha 1: Prokažte znalosti aplikace Microsoft Access na zvolené ukázkové databázi.

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Nové jazykové brány do Caché. Daniel Kutáč

Embedded SQL v C/C++ úvod. Administrace Oracle Kateřina Opočenská

KIV/ZIS cvičení 5. Tomáš Potužák

Dokumentace k nevizuálnímu rozhraní aplikace DopisOnline

ANOTACE vytvořených/inovovaných materiálů

PG 9.5 novinky ve vývoji aplikací

rychlý vývoj webových aplikací nezávislých na platformě Jiří Kosek

Po stisku Next se nám objeví seznam dostupných tříd (naše zkompilovaná třída User.KBI), viz následující obrázek.

Návod pro práci s SPSS

Zabezpečení proti SQL injection

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

Popis XML rozhraní Veřejného webu RŽP

VÝVOJ INTERNETOVÝCH APLIKACÍ - VIA

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

1. Úvod do Ajaxu 11. Jak Ajax funguje? 13

NÁVRH A TVORBA HUDEBNÍ DATABÁZE

MS SQL Server 2008 Management Studio Tutoriál

Příloha 6. Palety nástrojů

Úvod do PHP s přihlédnutím k MySQL

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Maturitní témata z předmětu PROGRAMOVÉ VYBAVENÍ pro šk. rok 2012/2013

Zabezpečení proti SQL injection

Základy PERLu snadno a rychle

Transkript:

PHP a Large Objecty v PostgreSQL Pavel Janík ml. http://www.janik.cz

PHP a Large Objecty v PostgreSQL 1 Jazyk PHP je velmi mocným jazykem pro vývoj webových aplikací. Má podporu snad všech velkých i menších databází, a tak nás nemůže překvapit, že podporuje snad všechny aspekty práce s databází PostgreSQL. Téměř všechny proto, že zatím nepodporuje např. práci s poli v databázi. Podpora Large Objectů je ovšem skoro dokonalá. Jméno všech funkcí určených pro komunikaci s databází PostgreSQL začíná písmeny PG_. Stejně je tomu tak i u sedmi funkcí určených pro práci s Large Objecty: PG_LoCreate, PG_LoUnlink, PG_LoOpen, PG_LoClose, PG_LoRead, PG_LoWrite a PG_LoReadAll. Téměř všechny tyto funkce si ukážeme na praktickém příkladě. V databázovém serveru PostgreSQL si vytvoříme pokusnou databázi test : CREATE DATABASE test; a v ní tabulku image, která bude obsahovat čtyři sloupečky. První bude jednoznačným identifikátorem záznamu (id), druhý bude obsahovat jméno obrázku (name), třetí MIME typ obrázku (mime_type) a čtvrtý bude obsahovat ukazatel na Large Object (l_oid): CREATE TABLE image (id SERIAL, name TEXT, mime_type TEXT, l_oid OID); Data do této tabulky je možno vkládat přímo z řádkového klienta psql, např. takto: INSERT INTO image(name, mime_type, l_oid) VALUES ( logo.gif, image/gif, lo_import( /usr/src/linux/documentation/logo.gif )); Do tabulky image jsme vložili obrázek se jménem logo.gif. Funkce lo_import vrací identifikátor Large Objectu, a proto jsme ji využili přímo v příkazu INSERT. Máme také možnost si ověřit správné provedení našeho příkazu podíváme se, jaká data byla vložena do tabulky image a jaké Large Objecty jsou v databázi test uloženy: test=# SELECT * FROM image; id name mime_type l_oid ----+----------+-----------+------- 1 logo.gif image/gif 19810 (1 row) test=# \lo_list Large objects Owner ID Description -------+-------+------------- pavel 19810 (1 row) test=# Vidíme, že vše proběhlo v pořádku, a můžeme tedy začít s prací v jazyce PHP. Postupně vytvoříme tři skripty. První z nich (list.php) bude zobrazovat data v tabulce image, druhý (show.php) bude zobrazovat konkrétní obrázek a poslední (new.php) bude sloužit k zadání nového obrázku. Vzhledem k tomu, že již máme v tabulce jeden záznam, můžeme začít se skriptem list.php: 1: <? 2: /* 3: * Demonstrační skript pro zobrazení obsahu tabulky image v PostgreSQL. 4: * 5: * Vstupy: žádné. 6: */ 7: /* Navázání spojení s databází test na lokálním PostgreSQL. */ 8: @$connection = PG_Connect("","","","","test");

PHP a Large Objecty v PostgreSQL 2 9: /* Ošetření chybového stavu. */ 10: if (!$connection) { 11: echo "Spojení s DB serverem PostgreSQL se nepodařilo navázat."; 12: exit; 13: } 14: /* Požádáme databázi o obsah tabulky image. */ 15: @$result = PG_Exec($connection, "SELECT * FROM image ORDER BY id"); 16: /* Ošetření chybového stavu. */ 17: if (!$result) { 18: echo "Databázový server nezpracoval dotaz správně."; 19: exit; 20: } 21: /* Zobrazíme všechny řádky dotazu. */ 22: for ($i=0; $i<pg_numrows($result); $i++) { 23: $record = PG_Fetch_Array($result,$i); 24: echo <A HREF="show.php?id=.$record["id"]. ">.$record["id"]. </A> ; 25: echo " ".$record["name"]." ".$record["mime_type"]; 26: echo " ".$record["l_oid"]."\n<br>"; 27: } 28:?> Řádky skriptu jsou očíslovány, abychom se na ně mohli lépe odkazovat v následujícím popisu. Na řádku s číslem 8 se pokusíme spojit s naší databází. Pokud spojení selže, vypíšeme pouze chybovou stránku a skončíme. Na řádku 15 je uveden SQL příkaz, pomocí kterého zjistíme všechny záznamy v tabulce image seřazené podle jednoznačného identifikátoru. Opět, pokud se dotaz nepodaří provést dobře, vypíšeme pouze chybovou zprávu a skončíme. Na řádcích 21 až 27 pouze vypisujeme jednotlivé záznamy z tabulky s tím, že každý záznam ukazuje na skript show.php, který ale ještě budeme muset vytvořit :-) Výstup našeho skriptu může např. vypadat následovně: 1 logo.gif image/gif 19810 2 redhat.jpg image/jpeg 19841 Samozřejmě první čísla na řádku jsou odkazy na skript show.php, který již pro nás bude zajímavější. Ukážeme si v něm, jak se v PHP pracuje s Large Objecty. Konkrétně jak docílit přečtení Large Objectu z databáze. Skript show.php budeme volat s parametrem id, který bude ukazovat na stejnojmenný sloupeček v tabulce image. Odkazy na něj tedy budou typu např. show.php?id=1. Skript show.php tedy bude vypadat takto: 1: <? 2: /* 3: * Demonstrační skript pro zobrazení obrázku v PostgreSQL. 4: * 5: * Vstupy: $id - stejnojmenné pole z tabulky image. 6: */ 7: /* Navázání spojení s databází test na lokálním PostgreSQL. */ 8: @$connection = PG_Connect("","","","","test"); 9: /* Ošetření chybového stavu. */ 10: if (!$connection) { 11: echo "Spojení s DB serverem PostgreSQL se nepodařilo navázat."; 12: exit; 13: } 14: /* Požádáme databázi o obsah tabulky image. */ 15: @$result = PG_Exec($connection, 16: "SELECT mime_type,l_oid FROM image WHERE id=$id"); 17: /* Ošetření chybového stavu. */ 18: if (!$result) { 19: echo "Databázový server nezpracoval dotaz správně."; 20: exit; 21: }

PHP a Large Objecty v PostgreSQL 3 22: /* Zapamatujeme si MIME typ a identifikátor Large Objectu. */ 23: $record = PG_Fetch_Array($result,0); 24: $mime_type=$record["mime_type"]; 25: $l_oid=$record["l_oid"]; 26: /* Načteme a pošleme prohlížeči správnou hlavičku a obrázek. */ 27: PG_Exec($connection, "BEGIN"); 28: $handle = PG_LoOpen ($connection, $l_oid, "r"); 29: Header("Content-type: ".$mime_type); 30: PG_LoReadAll($handle); 31: PG_LoClose ($handle); 32: PG_Exec($connection, "COMMIT"); 33:?> Začátek skriptu je téměř shodný se skriptem list.php, vytvoříme si spojení s databází. Na řádku 15 a 16 je uveden SQL dotaz, který nám zjistí MIME typ a identifikátor Large Objectu s naším obrázkem. Pro nás zajímavé jsou řádky 26 až 32, kde jsou uvedeny příkazy pro práci s Large Objecty. Příkazy pro práci s Large Objecty v PHP musí být uzavřeny v transakci, a proto jsou kolem příkazů pro práci s Large Objecty SQL příkazy BEGIN a COMMIT. S Large Objecty se v PHP pracuje téměř stejně jako se soubory nejprve je nutné objekt otevřít a po vlastních operacích s ním je nutno jej zase zavřít. Stejně jako funkce fopen(), která se používá k otevření souboru, vrací deskriptor souboru, vrací funkce PG_LoOpen ukazatel na otevřený objekt. Tento ukazatel se potom používá k identifikaci Large Objectu v PHP. Prvním argumentem funkce PG_LoOpen je odkaz na spojení s databází, druhý argument je identifikátor Large Objectu v naší databázi (viz výstup příkazu \lo_list výše). Poslední argument říká funkci PG_LoOpen, v jakém módu chceme Large Object otevřít. V našem případě budeme tento objekt pouze číst, a proto je zde uvedeno "r". Pokud bychom chtěli do Large Objectu i zapisovat, museli bychom použít buď "rw" (pro čtení i zápis) nebo "w" (pouze zápis). Řádek 29 vypisuje HTTP hlavičku identifikující typ obrázku, který budeme posílat. Vlastní MIME typ obrázku jsme získali prvním SQL dotazem (viz řádek 16). Na řádku 30 přečteme kompletní Large Object a vypíšeme jej na výstup skriptu show.php. To vše za nás udělá funkce PG_LoReadAll. Na řádku 31 Large Object opět uzavřeme. Celou funkci skriptu show.php tedy můžeme shrnout do dvou bodů zaslání správné HTTP hlavičky Content-type a vlastního obrázku pomocí volání funkce PG_LoReadAll. Nyní tedy ještě musíme vyřešit zadávání nových obrázků do tabulky image. K tomu využijeme vlastnosti všech prohlížečů (resp. jazyka HTML a formulářů). Vytvoříme si HTML stránku new.html, která bude obsahovat pouze jediný formulář: <FORM ENCTYPE="multipart/form-data" ACTION="new.php" METHOD=POST> <INPUT name="obrazek" ACCEPT="image/*" TYPE="file"> <INPUT TYPE=SUBMIT VALUE="Ulož obrázek"> </FORM> V tomto formuláři je pouze jedno vstupní pole typu file, uživatel tedy může vybrat soubor, který do něj vloží. Položka ACTION formuláře ukazuje na skript new.php, jenž ještě vytvoříme: 1: <? 2: /* 3: * Demonstrační skript pro uložení obrázku v PostgreSQL. 4: * 5: * Vstupy: $Obrazek - soubor poslaný ze stránky new.html. 6: */ 7: /* Navázání spojení s databází test na lokálním PostgreSQL. */ 8: @$connection = PG_Connect("","","","","test"); 9: /* Ošetření chybového stavu. */ 10: if (!$connection) { 11: echo "Spojení s DB serverem PostgreSQL se nepodařilo navázat."; 12: exit; 13: } 14: /* Načteme celý obrázek do proměnné $contents. */

PHP a Large Objecty v PostgreSQL 4 15: $fd = fopen($obrazek, "r"); 16: $contents = fread ($fd, $Obrazek_size); 17: fclose ($fd); 18: /* Uložíme obrázek do databáze jako Large Object. */ 19: PG_Exec($connection, "BEGIN"); 20: $l_oid = PG_LoCreate($connection); 21: $handle = PG_LoOpen($connection, $l_oid, "w"); 22: PG_LoWrite($handle, $contents); 23: PG_LoClose($handle); 24: PG_Exec($connection, "COMMIT"); 25: /* Zapíšeme záznam o obrázku do tabulky image. */ 26: @$result = PG_Exec($connection, 27: "INSERT INTO image(name,mime_type,l_oid) 28: VALUES( $Obrazek_name, $Obrazek_type,$l_oid)"); 29: /* Ošetření chybového stavu. */ 30: if (!$result) { 31: echo "Databázový server nezpracoval dotaz správně."; 32: exit; 33: } 34:?> 35: <A HREF="list.php">list.php</A> Zadání obrázku tedy probíhá tak, že uživatel na stránce new.html vybere nějaký obrázek a stiskne tlačítko s nápisem Ulož obrázek. Jeho prohlížeč potom odešle formulář na adresu uvedenou v položce ACTION. Touto adresou je právě náš skript new.php, který dostane na svém vstupu několik informací o tom, jaký soubor byl poslán apod. Tyto informace jsou uloženy v proměnných, jejichž jméno začíná řetězcem, který byl ve formuláři na stránce new.html uveden v položce name vstupního pole typu file (v našem případě Obrazek). Proměnná $Obrazek obsahuje jméno dočasného souboru, který je identickou kopií souboru zadaného uživatelem do formuláře. Proměnná $Obrazek_name obsahuje původní jméno obrázku na počítači uživatele. V proměnné $Obrazek_type je uložen MIME typ obrázku a proměnná $Obrazek_size obsahuje velikost souboru v bytech. Tyto informace využijeme v další práci s obrázkem. Na řádcích 15 až 17 si načteme celý soubor do proměnné $contents, aby se nám s ním posléze lépe pracovalo. Na řádcích 19 až 24 tento soubor uložíme do databáze jako Large Object a identifikátor tohoto Large Objectu si zapamatujeme v proměnné $l_oid. Před tím, než objekt do databáze uložíme, musíme vytvořit nový Large Object (PG_LoCreate) a otevřít jej pro zápis (PG_LoOpen s posledním argumentem "w"). Vlastní zápis je proveden pomocí funkce PG_LoWrite. Large Object musíme samozřejmě stejně jako při čtení uzavřít. Veškerá práce s Large Objecty musí být v PHP uzavřena do transakce stejně jako u čtení. Po ukončení řádku 24 máme náš obrázek uložen jako Large Object v databázi. Nyní musíme ještě zapsat záznam o tomto objektu do naší tabulky image (viz řádky 26 až 28). Na posledním řádku souboru new.php ještě vypíšeme odkaz na stránku s výpisem tabulky image. Nyní již máme všechny skripty připraveny k použití a můžeme je vyzkoušet v praxi. Tyto skripty jsou samozřejmě demonstrační a pro opravdové nasazení je třeba ještě ošetřit další chybové stavy (např. nedostatek místa pro uložení Large Objectu apod). Z výše zmíněných funkcí pro podporu Large Objectů v PHP jsme si neukázali funkci PG_LoRead, která slouží k přečtení přesně daného počtu bytů (resp. maximálně daného počtu bytů) z Large Objectu. Nevysvětlena zůstala také funkce PG_LoUnlink, která slouží ke smazání Large Objectu z databáze. Doplnění skriptu delete.php tedy necháme na laskavém čtenáři :-) Pokud tento skript napíšete, pošlete nám jej. Shrnutí V tomto článku jsme si ukázali, jak se v jazyce PHP pracuje s Large Objecty uloženými v databázovém serveru PostgreSQL. Příloha Zdrojové kódy všech skriptů a HTML stránek jsou přílohou tohoto článku.

O autorovi PHP a Large Objecty v PostgreSQL 5 Autor je nezávislým konzultantem v oboru informačních technologií, specializuje se na Linux, unixové operační systémy a programování Open Source projektů.