OPPITUNTI 11 DBM-funktioiden käyttö

Samankaltaiset tiedostot
OPPITUNTI 16 Tiedon käsittely

OPPITUNTI 20 Tilan tallentaminen istuntofunktioilla

Ohjelmoinnin perusteet Y Python

OPPITUNTI 5 Ohjelman kulku

Ohjelmoinnin perusteet Y Python

8. Oliot 123. Kuinka luokkia luodaan ja olioita saadaan aikaan. Kuinka luodaan ja käsitellään ominaisuuksia ja metodeja

7. Taulukot 105. Kuinka taulukoiden tietoa käsitellään ja lajitellaan

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

OPPITUNTI 3 Ensimmäinen skripti

Ohjelmoinnin perusteet Y Python

ICT1TN004. Lomakkeet. Heikki Hietala

OPPITUNTI 12 MySQL-tietokannan käyttö

Tuotteiden tiedot: Lisää uuden tuotteen tiedot. Muuta tai poista tuotteen tiedot. Selaa kaikkien tuotteiden tietoja.

Ohjelmoinnin perusteet Y Python

OPPITUNTI15 Päivämäärien käsittely

6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

Ohjelmoinnin perusteet Y Python

Tee html-sivu, jossa on yllä olevat kaksi taulukkoa.

OPPITUNTI 21 Palvelinympäristö

OPPITUNTI 10 Tiedostojen käsittely

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Pikaopas. Ohjeiden etsiminen Hae ohjesisältöä napsauttamalla kysymysmerkkiä.

Ohjelmoinnin peruskurssi Y1

OSA III PHP:n käyttö. Oppitunti

Ohjelmoinnin perusteet Y Python

Lomake kannattaa asemoida taulukkoon: table. Silloin selitteet ja kentät saadaan sarakkeisiin. Kenttien ulkoasu voidaan määritellä tyyleillä.

Ohjelmoinnin perusteet Y Python

Palvelinpuolen ohjelmointi

SQL Buddy JAMK Labranet Wiki

Ohjelmoinnin perusteet Y Python

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

VERKKOSOVELLUSTEN OHJELMOINTI, JOHDATUS PHP:HEN

Action Request System

Ohjelmoinnin jatkokurssi, kurssikoe

Harjoitustyö: virtuaalikone

Ohjelmoinnin perusteet Y Python

Suvi Junes/Pauliina Munter Tietohallinto/Opetusteknologiapalvelut 2014

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

OSA II Kieli. Oppitunti. 4. Rakennuslohkot 5. Ohjelman kulku 6. Funktiot 7. Taulukot 8. Oliot

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

Ohjelmoinnin perusteet Y Python

Yhdistäminen. Tietolähteen luominen. Word-taulukko. Tekstinkäsittelyn jatko KSAO Liiketalous 1

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Ohjelmoinnin perusteet Y Python

Tekstinkäsittelyn jatko Error! Use the Home tab to apply Otsikko 1 to the text that you want to appear here. KSAO Liiketalous 1

OPPITUNTI 24 Esimerkki (Osa 2)

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Yhdistäminen. Tietolähteen luominen. Word-taulukko. Joukkokirje, osoitetarrat Työvälineohjelmistot 1(5)

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

OpenOffice.org Base 3.1.0

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmoinnin perusteet Y Python

ECDL Tietokannat. Copyright 2015 ECDL Foundation ECDL Tietokannat Sivu 1 / 7

Joomla pikaopas. Yksinkertainen opas, jossa neuvotaan esimerkkisivuston teko Joomla julkaisujärjestelmällä vaihe vaiheelta.

Hops-ohjaajan ohje Opiskelijan hopsit.

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Sisältö. 2. Taulukot. Yleistä. Yleistä

Tik Tietojenkäsittelyopin ohjelmatyö Tietotekniikan osasto Teknillinen korkeakoulu KÄYTTÖOHJE. LiKe Liiketoiminnan kehityksen tukiprojekti

Tietokannan luominen:

Pedanet oppilaan ohje Aleksanteri Kenan koulu Eija Arvola

ATK tähtitieteessä. Osa 4 - IDL input/output. 19. syyskuuta 2014

Taulukot. 1. Taulukon rakenne: ICT01D Elina Ulpovaara

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Muuttujien määrittely

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Erittäin nopea tapa saada kehitysympäristö php:lle pystyyn Voidaan asentaa muistitikulle

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

Kotisivuohjeet. Eteläpohjalaiset Kylät ry. Sivupohjien rakenne

3.1 Mitä tarkoittaan heredoc? Milloin sitä kannattaa käyttää? Kirjoita esimerkki sen käyttämisestä.

