php.jpgJohdatus PHP-kieleen

Sisällysluettelo

JohdantoSyntaksiTietotyypitMuuttujatOperaattoritKontrollirakenteetTaulukotFunktiotLomakkeetTietokantaEvästeetSessiot

www.php.net

PHP ja tietokanta

PHP tukee useimpia tavallisesti käytettyjä tietokantoja. PHP:n omien tietojen mukaan se tukee tällä hetkellä seuraavia tietokantoja:

Adabas D Ingres Oracle (OCI7 and OCI8)
dBase InterBase Ovrimos
Empress FrontBase PostgreSQL
FilePro(read-only) mSQL Solid
Hyperwave Direct MS-SQL Sybase
IBM DB2 MySQL Velocis
Informix ODBC Unix dbm

Tällä sivulla käytetään tietokantayhteyden käsittelyyn esimerkkinä MySQL-tietokantaa.

MySQL ylös

MySQL on hyvin yleisesti WWW-sovelluksissa käytetty ilmainen tietokanta. Ilmainen tietokanta tarkoittaa tässä tapauksessa GPL lisenssiä, jonka mukaan sitä saa käyttää vapaasti, mutta sitä ei saa levittää kaupallisesti. MySQL on saatavina useille eri käyttöjärjestelmille ja on ilmaiseksi ohjelmaksi kohtuullisen hyvin tuotteistettu.

MySQL on käytännössä todettu nopeaksi ja soveltuu yksinkertaisiin www-sovelluksiin. Sen rajoitteena on joidenkin vaativissa järjestelmissä tietokannalta vaadittavien ominaisuuksien puuttuminen. Lisätietoa MySQL tietokannasta löytyy osoitteesta www.mysql.com.

Tietokantayhteyden luominen ylös

Ensimmäisenä tietokantaa käytettäessä täytyy muodostaa yhteys tietokantaan. Yhteys MySQL-kantaan PHP:ssä muodostetaan mysql_connect()-funktiolla. Se muodostaa ainoastaan TCP-yhteyden MySQL-palvelimelle. Funktiolle annetaan tavallisesti parametreina MySQL-palvelimen URL, käyttäjätunnus ja salasana. Se palauttaa onnistuessaan kahvan avattuun tietokantayhteyteen ja epäonnistuessaan false. Alla on esimerkki funktion kutsusta.

$yhteys = mysql_connect("palvelin.it.jyu.fi", "Tunnus", "password");

Parametreja ei ole pakko antaa. Oletussalasana on tyhjä ja tunnuksena on skriptiä suorittavan prosessin omistaja. Oletuksena URL on "localhost:3306". MySQL-palvelin kuuntelee oletuksen porttia 3306 ja myöskin mysql_connect()-funktio ottaa oletuksena yhteyden samaan porttiin. Porttia ei siis tavallisesti ole pakko määritellä, ellei MySQL-palvelimen asetuksissa ole porttia muutettu. Lisätietoa yhteyden muodostamisesta voit katsoa tästä (linkki php.net sivustolle).

Tietokannan valitseminen ylös

Kun tietokantapalvelimelle on saatu yhteys, valitaan tietokanta, jota halutaan käyttää. Tämä tapahtuu mysql_select_db()-funktiolla alla olevan esimerkin mukaisesti.

$yhteys = mysql_connect("palvelin.it.jyu.fi", "Tunnus", "password") 
  or die("Kantaan ei saatu yhteyttä: ".mysql_error());
mysql_select_db("kannan_nimi", $yhteys)
  or die("Kantaa ei saatu valittua: ".mysql_error());

Esimerkin mukaisesti mysql_select_db()-funktiolle annetaan parametreinä käytettävän tietokannan nimi ja aiemmin avatun tietokantayhteyden kahva. Tietokantayhteyden kahvaa ei ole pakko määritellä. Oletuksena funktio käyttää viimeisenä avatun tietokantayhteyden kahvaa. Funktio palauttaa onnistumisen mukaan palautusarvona joko true tai false. Epäonnistuminen tapahtuu esimerkiksi siinä tapauksessa, että nimettyä tietokantaa ei ole tai yhteyden muodostuksessa määritellyllä käyttäjällä ei ole oikeutta käyttää sitä.

Edellä olevassa esimerkissä on käytetty virheen käsittelyyn or-operaattoria ja die()-funktiota. Ilmaisu tarkoittaa sitä, että funktion palauttaessa epätoden arvon, suoritetaan or-operaattorin jälkeen määritelty funktio. Esimerkissä käytetty die()-funktio tulostaa sille parametrina annetun merkkijonon ja lopettaa koko sivun suorituksen siihen. Huom! Todellisessa skriptissä on muistettava die()-funktiossa tulostaa virheilmoituksen perään sivun rakenteen vaatimat XHTML:n lopetuselementit. Esim.

... die("Tuli virhe: ".mysql_error()."</div></body></html>")

Edellisissä esimerkeissä on käytetty mysql_error()-funktiota. Se palauttaa aina merkkijonon edellisestä MySQL-palvelimen lähettämästä virheilmoituksesta. Sen avulla siis voidaan tunnistaa tietokantayhteydessä tapahtuneet virheet. Lopullisessa ohjelmaversiossa on kuitenkin kyseenalaista näyttää käyttäjälle minkäänlaisia virheilmoituksia. Ne voivat usein sisältää tietoturvan kannalta riskialtista tietoa.

Kyselyn tekeminen ylös

Kysely MySQL-tietokantaan toteutetaan mysql_query()-funktiolla. Itse asiassa PHP:ssä useimmat muutkin tietokantaoperaatiot toteutetaan samalla funktiolla. Funktiolle annetaan parametreina SQL-lause ja kahva tietokantayhteyteen. Kahvaa ei ole pakko antaa, jolloin oletuksena käytetään viimeiseksi avattua tietokantayhteyttä. Huom! SQL-lause ei saa loppua puolipisteeseen! Alla on esimerkki tavallisesta valintalauseesta.

