1 / 35

4.4. Web-tietokantaohjelmointi

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.

aya
Download Presentation

4.4. Web-tietokantaohjelmointi

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. <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

  7. <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

  8. 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

  9. 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

  10. HTML-lomake-esimerkki 4-4-WebTK-Ohj Teuhola 2012

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. Syöttöarvot ja tulos 4-4-WebTK-Ohj Teuhola 2012

  25. 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

  26. 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

  27. 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

  28. 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

  29. Lisäyslomake ja palvelimen vastaus 4-4-WebTK-Ohj Teuhola 2012

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

More Related