Entiteetit erotetaan muusta tekstistä & ja puolipiste. esim. copyright-merkki näkyy sivulla

LIITE A Vastaukset kysymyksiin

ITKP102 Ohjelmointi 1 (6 op)

Valintanauhan komennot Valintanauhan kussakin välilehdessä on ryhmiä ja kussakin ryhmässä on toisiinsa liittyviä komentoja.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Kun valitset Raportit, Lisää uusi, voit ryhtyä rakentamaan uutta raporttia alusta alkaen itse.

OPPITUNTI 14 Dynaamisten kuvien käsittely

Sisältö. 22. Taulukot. Yleistä. Yleistä

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

PHP:n alkeita ja taustaa. Markus Norrena

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

Ohjelmoinnin perusteet Y Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Sähköpostitilin käyttöönotto

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

RADAR - RANDOM DATA GENERATOR

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssien laaja oppimäärä

OSA I Aloitetaan. Oppitunti. 1. PHP: Kotisivusta portaaliin 2. PHP:n asentaminen 3. Ensimmäinen skriptisi. 17 Johdanto

ITKP102 Ohjelmointi 1 (6 op)

Kangasniemen yrityshakemisto KÄYTTÖOHJE YRITTÄJÄLLE. KANGASNIEMEN KUNTA yrityshakemisto.kangasniemi.fi

Ohjeistus yhdistysten internetpäivittäjille

KServer Etäohjaus Spesifikaatio asiakaspuolen toteutuksille

valitsin on useimmiten html-elementti, jolle tyyli halutaan luoda

Transkriptio:

11. DBM-funktioiden käyttö 193 OPPITUNTI 11 DBM-funktioiden käyttö Jos sinulla ei ole pääsyä SQL-tietokantaan, esimerkiksi MySQL- tai Oracle-tietokantaan, sinulla on varmaankin mahdollisuus käyttää DBM-tyylistä tietokantajärjestelmää. Vaikka järjestelmässäsi ei olisikaan sellaista kirjastoa, PHP voi emuloida sen toimintaa. DBM-funktioiden avulla voidaan tallentaa ja muokata järjestelmän sisällä esiintyviä nimi/arvo-pareja. Vaikka nuo funktiot eivät tarjoakaan samanlaista tehoa kuin SQL-tietokanta, ne ovat hyvin joustavia ja helppokäyttöisiä. Koska formaatti on hyvin yleinen, on funktioita käyttävä koodi yleensä siirrettävää, vaikkakin DBM-tiedostot itse eivät sitä ole. Tämän oppitunnin aiheita ovat seuraavat: Kuinka avata DBM-tietokanta Kuinka lisätä tietoa tietokantaan Kuinka ottaa tietoa esille tietokannasta Kuinka muuttaa ja tuhota kohteita Kuinka tallentaa monimutkaisempaa tietoa DMB-tietokantoihin

194 11. DBM-funktioiden käyttö DBM-tietokannan avaaminen Voit avata DBM-tietokannan funktiolla dbmopen(). Funktio ottaa kaksi argumenttia: polun DBM-tiedostoon ja merkkijonon, joka sisältää avattavaa tietokantaa koskevia lippuja. Funktio palauttaa DBM-tunnisteen, joka voidaan viedä DBM-funktioille, jotka käsittelevät tietokannan tietoa. Koska dbmopen()-funktion käyttöön liittyy tiedostojen lukemista ja tiedostoihin kirjoittamista, tulee PHP-skriptillä olla oikeudet kirjoittaa hakemistoon, jossa tietokanta on. Liput, jotka viet dbmopen()-funktiolle, määrittävät tietokannan käsittelymoodin. Nämä moodit on lueteltu taulukossa 11.1. Taulukko 11.1 Liput, joita dbmopen() käyttää Lippu Selitys r Avataan tietokanta lukemista varten w Avataan tietokanta lukemista ja kirjoittamista varten c Luodaan tietokanta (tai avataan olemassa oleva tietokanta lukemista/kirjoittamista varten) n Luodaan uusi tietokanta (tuhotaan aiempi tietokanta, jos se on olemassa) Seuraava koodi avaa tietokannan luoden uuden tietokannan, jos sitä ei vielä ole olemassa: $dbh = dbmopen( "./data/products", "c" ) or die( "Couldn't open DBM" ); Huomaa, että käytimme die()-lausetta lopettamaan skriptin suoritus, jos tietokannan avaaminen epäonnistuu. Kun lopetat tietokannan käsittelyn, sulje se funktiolla dbmclose(). Sulkeminen tulee tehdä siksi, että PHP lukitsee käsittelyssä olevan tietokannan, jotta muut prosessit eivät voisi muokata sitä silloin, kun sitä luetaan tai siihen kirjoitetaan. Jos tietokantaa ei suljeta, muut prosessit joutuvat odottamaan kauan ennen kuin ne pääsevät kiinni tietokantaan. Dbmclose() ottaa argumentikseen käytössä olevan DBM-tunnisteen: dbmclose ( $dbh ); Tiedon lisääminen tietokantaan Voit lisätä nimi/arvo-pareja avattuun tietokantaan funktiolla dbminsert(), joka ottaa argumenteikseen sopivan DBM-tunnisteen (jonka dbmopen() palauttaa), avaimen nimen ja tallennettavan arvon. Funktio palauttaa arvon 0, jos kaikki on onnistunut, arvon 1, jos alkio on jo tietokannassa, ja arvon -1, jos lisäämisessä tapahtuu virhe (yritetään esimerkiksi kirjoittaa tietokantaan, johon on vain lukuoikeudet). Jos lisättävä alkio on jo olemassa, kirjoitetaan tieto vanhan tiedon päälle. Listaus 11.1 luo ja avaa tietokannan nimeltä products ja lisää siihen hieman tietoa.