$tulos = mysql_query("SELECT * FROM taulu WHERE etunimi like 'Jussi'", $yhteys);

Niissä tapauksissa, joissa mysql_query()-funktion avulla haetaan tietokannasta jotain tietoa, se palauttaa onnistuessaan linkin tulosjoukkoon. Kaikissa muissa tapauksissa palautusarvo on suorituksen onnistumisen mukaan true tai false.

Valintalauseen tulosten käsittely

Valintalauseen tulos on aina suorituksen onnistuessa linkki tulosjoukkoon. Vaikka tietokannasta haettu tieto olisi yksi luku, on muistettava, että mysql_query()-funktion palauttama arvo ei ole luku, eikä sitä voida käsitellä niinkuin lukua. Tulosjoukkoa täytyy aina käsitellä mysql-funktioiden avulla. Alla on esimerkki siitä, kuinka tulosjoukko voidaan käydä läpi.

$yhteys = mysql_connect("palvelin.it.jyu.fi", "Tunnus", "password") 
  or die("Kantaan ei saatu yhteyttä: ".mysql_error());
mysql_select_db("kannan_nimi", $yhteys)
  or die("Kantaa ei saatu valittua: ".mysql_error());
$tulos = mysql_query("SELECT * FROM taulu WHERE etunimi like 'Jussi'", $yhteys)
  or die("Kysely ei onnistunut: ". mysql_error());

while($tulosrivi = mysql_fetch_array($tulos)){
  echo $tulosrivi['etunimi'].$tulosrivi['sukunimi'];
}

Esimerkissä on käyty kyselyn palauttama tulosjoukko läpi while-silmukassa. Silmukan ehdossa on käytetty mysql_fetch_array()-funktiota tiedon saamiseksi tulosjoukosta. Tulosjoukossa on sisäinen osoitin, joka alkutilanteessa osoittaa tulosjoukon ensimmäiselle riville. Funktio mysql_fetch_array() palauttaa assosiatiivisena taulukkona rivin, johon tulosjoukon osoitin osoittaa ja siirtää samalla osoittimen seuraavalle riville. While-silmukassa kutsutaan sitä joka kierroksella niin monta kertaa, että tulosjoukosta loppuu rivit ja funktio palauttaa arvon false.

Edellä olevasta esimerkistä nähdään, että mysql_fetch_array()-funktion palauttaman taulukon soluihin viitataan tietokantataulun vastaavien kenttien nimillä. Yhtä hyvin taulukon soluihin voidaan viitata numeeristen indeksien mukaan. Haluttaessa voidaan käyttää myös mysql_fetch_row()-funktiota. Se palauttaa taulukon joka indeksoidaan tavalliseen tapaan ainoastaan numeroiden nollasta alkaen.

Lisämääreitä valintalauseelle

Yleensä on viisasta antaa SQL-valintalauseelle myös joitakin lisämääreitä. Tavallisimpia niisät ovat ORDER BY ja LIMIT. ORDER BY määreellä voidaan määrittää valintalauseelle, minkä tietokantataulun kentän mukaan tulokset järjestellään. Se on hyvin usein järkevää, koska MySQL ei takaa sitä, missä järjestyksessä tiedot kannassa säilytetään. Ei voida esim. olettaa, että tiedot ovat aina kannassa lisäysjärjestyksessä. LIMIT puolestaan rajoittaa sen, kuinka monta riviä ja mistä alkaen otetaan mukaan lopulliseen kyselyn palauttamaan tulosjoukkoon. Alla on esimerkkikysely, jossa on käytetty molempia lisämääreitä:

SELECT * FROM taulu WHERE etunimi LIKE 'Jussi' ORDER BY sukunimi LIMIT 10,5

Esimerkkikysely palauttaa nyt taulusta Jussi nimiset henkilöt järjestettynä sukunimen aakkosjärjestyksen mukaan. Lisäksi rejoitetaan tuloksia LIMIT-määriteyksellä niin, että tulosjoukkoon otetaan mukaan rivit 11-15 kaikista kyselyä vastaavista taulun riveistä. LIMIT-syntaksissa siis ensimmäinen luku (esimerkissä 10) tarkoittaa, koinka monennelta riviltä kyselyä vastaavaa tulosjoukkoa aloitetaan. Toinen luku ilmaisee sen, kuinka monta riviä määritellystä alkukohdasta eteenpäin otetaan mukaan lopulliseen tulosjoukkoon. Alkukohdan indeksointi alkaa luvusta nolla.

Rivin lisääminen tietokantaan ylös

Rivin lisääminen tietokantaan tapahtuu PHP:ssä myös mysql_query()-funktion avulla. Poikkeuksena kyselyn tekemiseen on ainoastaan se, että funktio ei palauta tulosjoukkoa, vaan ainoastaan tiedon SQL-lauseen onnistumisesta.

SQL-syntaksissahan rivin lisäys tietokantatauluun tapahtuu INSERT-lauseella. Alla on esimerkki rivin lisäämisestä kantaan PHP-koodissa. Esimerkissä oletetaan, että tietokantayhteys kantaan on jo avattu.

<?php  
  mysql_query("INSERT INTO taulu VALUES('Jussi', 'Virtanen', '050 323 4567')")
    or die("Lisäys epäonnistui: ".mysql_error()."</div></body></html>");
?>

Esimerkissä oletetaan, että tietokantataulussa on täsmälleen nuo kolme kenttää. Jos johonkin kenttään ei haluta syöttää arvoa, voi sen tilalla SQL-syntaksissa antaa arvon null.