350 likes | 485 Views
4.4. Web-tietokantaohjelmointi. Www-sivut olivat alunperin staattisia , ts. palvelin ylläpiti HTML-kielisiä dokumentteja ja toimitti niitä pyynnöstä selaimille, jotka generoivat fyysisen ulkoasun.
E N D
4.4. Web-tietokantaohjelmointi • Www-sivut olivat alunperin staattisia, ts. palvelin ylläpiti HTML-kielisiä dokumentteja ja toimitti niitä pyynnöstä selaimille, jotka generoivat fyysisen ulkoasun. • Hyvin pian havaittiin tarve dynaamisesti muuttu-ville sivuille, joiden sisältö riippuu sekä selaimen käyttäjän antamista syöteparametreista että sovellusjärjestelmän kulloisestakin tietosisällöstä (jota edustaa yksi tai useampia tietokantoja). 4-4-WebTK-Ohj Teuhola 2012
Dynaamisten sivujen toteutusvaihtoehdot • HTML-koodia voidaan varioida tuottamalla sitä ohjelmallisesti. Ohjelmia kutsutaan skripteiksi. • Kaksi päävaihtoehtoa: • Asiakaspään skriptikielet kuten Javascript suoritetaan selaimessa. Näiden rajoituksena on, että ne eivät (ainakaan suoraan) pääse käsiksi palvelimen tietokantoihin. Skriptien päätarkoitus on käyttöliittymän ja interaktiivisuuden toteutus. • Palvelinpään skriptikielet kuten Perl, PHP, VBscript, JSP, JScript, Ruby on Rails, Python, ... (perinteinen nimitys: CGI-ohjelmointi; ‘Common Gateway Interface’) 4-4-WebTK-Ohj Teuhola 2012
PHP-skriptin idea • Selain kutsuu PHP-skriptiä kuten muitakin sivuja (esim. http://kanta.cs.utu.fi/php.php) ja syöttää (tarvittaessa) parametritietoja. • Www-palvelimeen liittyvä PHP-tulkki tuottaa parametrien sekä samalla tai eri palvelimella olevien tiedostojen, tietokantojen yms. perusteella HTML-sivun dynaamisesti. • ‘Tuottaminen’ tarkoittaa yksinkertaisesti PHP-skriptissä olevia kirjoituskäskyjä, jotka tulostavat laillista HTML-syntaksia (tai selainpään skriptejä) 4-4-WebTK-Ohj Teuhola 2012
Asiakkaan käyttöliittymä(www-lomake) Web-selain HTTP Web-palvelin Sovelluslogiikka (php-skripti) PHP-tulkki+ tietokantafunktiot TKHJ Tietokanta- palvelin Tietokanta PHP:tä käyttävän web-tietokanta-sovelluksen kolmitasoarkkitehtuuri 4-4-WebTK-Ohj Teuhola 2012
Tarkennettu käsittelyn kulku kolmitasoarkkitehtuurissa • Web-selain lähettää pyynnön (=php-skriptin kutsu) palvelimelle, yleensä web-lomakkeeseen pohjautuen. • Web-palvelin välittää kutsun php-tulkille, joka käynnistää skriptin. • Skripti avaa yhteyden tietokantaan (esim. pg_connect()). • Suoritetaan SQL-lauseita (esim. pg_query()). • Poimitaan tulostaulukon rivit (esim. pg_fetch_array()). • Sijoitetaan (esim. echo()-funktiolla) poimitut tietoalkiot tulostettavan HTML-koodin sekaan formatoituina. • Suljetaan tietokantayhteys. • Sivu lähetetään web-palvelimen toimesta selaimelle. 4-4-WebTK-Ohj Teuhola 2012
<HTML> <HEAD> <TITLE> Hoi Maailma </TITLE> </HEAD> <BODY> <H1>Hello World!</H1> What's cooking? </BODY> </HTML> HTML-koodiesimerkki 4-4-WebTK-Ohj Teuhola 2012
<TABLE border=1> <TR> <TD><B>Ano</B></TD> <TD><B>Animi</B></TD> <TD><B>Paikka</B></TD> </TR> <TR> <TD>111</TD> <TD>Aho</TD> <TD>Turku</TD> </TR> <TR> <TD>222</TD> <TD>Elo</TD> <TD>Salo</TD> </TR> </TABLE> HTML-taulukon koodausesimerkki 4-4-WebTK-Ohj Teuhola 2012
XHTML • XML-notaatiota soveltava HTML-versio • Tiukempi syntaksi, mm. aloitus- ja lopetustagien vastattava toisiaan. • Lisää otsikoita • <?xml version=“1.0”?> • <!DOCTYPE html PUBLIC …> • Nimiavaruus (namespace) standardoitu • <html xmlns=http://www.w3.org/1999/xhtml> • [Lähempi tarkastelu sivuutetaan tässä] 4-4-WebTK-Ohj Teuhola 2012
HTML-lomakkeista Vaiheet: • Lomakkeen sisältävän sivun (xxx.html, xxx.htm, xxx.php, tms.) nouto • Lomakkeen täyttö • Lomakkeella olevan painikkeen painaminen • Painikkeeseen liittyvän PHP-sivun kutsu (yyy.php). • PHP-skriptin suoritus palvelimessa. • Skriptin tuottaman HTML-sivun (= painikkeeseen liittyvän vastauksen) siirto selaimelle • Sivun näyttö ruudulla. 4-4-WebTK-Ohj Teuhola 2012
HTML-lomake-esimerkki 4-4-WebTK-Ohj Teuhola 2012
Esimerkkilomakkeen koodi (ml. php-kutsu) <html> <head> <title>Lomake tilauksen lisäystä varten</title> </head> <body> <h3>Uuden tilauksen lisäys</h3> <form method="post" action="LisaaTilaus.php"> <input type="text" size="5" name= "asno"/> Asiakasnumero <br/><br/> <input type="text" size="5" name= "tuno"/> Tuotenumero <br/><br/> <input type="text" size="5" name= "kpl"/> Kappalemäärä <br/><br/> <input type="submit" value="Lisää"/> </form> </body> </html> 4-4-WebTK-Ohj Teuhola 2012
Lomakkeen elementtityyppejä • text = tekstikenttä • textarea = isompi tekstialue • password = salasanakenttä, syöte kätketään • select = valintalista • radio = radionappula; ryhmästä vain yksi valitaan • submit = lomakkeen lähetyspainike • reset = lomakkeen oletusarvojen palautuspainike 4-4-WebTK-Ohj Teuhola 2012
PHP-kielestä • Syntaksi lainattu lähinnä C-kielestä; myös oliopiirteitä • Tulkattava, heikosti tyypitetty kieli • Muuttujat $-alkuisia • Dynaamiset taulukot, indeksointi kokonaisluvuilla tai merkkijonoilla (‘assosiatiivinen’ taulukko) • Kontrollirakenteet: muistuttavat C-kielen vastaavia, lisäksi esim. taulukon läpikäynti • Funktiot: • Operaattorit: aritmeettiset ym.; merkkijonojen katenointi: ‘.’ • Kirjastofunktiot (suuri joukko), esim. merkkijonoille strlen(), strcmp(), split(), join(), str_replace() • Käyttäjän määrittelemät 4-4-WebTK-Ohj Teuhola 2012
HTML-sivun tuottaminen PHP:llä • Skriptin standarditulosvirtaan kirjoittamat merkkijonot siirtyvät tulossivulle. • Kirjoituskäskyjä: • echo (muotoilematon merkkijono) • printf (muotoiltu merkkijono, vrt. C) • Vaihtoehdot: • Skripti tuottaa koko HTML-sivun. • Skripti on upotettu HTML-koodin sekaan ja tuottaa vain lähinnä dynaamiset osat. • Skriptin aloitus- ja lopetussymbolit: <?php … ?> 4-4-WebTK-Ohj Teuhola 2012
Lomakkeen input-parametrien välitys PHP-skriptille Kaksi vaihtoehtoista metodia: • Get: Parametrit koodataan URL-osoitteen yhteyteen (‘?’-merkillä erotettuna) • Post: Parametrit siirretään omana pakettinaan (sopii erityisesti isommille tietomäärille). [Ohjelmoijan riittää valita metodi; välitys hoituu automaattisesti.] 4-4-WebTK-Ohj Teuhola 2012
Lomakkeen input-parametrien välitys PHP-skriptille (jatk.) • Lomakkeen kentät siirtyvät välitysmetodista riippuen joko PHP-skriptin $_POST[]- tai $_GET[]-taulukkoon; indeksointi kentän nimellä. • Esim. HTML-lomakkeella oleva lausejono <form method="post" action="HaeTyontek.php"> … <input type="text" size="5" name="osasto“ /> … </form>tuottaa PHP-skriptiin ‘HaeTyontek.php’ taulukkoalkion $_POST[‘osasto’], joka saa arvokseen käyttäjän ao. kenttään kirjoittaman osastonumeron. 4-4-WebTK-Ohj Teuhola 2012
Istunnon (session) hallinta • Sovellus koostuu usein monesta vaiheesta, joista kukin suoritetaan omalla skriptillään. • Olisi toivottavaa, että aikaisempien vaiheiden tiedot säilyisivät edelleen. • Ongelma: Webissä käytettävä HTTP-protokolla on muistiton. • PHP:n ratkaisu: Kuhunkin sessioon liitetään yksikäsitteinen tunniste, joka kulkee automaattisesti evästeenä (cookie) selaimen ja palvelimen välillä. • Varsinaiset sessiomuuttujat PHP säilyttää palvelimella taulukossa $_SESSION[] ja niihin pääsee käsiksi saman session aikana, indeksinä muuttujan nimi. 4-4-WebTK-Ohj Teuhola 2012
Session hallintaesimerkki: • Session aloitus ja kirjautumistietojen tallennus: <?php session_start(); $_SESSION['tunnus']=$_POST['tunnus']; $_SESSION['salasana']=$_POST['salasana']; echo "Sessio aloitettu, kayttaja = " . $_SESSION['tunnus']; ?> • Session lopetus: <?php session_start(); $nimi = $_SESSION['tunnus']; session_destroy(); echo "Kayttajan " . $nimi . " istunto lopetettu."; ?> 4-4-WebTK-Ohj Teuhola 2012
PHP ja tietokannat • Suora tuki monelle (n. 20) tietokantajärjestelmälle, kuten PostgreSQL, MySQL, IBM DB2, Sybase, ym. • ‘Tuki’ tarkoittaa järjestelmäspesifistä (‘natiivia’) funktio-joukkoa, joka mahdollistaa yhteyden muodostamisen tietokantaan, operaatioiden suorittamisen sekä tulosten poimimisen ja hyödyntämisen dynaamisten www-sivujen generoinnissa. • Uudemmissa PHP-versioissa on myös yleistetty rajapinta PDO = PHP Data Objects, jossa funktiot ovat riippu-mattomia tietokannasta. Tarvitaan PDO-ajuri (vrt. JDBC). 4-4-WebTK-Ohj Teuhola 2012
PHP:n suora tuki PostgreSQL:lle Tärkeimpiä PostgreSQL-spesifisiä funktioita: • pg_connect(): palauttaa ‘yhteysolion’, talletus muuttujaan • pg_query(): SQL-kyselyn suoritus • pg_num_rows(): tulosrivien määrä • pg_fetch_array(): rivin poiminta kyselytuloksesta • pg_fetch_result(): tulosalkion poiminta taulukosta • pg_free_result(): tilan vapautus 4-4-WebTK-Ohj Teuhola 2012
Esimerkkilomake: osaston työntekijöiden haku Company-tietokannasta <html> <head> <title>Lomake osaston työntekijöiden hakuun</title> </head> <body> <h3>Annetun osaston työntekijöiden haku</h3> <form method="post“ action="HaeTyontek.php"> <input type="text" size="5“ name="osasto"/> Osastonumero <br/><br/> <input type="submit" value="Suorita"/> </form> </body> </html> 4-4-WebTK-Ohj Teuhola 2012
Esimerkki PHP-skriptistä: Osaston työntekijöiden haku <!-- Lomakkeella annetun osaston työntekijöiden tulostus --> <html> <head> <title>Osaston työntekijät</title> </head> <body> <?php session_start(); // Tarvitaan session jokaisen skriptin alussa // Otetaan yhteys PostgreSQL-tietokantaan ‘company’ $yhteys = "host=localhost port=5432 dbname=company user=“ . $_SESSION['tunnus'] . " password=" . $_SESSION['salasana']; if (!($conn = pg_connect($yhteys))) die( "Ei saatu yhteytta tietokantaan!" ); // Rakennetaan kyselylauseke $kysely = "SELECT ssn, fname, lname FROM employee"; $kysely .= " WHERE dno=" . $_POST['osasto'] . ";"; if ( !( $tulos = pg_query($conn, $kysely) ) ) die(“Ei onnistu!“); echo "<h3>Osaston “ . $_POST[‘osasto’] . “ työntekijät </h3>"; ?> 4-4-WebTK-Ohj Teuhola 2012
Esimerkki PHP-skriptistä (jatk.) <!-- Tulostaulukon muodostus ja otsikointi --> <table border = "1"> <tr> <td><b>Ssn</b></td> <td><b>Etunimi</b></td> <td><b>Sukunimi<b></td> </tr> <?php // Noudetaan tulosjoukon rivit $riveja = pg_num_rows($tulos); for ($i = 0; $i < $riveja; $i++) { // Tulostetaan yksittäiset rivit echo "<tr>"; for ($j=0; $j<3; $j++) { echo "<td>"; echo pg_fetch_result($tulos, $i, $j); echo "</td>"; } echo "</tr>\n"; } pg_free_result($tulos); pg_close($yhteys); ?> </table> </body> </html> 4-4-WebTK-Ohj Teuhola 2012
Syöttöarvot ja tulos 4-4-WebTK-Ohj Teuhola 2012
PostgreSQL-transaktion hallinta PHP:ssä • Transaktion aloitus:pg_query($conn, “BEGIN WORK;”); • Transaktion vahvistus:pg_query ($conn, “COMMIT;”); • Transaktion peruutus:pg_query ($conn, “ROLLBACK;”); 4-4-WebTK-Ohj Teuhola 2012
Tilauksen lisäys Asiakas-Tuote-Tilauskantaan (ks. lomake s. 333) <html> <head> <title>Lomake tilauksen lisäystä varten</title> </head> <body> <h3>Uuden tilauksen lisäys</h3> <form method="post" action="LisaaTilaus.php"> <input type="text" size="5" name= "asno"/> Asiakasnumero <br/><br/> <input type="text" size="5" name= "tuno"/> Tuotenumero <br/><br/> <input type="text" size="5" name= "kpl"/> Kappalemäärä <br/><br/> <input type="submit" value="Lisää"/> </form> </body> </html> 4-4-WebTK-Ohj Teuhola 2012
Tilauksen lisäävä PHP-skripti <!-- LisaaTilaus.php --> <!-- Lomakkeella annetun tilauksen lisäys til-kantaan--> <html> <head> <title>Tilauksen lisäys</title> </head> <body> <?php session_start(); // Muodostetaan yhteys PostgreSQL-kantaan ‘til’. $yhteys = "host=localhost port=5432 dbname=til user=“ . $_SESSION['tunnus'] . " password=" . $_SESSION['salasana']; if (!($conn = pg_connect($yhteys))) die( "Ei saatu yhteytta tietokantaan!" ); // Aloitetaan transaktio pg_query($conn, "BEGIN WORK;"); 4-4-WebTK-Ohj Teuhola 2012
Tilauksen lisäävä PHP-skripti (jatk.) // Rakennetaan lisäyslause $asno = $_POST['asno']; $tuno = $_POST['tuno']; $kpl = $_POST['kpl']; $pvm = getdate(); // Nykyinen pvm systeemin kellosta $ymd = $pvm['year'] . "-" . $pvm['mon'] . "-" . $pvm['mday']; // formulointi $values = $asno . "," . $tuno . "," . $kpl . ",'" . $ymd . "'"; // Lomakearvot $lause = "INSERT INTO Tilaus VALUES (" . $values . ");"; if ( !( $tulos = pg_query($conn, $lause) ) ) { echo "Lisäys ei onnistunut! <br />"; pg_query($conn, "ROLLBACK;"); } else { echo "Lisatty " . $asno . ", " . $tuno . ", " . $kpl . ", " . $ymd; pg_query($conn, "COMMIT;"); } ?> </body> </html> 4-4-WebTK-Ohj Teuhola 2012
Lisäyslomake ja palvelimen vastaus 4-4-WebTK-Ohj Teuhola 2012
PostgreSQL-lauseiden esiprosessointi ja parametrisointi PHP:llä: Esimerkki <?phpsession_start();// Yhteys til-tietokantaan$yhteys = … ; if (!($conn = pg_connect($yhteys))) die( "Ei saatu yhteytta tietokantaan!" ); // Esiprosessointi; asiakasnimen parametrisointi$tulos = pg_prepare($conn, “as-haku", “SELECT * FROM Asiakas WHERE Animi = $1”);// Valmistellun kyselyn suoritus parametrilla “Aalto”.$tulos = pg_execute($conn, “as-haku", array(“Aalto"));// Saman valmistellun kyselyn suoritus eri parametrilla$tulos = pg_execute($conn, “as-haku", array(“Laine")); ?> 4-4-WebTK-Ohj Teuhola 2012
PHP Data Objects (PDO) • PDO on tietokantajärjestelmästä riippumaton luokkakirjasto (vrt. JDBC), mukana PHP5:stä lähtien, ks. http://fi.php.net/pdo. • Vaatii ajurin, esim. PDO_PGSQL (PostgreSQL). • Yhteyden luonti:new PDO(tietokanta, tunnus, salasana) • PDO-funktioita mm. beginTransaction(), query(), exec(), commit(), rollback(). • Muita luokkia: PDOStatement, PDOException. 4-4-WebTK-Ohj Teuhola 2012
PDO vs. järjestelmäkohtaiset tietokantafunktiot • PostgreSQL: $conn = pg_connect( … ); $result = pg_query($conn, $sql_lause); • MySQL: $conn = mysql_connect( … ); $result = mysql_query($sql_lause); • PDO – soveltuu molempiin järjestelmiin: $conn = new PDO( … ); $st_handle = $conn->query($sql_lause); 4-4-WebTK-Ohj Teuhola 2012
PHP-editoreista • PHP-skriptit voidaan kirjoittaa millä tahansa tekstieditorilla, mutta syntaksintarkistus ja testaus ovat ongelma, koska Web-palvelimen PHP-tulkki ei useinkaan anna mitään selitystä virheen syystä tai sijainnista. • PHP-syntaksin tunnistavia editoreita on tarjolla lukuisa joukko, samoin integroituja kehitys-ympäristöjä (IDE). • Esim. ilmainen PHP Coder, ks.(http://www.phpide.de/). 4-4-WebTK-Ohj Teuhola 2012
Yhteenveto • Huomattava osa tietokantojen käyttöliittymistä tehdään nykyisin web-selainpohjaisina. • Sovelluslogiikka koodataan palvelinpuolen skripteillä, jotka tuottavat dynaamisia HTML-sivuja. • PHP:llä on vahva asema skriptikielten joukossa; siitä löytyy sekä yleinen tietokantarajapinta että erityistuki monille tietokantajärjestelmille. 4-4-WebTK-Ohj Teuhola 2012
Loppuyhteenveto kurssista • Käytännön tietokantatyöskentelyn kannalta kurssin keskeisiä asioita olivat: • Relaatio-operaatiot ja niiden tehokkuus • Käsitetason suunnittelu ja konversio relaatioiksi • Relaatioiden laaduntarkistus, eli redundanssin minimointi ja päivitysongelmien eliminointi • Tiedosto-organisaatioiden ja hakemistojen merkitys tehokkuutta ajatellen • Tietokantasovellusten kehittäminen ohjelmointikielen tasolla ja siihen liittyvät rajapinnat • Web-tietokantojensovellusten erityispiirteet Hyvää kesää! 4-4-WebTK-Ohj Teuhola 2012