11. DBM-funktioiden käyttö 195 Listaus 11.1 Kohteiden lisääminen DBM-tietokantaan 1: <html> 2: <head> 3: <title>listing 11.1 Adding items to a DBM database</title> 4: </head> 5: <body> 6: Adding products now... 7: 8: <?php 9: $dbh = dbmopen( "./data/products", "c" ) or die( "Couldn't open DBM" ); 10: 11: dbminsert( $dbh, "Sonic Screwdriver", "23.20" ); 12: dbminsert( $dbh, "Tricorder", "55.50" ); 13: dbminsert( $dbh, "ORAC AI", "2200.50" ); 14: dbminsert( $dbh, "HAL 2000", "4500.50" ); 15: 16: dbmclose( $dbh ); 17:?> 18: </body> 19: </html> Kaikki arvot muunnetaan merkkijonoiksi, kun ne lisätään tietokantaan, joten koodissa on tuotteiden hinnat lainausmerkeissä; näin numeroarvot ovat siis merkkijonomuodossa. Noita merkkijonoja voidaan kuitenkin käsitellä lukuarvoina, kun ne otetaan tietokannasta. Huomaa myös, että käytämme avaimia, joissa on useampi kuin yksi sana. Jos yritämme nyt kutsua dbminsert()-funktiota samalla avainargumentilla, jota olemme jo käyttäneet, dbminsert() palauttaa arvon 1 eikä tee mitään muutoksia tietokantaan. Joissakin tilanteissa se on aivan sopivaa, mutta joskus voit haluta muuttaa olemassa olevaa tietoa tai luoda uusia elementtejä. Elementtien muuttaminen DBM-tietokannan kohdetta voidaan muuttaa dbmreplace()-funktiolla. Se ottaa argumenteikseen DBMtunnisteen, avaimen nimen ja uuden arvon. Funktio palauttaa arvon 0, jos kaikki menee hyvi,n ja arvon -1, jos virheitä tapahtuu. Listauksessa 11.2 on listauksen 11.1 koodi muutettu siten, että avaimet lisätään huolimatta niiden olemassaolosta.

196 11. DBM-funktioiden käyttö Listaus 11.2. Kohteiden lisääminen ja muuttaminen 1: <html> 2: <head> 3: <title>listing 11.2 Adding or changing items to a DBM database</title> 4: </head> 5: <body> 6: Adding products now... 7: <?php 8: $dbh = dbmopen( "./data/products", "c" ) 9: or die( "Couldn't open DBM" ); 10: dbmreplace( $dbh, "Sonic Screwdriver", "25.20" ); 11: dbmreplace( $dbh, "Tricorder", "56.50" ); 12: dbmreplace( $dbh, "ORAC AI", "2209.50" ); 13: dbmreplace( $dbh, "HAL 2000", "4535.50" ); 14: dbmclose( $dbh ); 15:?> 16: </body> 17: </html> Ainoa muutos oli nyt se, että käytimme funktiota dbmreplace() funktion dbminsert() sijaan. Tiedon lukeminen DBM-tietokannasta Nyt kun osaamme lisätä tietoa tietokantaamme, on meidän pystyttävä myös hakemaan tietoja. Yksittäisen alkion hakemiseen voimme käyttää dbmfetch()-funktiota. Se ottaa argumenteikseen DBM-tunnisteen ja haettavan alkion nimen. Funktio palauttaa arvon merkkijonomuotoisena. Niinpä, jos haluamme käsitellä kohteen Tricorder hintaa, voimme käyttää seuraavaa koodia: $price = dbmfetch( $dbh, "Tricorde" ); Jos Tricorder -sanaa ei ole tietokannassa, dbmfetch() palauttaa tyhjän merkkijonon. Aina et kuitenkaan tiedä kaikkien tietokannan avainten nimiä. Mitä tekisit, jos sinun tulisi tulostaa jokainen tuote ja hinta selaimelle kirjoittamatta tietoja suoraan skriptiisi? PHP tarjoaa mekanismin, jolla voidaan käydä läpi tietokannan jokainen elementti. Ensimmäinen tietokannan avain saadaan esille funktiolla dbmfirstkey(). Se ottaa argumentikseen DBMtunnisteen ja palauttaa ensimmäisen avaimen. Huomaa, että kyseessä ei välttämättä ole ensimmäinen elementti, jonka lisäsit, koska DBM-tietokannat pitävät usein yllä omaa järjestysmenettelyään. Kun olet siepannut ensimmäisen avaimen, voit ottaa esille seuraavat avaimet funktiolla dbmnextkey(). Nytkin

