Tietokannat2Osa4_5

Download Report

Transcript Tietokannat2Osa4_5

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 muuttuville 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
305
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
306
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 PHPskriptissä olevia kirjoituskäskyjä, jotka tulostavat
laillista HTML-syntaksia (tai selainpään skriptejä)
4-4-WebTK-Ohj
Teuhola 2012
307
PHP:tä käyttävän web-tietokantasovelluksen kolmitasoarkkitehtuuri
Asiakkaan
käyttöliittymä
(www-lomake)
Web-selain
HTTP
Web-palvelin
Sovelluslogiikka
(php-skripti)
PHP-tulkki+
tietokantafunktiot
TKHJ
Tietokantapalvelin
Tietokanta
4-4-WebTK-Ohj
Teuhola 2012
308
Tarkennettu käsittelyn kulku
kolmitasoarkkitehtuurissa
1. Web-selain lähettää pyynnön (=php-skriptin kutsu)
palvelimelle, yleensä web-lomakkeeseen pohjautuen.
2. Web-palvelin välittää kutsun php-tulkille, joka käynnistää
skriptin.
3. Skripti avaa yhteyden tietokantaan (esim. pg_connect()).
4. Suoritetaan SQL-lauseita (esim. pg_query()).
5. Poimitaan tulostaulukon rivit (esim. pg_fetch_array()).
6. Sijoitetaan (esim. echo()-funktiolla) poimitut tietoalkiot
tulostettavan HTML-koodin sekaan formatoituina.
7. Suljetaan tietokantayhteys.
8. Sivu lähetetään web-palvelimen toimesta selaimelle.
4-4-WebTK-Ohj
Teuhola 2012
309
HTML-koodiesimerkki
<HTML>
<HEAD>
<TITLE>
Hoi Maailma
</TITLE>
</HEAD>
<BODY>
<H1>Hello World!</H1>
What's cooking?
</BODY>
</HTML>
4-4-WebTK-Ohj
Teuhola 2012
310
HTML-taulukon koodausesimerkki
<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>
4-4-WebTK-Ohj
Teuhola 2012
311
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
312
HTML-lomakkeista
Vaiheet:
1. Lomakkeen sisältävän sivun (xxx.html, xxx.htm,
xxx.php, tms.) nouto
2. Lomakkeen täyttö
3. Lomakkeella olevan painikkeen painaminen
4. Painikkeeseen liittyvän PHP-sivun kutsu (yyy.php).
5. PHP-skriptin suoritus palvelimessa.
6. Skriptin tuottaman HTML-sivun (= painikkeeseen
liittyvän vastauksen) siirto selaimelle
7. Sivun näyttö ruudulla.
4-4-WebTK-Ohj
Teuhola 2012
313
HTML-lomake-esimerkki
4-4-WebTK-Ohj
Teuhola 2012
314
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
315
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
316
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
317
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
318
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
319
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
320
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
321
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
322
PHP ja tietokannat
• Suora tuki monelle (n. 20) tietokantajärjestelmälle, kuten
PostgreSQL, MySQL, IBM DB2, Sybase, ym.
• ‘Tuki’ tarkoittaa järjestelmäspesifistä (‘natiivia’) funktiojoukkoa, 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 riippumattomia tietokannasta. Tarvitaan PDO-ajuri (vrt. JDBC).
4-4-WebTK-Ohj
Teuhola 2012
323
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
324
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
325
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
326
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
327
Syöttöarvot ja tulos
4-4-WebTK-Ohj
Teuhola 2012
328
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
329
Tilauksen lisäys Asiakas-TuoteTilauskantaan (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
330
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
331
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
332
Lisäyslomake ja palvelimen vastaus
4-4-WebTK-Ohj
Teuhola 2012
333
PostgreSQL-lauseiden esiprosessointi ja
parametrisointi PHP:llä: Esimerkki
<?php
session_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
334
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
335
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
336
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 kehitysympäristöjä (IDE).
• Esim. ilmainen PHP Coder, ks.
(http://www.phpide.de/).
4-4-WebTK-Ohj
Teuhola 2012
337
Yhteenveto
• Huomattava osa tietokantojen käyttöliittymistä
tehdään nykyisin web-selainpohjaisina.
• Sovelluslogiikka koodataan palvelinpuolen
skripteillä, jotka tuottavat dynaamisia HTMLsivuja.
• PHP:llä on vahva asema skriptikielten joukossa;
siitä löytyy sekä yleinen tietokantarajapinta että
erityistuki monille tietokantajärjestelmille.
4-4-WebTK-Ohj
Teuhola 2012
338
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-tietokantojen sovellusten erityispiirteet
Hyvää kesää!
4-4-WebTK-Ohj
Teuhola 2012
339