11. DBM-funktioiden käyttö 197 dbmnextkey() vaatii DBM-tunnisteen ja palauttaa elementin avaimen. Yhdistämällä kyseiset funktiot funktion dbmfetch() kanssa voidaankin nyt listata koko tietokanta. Listaus 11.3 tulostaa tietokannan selaimelle. Listaus 11.3 Kaikkien tietueiden lukeminen DBM-tietokannasta 1: <html> 2: <head> 3: <title>listing 11.3 Reading all 4: records from a DBM Database </title> 5: </head> 6: <body> 7: Here at the Impossible Gadget Shop 8: we're offering the following exciting 9: products: 10: <p> 11: <table border=1 cellpadding ="5"> 12: <tr> 13: <td align="center"> <b>product</b></td> 14: <td align="center"> <b>price</b> </td> 15: </tr> 16: <?php 17: $dbh = dbmopen( "./data/products", "c" ) 18: or die( "Couldn't open DBM" ); 19: $key = dbmfirstkey( $dbh ); 20: while ( $key!= "" ) 21: { 22: $value = dbmfetch( $dbh, $key ); 23: print "<tr><td align = \"left\"> $key </td>"; 24: print "<td align = \"right\"> \$$value </td></tr>"; 25: $key = dbmnextkey( $dbh, $key ); 26: } 27: dbmclose( $dbh );

198 11. DBM-funktioiden käyttö 28:?> 29: </table> 30: </body> 31: </html> Kuva 11.1 esittää listauksen 11.3 tulostuksen. KUVA 11.1 Kaikkien tietueiden lukeminen DBMtietokannasta. Kohteen olemassaolo tietokannassa Ennen elementin lukemista tai asettamista on usein hyödyllistä tietää, onko elementti olemassa. Se voidaan saada selville funktiolla dbmexists(), joka ottaa argumenteikseen DBM-tunnisteen ja testattavan elementin nimen. Se palauttaa arvon true, jos elementti on olemassa. if ( dbmexists( $dbh, "Tricorder" ) ) print dbmfetch( $dbh, "Tricorder" ); Kohteen tuhoaminen tietokannasta Voit tuhota kohteen tietokannasta käyttämällä dbmdelete()-funktiota; se ottaa argumenteikseen DBMtunnisteen ja tuhottavan elementin nimen. Funktio palauttaa arvon true, jos tuhoaminen onnistui ja false, jos tuhottavaa elementtiä ei löytynyt. dbmdelete( $dbh, "Tricorder" );

11. DBM-funktioiden käyttö 199 Monimutkaisten tietorakenteiden lisääminen DBMtietokantaan Kaikki DBM-tietokannan tieto otetaan esille merkkijonomuodossa, joten tietokantaan voidaan tallentaa vain kokonaislukuja, merkkijonoja ja desimaalilukuja. Kaikki muut tietotyypit kadotetaan. Kokeilkaamme esimerkiksi taulukolla: $array = array( 1, 2, 3, 4 ); $dbh = dbmopen( "./data/test", "c" ) or die("couldn't open test DBM"); dbminsert( $dbh, "arraytest", $array ); print gettype( dbmfetch( $dbh, "arraytest" ) ); // tulostaa "string" Luomme taulukon ja tallennamme sen muuttujaan $array. Avaamme sitten tietokannan ja yritämme laittaa siihen alkion nimeltä arraytest, jossa on arvona $array-muuttuja. Testaamme sitten dbmfetch()-funktion palauttaman arvon tyypin ja saamme arvoksi string, emmekä Array. Onko taulukoiden tallentaminen siis mahdotonta? Avuksi tulee nyt PHP-ominaisuus, joka mahdollistaa minkä tahansa tietotyypin muuntamisen merkkijonomuotoon. Sitten tieto voidaan tallentaa tietokantaan tai tiedostoon. Tällä tekniikalla voidaan tallentaa taulukoita ja jopa objekteja (olioita) DBM-tietokantaan. Edellisessä esimerkissä olevan taulukon muuntamisessa merkkijonoksi on käytettävä serialize()-funktiota. Se ottaa argumentikseen minkä tahansa tietotyypin ja palauttaa merkkijonon: $array = array( 1, 2, 3, 4 ); print serialize( $array ); // tulostaa a:4:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;} Voimme nyt tallentaa merkkijonon DBM-tietokantaan. Saamme tiedon käyttökelpoiseen muotoon unserialize()-funktiolla; se ottaa argumentikseen sarjoitetun merkkijonon ja palauttaa arvon oikeassa tietotyypissä. Voimme nyt siis tallentaa monimutkaisia tietorakenteita DBM-tietokantojen hyväksymässä, suhteellisen yksinkertaisessa muodossa. Listaus 11.4 sarjoittaa assosiatiivisen taulukon tuoteluettelomme jokaisen alkion suhteen ja lisää tulokset tietokantaan. Listaus 11.4 Monimutkaisen tiedon lisääminen DBM-tietokantaan 1: <html> 2: <head> 3: <title>listing 11.4 Adding complex data to a DBM database</title> 4: </head> 5: <body>

200 11. DBM-funktioiden käyttö 6: Adding complex data to database 7: <?php 8: $products = array( 9: "Sonic Screwdriver" => array( price=>"22.50", 10: shipping=>"12.50", 11: color=>"green" ), 12: "Tricorder" => array( price=>"55.50", 13: shipping=>"7.50", 14: color=>"red" ), 15: "ORAC AI" => array( price=>"2200.50", 16: shipping=>"34.50", 17: color=>"blue" ), 18: "HAL 2000" => array( price=>"4500.50", 19: shipping=>"18.50", 20: color=>"pink" ) 21: ); 22: $dbh = dbmopen( "./data/newproducts", "c" ) 23: or die("couldn't open products DBM"); 24: while ( list ( $key, $value ) = each ( $products ) ) 25: dbmreplace( $dbh, $key, serialize( $value ) ); 26: dbmclose( $dbh ); 27:?> 28: </table> 29: </body> 30: </html> Muodostamme moniulotteisen taulukon, joka sisältää tuotteiden nimet avaimina ja neljä tuotetietotaulukkoa arvoina. Avaamme sitten tietokannan ja silmukoimme taulukon läpi. Kunkin alkion kohdalla viemme tuotenimen ja sarjoitetun tuotetaulukkoversion dbmreplace()-funktiolle. Sitten suljemme tietokannan. Listaus 11.5 sisältää koodia, joka ottaa tuon tiedon esille. Listaus 11.5 Sarjoitetun tiedon palauttaminen DBM-tietokannasta 1: <html> 2: <head>

11. DBM-funktioiden käyttö 201 3: <title>listing 11.5 Retrieving serialized 4: data from a DBM database</title> 5: </head> 6: <body>.black plate (207,1) 7: Here at the Impossible Gadget Shop 8: we're offering the following exciting 9: products: 10: <p> 11: <table border=1 cellpadding ="5"> 12: <tr> 13: <td align="center"> <b>product</b></td> 14: <td align="center"> <b>color</b> </td> 15: <td align="center"> <b>shipping</b> </td> 16: <td align="center"> <b>price</b> </td> 17: </tr> 18: <?php 19: $dbh = dbmopen( "./data/newproducts", "c" ) 20: or die("couldn't open test DBM"); 21: $key = dbmfirstkey( $dbh ); 22: while ( $key!= "" ) 23: { 24: $prodarray = unserialize( dbmfetch( $dbh, $key ) ); 25: print "<tr><td align=\"left\"> $key </td>"; 26: print "<td align=\"left\">$prodarray[color] </td>\n"; 27: print "<td align=\"right\">\$$prodarray[shipping] </td>\n"; 28: print "<td align=\"right\">\$$prodarray[price] </td></tr>\n"; 29: $key = dbmnextkey( $dbh, $key ); 30: } 31: dbmclose( $dbh ); 32:?> 33: </table> 34: </body> 35: </html>

202 11. DBM-funktioiden käyttö Listaus 11.5 on samanlainen kuin listaus 11.3. Nyt esitämme kuitenkin useampia kenttiä. Avaamme tietokannan ja käytämme dbmfirstkey()- ja dbmnextkey()-funktioita käymään läpi tietokannan alkiot. Otamme sitten esille arvon ja käytämme unserialize()-funktiota muodostamaan tuotetaulukkoon. Sitten onkin yksinkertaista tulostaa kukin alkio selaimelle. Kuva 11.2 esitää listauksen 11.5 tulostuksen. KUVA 11.2 Sarjoitetun tiedon palauttaminen DBMtietokannasta Esimerkki Nyt meillä on tarpeeksi tietoa rakentaaksemme esimerkin, jossa luvun tekniikoita hyödynnetään. Tarkoituksemme on kehittää hallintasivu, jonka kautta sivuston ylläpitäjä voi muuttaa tietokannassa olevien tuotteiden hintoja. Tietokanta muodostettiin listauksessa 11.2. Hallintahenkilön tulee pystyä poistamaan alkioita tietokannasta ja lisäämään sinne uusia. Sivua ei pidetä julkisella palvelimella, joten turvallisuus ei ole tämän projektin ongelma. Ensiksi rakennamme lomakkeen, joka yhdistää kaikki tietokannan alkiot. Käyttäjä voi muuttaa mitä tahansa hintaa tekstikentän kautta ja valita tuhottavat alkiot valintaruutujen avulla. Hän voi myös lisätä uuden alkion tietokantaan. Listaus 11.6 esittää koodia, jolla luodaan lomake. Listaus 11.6 DBM-tietokannan mukaisen HTML-lomakkeen luominen 1: <? 2: $dbh = dbmopen( "./data/products", "c" ) 3: or die("couldn't open test DBM"); 4:?> 5: <html> 6: <head> 7: <title>listing 11.6 Building an html form based 8: on content from a DBM database</title> 9: </head> 10: <body> 11: <form action="post">

11. DBM-funktioiden käyttö 203 12: <table border="1"> 13: <tr> 14: <td>delete</td> 15: <td>product</td> 16: <td>price</td> 17: </tr> 18: <?php 19: $key = dbmfirstkey( $dbh ); 20: while ( $key!= "" ) 21: { 22: $price = dbmfetch( $dbh, $key ); 23: print "<tr><td><input type='checkbox' name=\"delete[]\" "; 24: print "value=\"$key\"></td>"; 25: print "<td>$key</td>"; 26: print "<td> <input type=\"text\" name=\"prices[$key]\" "; 27: print "value=\"$price\"> </td></tr>"; 28: $key = dbmnextkey( $dbh, $key ); 29: } 30: dbmclose( $dbh ); 31:?> 32: <tr> 33: <td> </td> 34: <td><input type="text" name="name_add"></td> 35: <td><input type="text" name="price_add"></td> 36: </tr> 37: <tr> 38: <td colspan=3 align="right"> 39: <input type="submit" value="amend"> 40: </td> 41: </tr> 42: </table> 43: </form> 44: </body>

204 11. DBM-funktioiden käyttö 45: </html> Aloitamme avaamalla tietokannan kuten tavallisesti. Sitten aloitamme HTML-lomakkeen, joka osoittaa suoraan nykyiselle sivulle (PHP:n $PHP_SELF-muuttuja). Kun taulukon otsikot on tulostettu näytölle, käymme läpi tietokannan sisällön dbmfirstkey()- ja dbmnextkey()-funktioilla. Nämä funktiot palauttavat avaimet ja funktion dbmfetch() avulla saamme esille myös arvot. Kunkin rivin ensimmäiseen soluun luodaan valintaruutu. Huomaa, että annamme kaikille niille nimen delete[]. Nimi ohjaa PHP:tä muodostamaan taulukon nimeltä $delete kaikille lähetetyille arvoille, joilla on tuo nimi. Käytämme tietokannan alkion nimeä (joka on muuttujassa $key) kunkin valintaruudun arvona. Kun lomake lähetetään, meillä tulisi olla $delete-taulukko, jossa on kaikkien tuhottavien tietokanta-alkioiden nimet. Sitten tulostamme alkion nimen selaimelle ja luomme toisen tekstikentän. Tämä kenttä esittää tuotteen hinnan käyttäjälle; hinta on muutettavissa. Kenttä nimetään samanlaisella tekniikalla, jota käytimme edellisessä kentässämme. Tällä kertaa laitamme kuitenkin tietokanta-alkion nimeen hakasulkuparin. Nyt PHP muodostaa noista lähetetyistä kentistä assosiatiivisen taulukon nimeltä $prices; taulukon avaimina ovat DBM-alkioiden nimet. Suljemme sitten tietokannan ja palaamme HTML-moodiin tulostamaan loput kentät. Niiden avulla voimme lisätä uuden tuotteen ja hinnan. Vain kaksi kenttää tarvitaan ja annamme niille nimet name_add ja price_add. Kuva 11.3 esittää listauksen 11.6 tulostuksen. KUVA 11.3 HTML-lomake DBMtietokannan pohjalta. Nyt, kun olemme luoneet lomakkeen, meidän tulee kirjoittaa koodi, joka käsittelee käyttäjän antamat tiedot. Se ei ole niin vaikeaa kuin miltä se kuulostaa. Voimme tehdä kolme eri toimintoa. Ensiksi voimme tuhota kaikki kohteet tietokannasta; toiseksi voimme muuttaa tietokannan hintoja ja kolmanneksi voimme lisätä uusia alkioita tietokantaan. Jos lomake on lähetetty, tiedämme, mitkä kohteet tulee tuhota, koska $delete-taulukkomuuttuja on käytettävissä. Meidän tulee käydä tuo taulukko läpi ja tuhota taulukossa mainitut alkiot.

11. DBM-funktioiden käyttö 205 if ( isset ( $delete ) ) { while ( list ( $key, $val ) = each ( $delete ) ) { unset( $prices[$val]); dbmdelete( $dbh, $val ); } } Ensiksi testaamme, että $delete-muuttuja on asetettu. Jos käyttäjä on juuri tullut sivulle tai hän ei ole halunnut tuhota yhtään kohdetta, muuttujaa ei ole olemassa. Jos muuttuja on olemassa, voimme mennä eteenpäin ja käydä taulukon läpi. Kunkin taulukossa olevan merkkijonon kohdalla kutsutaan tällöin dbmdelete()-funktiota poistamaan vastaavan niminen kohde taulukosta. Olemme tekemisissä myös toisen taulukon kanssa: $price-taulukko sisältää kaikki tietokannan avain/arvo-parit, vaikkakin käyttäjä on voinut muuttaa joitakin arvoja. Jos emme poista alkioita, tuhoamme tietokannasta myös $price-taulukon. Seuraava koodilohko lisää ne takaisin tietokantaan. Tietokannan päivittäminen käyttäjän muutosten mukaiseksi voidaan tehdä kahdella eri tavalla. Voisimme päivittää ne alkiot, jotka käyttäjä on valinnut muutettaviksi. Voisimme tehdä niin, jos odottaisimme usean käyttäjän käyttävän skriptiä samaan aikaan. Tällä erää skriptimme on tarkoitettu vain yhden hallintahenkilön käyttöön, joten päädymme päivittämään tietokannan jokaisen alkion: if ( isset ( $prices ) ) { while ( list ( $key, $val ) = each ( $prices ) ) dbmreplace( $dbh, $key, $val ); } Testaamme $prices-taulukon olemassaolon. Sen tulisi sisältää uusi versio koko tietokannasta. Käymme taulukon läpi kutsumalla dbmreplace()-funktiota kunkin elementin kohdalla. Lopuksi tarkistamme, onko käyttäjä lähettänyt uuden tuotteen lisättäväksi tietokantaan: if (! empty( $name_add ) &&! empty( $price_add ) ) dbmreplace( $dbh, "$name_add", "$price_add" ); Sen sijaan, että testaisimme, onko $name ja $price asetettu, testaammekin, ovatko ne tyhjiä. Siinä on merkittävä ero. Kun käyttäjä lähettää lomakkeen, nämä muuttujat asetetaan aina. Ne voivat olla kuitenkin tyhjiä. Emme halua lisätä tyhjiä merkkijonoja tietokantaamme, joten suoritamme lisäämiskoodin vain silloin, kun kumpikaan muuttuja ei ole tyhjä:

206 11. DBM-funktioiden käyttö if (! empty( $name_add ) &&! empty( $price_add ) ) dbmreplace( $dbh, "$name_add", "$price_add" ); Käytämme dbminsert()-funktiota dbmreplace()-funktion sijaan, jotta emme vahingossa kirjoittaisi jo määritellyn alkion päälle. Listaus 11.7 sisältää koko koodin. Listaus 11.7 Tuotteen ylläpitokoodi kokonaisuudessaan 1: <?php 2: $dbh = dbmopen( "./data/products", "c" ) 3: or die("couldn't open test DBM"); 4: 5: if ( isset ( $delete ) ) 6: { 7: while ( list ( $key, $val ) = each ( $delete ) ) 8: { 9: unset( $prices[$val]); 10: dbmdelete( $dbh, $val ); 11: } 12: } 13: 14: if ( isset ( $prices ) ) 15: { 16: while ( list ( $key, $val ) = each ( $prices ) ) 17: dbmreplace( $dbh, $key, $val ); 18: } 19: 20: if (! empty( $name_add ) &&! empty( $price_add ) ) 21: dbminsert( $dbh, "$name_add", "$price_add" ); 22:?> 23: 24: <html> 25: <head>

11. DBM-funktioiden käyttö 207 26: <title>listing 11.7 The complete product maintenance code</title> 27: </head> 28: <body> 29: 30: <form action="<? print $PHP_SELF;?>" action="post"> 31: 32: <table border="1"> 33: <tr> 34: <td>delete</td> 35: <td>product</td> 36: <td>price</td> 37: </tr> 38: 39: <?php 40: $key = dbmfirstkey( $dbh ); 41: while ( $key!= "" ) 42: { 43: $price = dbmfetch( $dbh, $key ); 44: print "<tr><td><input type='checkbox' name=\"delete[]\" "; 45: print "value=\"$key\"></td>"; 46: print "<td>$key</td>"; 47: print "<td> <input type=\"text\" name=\"prices[$key]\" "; 48: print "value=\"$price\"> </td></tr>"; 49: $key = dbmnextkey( $dbh, $key ); 50: } 51: 52: dbmclose( $dbh ); 53:?> 54: 55: <tr> 56: <td> </td> 57: <td><input type="text" name="name_add"></td> 58: <td><input type="text" name="price_add"></td>

208 11. DBM-funktioiden käyttö 59: </tr> 60: 61: <tr> 62: <td colspan=3 align="right"> 63: <input type="submit" value="amend"> 64: </td> 65: </tr> 66: 67: </table> 68: </form> 69: 70: </body> 71: </html> Yhteenveto Tällä tunnilla opit käyttämään PHP:n tehokkaita DBM-funktioita tallentaaksesi ja ottaaksesi esille tietoa. Opit käyttämään dbmopen()-funktiota DBM-tunnisteen saamiseksi; tuota tunnistetta käytetään sitten muiden DBM-funktioiden toimesta. Sait nähdä, kuinka tietokantaan lisätään uutta tietoa dbminsert()-funktiolla ja kuinka tietoa muutetaan dbmreplace()-funktiolla tai tuhotaan dbmdelete()-funktiolla. Opit käyttämään myös dbmfetch()-funktiota tiedon esille ottamiseen. Luvussa olivat esillä myös serialize()- ja unserialize()-funktiot: niillä tallennetaan monimutkaisia tietorakenteita DBM-tietokantaan. Luvun lopussa työstimme esimerkkiä, jossa käytettiin useita uusia tekniikoita. K&V K Milloin minun tulisi käyttää DBM-tietokantaa SQL-tietokannan sijaan? V DBM-tietokanta on hyvä vaihtoehto silloin, kun haluat tallentaa pieniä tietomääriä suhteellisen yksinkertaista tietoa (yleensä nimi/arvo-pareja). Skriptit, jotka käyttävät DBM-tietokantaa, ovat siirrettäviä. Jos aiot tallentaa suuria tietomääriä tai useita kenttitä, harkitse SQL-tietokannan käyttämistä, esimerkiksi MySQL-tietokantaa. Työpaja Työpaja tarjoaa pikakysymyksiä, joiden avulla voit kerrata läpikäytyä materiaalia. Yritä ymmärtää vastaukset ennen kuin jatkat seuraavaan lukuun. Vastaukset annetaan liitteessä A.

11. DBM-funktioiden käyttö 209 Kysymyksiä 1. Millä funktiolla voisit avata DBM-tietokannan? 2. Millä funktiolla voisit lisätä tietueen DBM-tietokantaan? 3. Millä funktiolla voisit korvata tietueen DBM-tietokannassa? 4. Kuinka voisit päästä käsiksi tietueeseen nimen perusteella? 5. Kuinka voisit saada esille ensimmäisen alkion nimen (arvon sijaan)? 6. Kuinka saisit esille peräkkäisten elementtien nimet? 7. Kuinka tuhoaisit nimetyn alkion DBM-tietokannasta? Toiminta 1. Luo DBM-tietokanta, joka pitää kirjaa käyttäjien nimistä ja salasanoista. Luo skripti, joka sallii käyttäjien rekisteröidä nuo tunnisteet. Muista tarkistaa, onko mukana toistuvia arvoja. 2. Luo todennusskripti, joka tarkistaa käyttäjän nimen ja salasanan. Jos käyttäjän syöttö vastaa tietokannan tietoa, anna käyttäjälle erikoisviesti. Muutoin esitä kirjautumislomake käyttäjälle.

210 11. DBM-funktioiden käyttö