Tällä sivulla oleva materiaali on luotu yrityspalvelun ohjelmointikurssia varten keväälle 2009. Materiaaliin sisältyy pääkohdat kurssiin liittyvästä aihepiiristä. Asioita on käyty tarkemmin ja syventävästi läpi lähiopetuksessa. Materiaali ei siis sellaisenaan toimi, kuin PHP-ohjelmointikielen perusteiden läpikäyntiin. Jos olet kiinnostunut osallistumaan kurssille, haluat käyttää materiaalia omassa koulutuksessasi tai tarvitset ammattitaitoisen ja osaavan kouluttajan vetämään PHP-kurssia, ota yhteyttä Keski-Suomen Verkkomediaan.

Materiaalin ylläpitäjä ei vastaa sivuilla olevan materiaalin oikeellisuudesta tai ajantasaisuudesta. Materiaali on kuitenkin yksityskäytössä vapaasti käytettävissä. Materiaalin ja siihen sisältyvien harjoitustehtävien kokeilu omalla vastuulla.

Ohjelmointi: PHP & MySQL perusteet

PHP-ohjelmoinnin perusteet ja SQL-kyselykielen sekä MySQL Server -tietokantapalvelimen käytön perusteet.

Kurssin sisältö

Kurssin aikana käydään läpi PHP-ohjelmointikielen peruskielioppi ja ohjausrakenteet, kuten muuttujat, taulukot, ehtolauseet ja funktiot. Lisäksi käydään läpi SQL-kyselykielen perusteet sekä opiskellaan MySQL Serverin peruskäyttö (tietokantayhteys, kyselyt, tietojen haku, -lisäys, ja -poisto tietokannasta).

Kurssin aikana ehditään käydä läpi vain osa PHP-kielen ominaisuuksista. Lisätietoja ja kattavampaa tietoa löydät virallisesta PHP-dokumentaatiosta: www.php.net

Tavoite

Tavoitteena on, että kurssin jälkeen oppilaat osaavat itsenäisesti suunnitella ja toteuttaa yksinkertaisia PHP-kielellä kirjoitettuja ohjelmaskriptejä sekä pystyvät tekemään www-sivulta kyselyitä tietokantaan.

Johdanto

Tässä osassa käydään lyhyesti läpi www-sovellusten perusperiaatteita sekä esitellään erilaiset web-tekniikat.

Web-tekniikat

Internet-sivuja voidaan toteuttaa useiden eri ohjelmointikielien ja tekniikoiden avulla. Sivujen perustana toimivat kuitenkin html-merkintäkieli sekä http-tiedonsiirtoprotokolla. Pääsääntöisesti asiakas, eli sivua lukeva käyttäjä, kirjoittaa selaimen osoitekenttään internetosoitteen ja selain lähettää pyynnön palvelimelle kyseisessä osoitteessa olevasta sivusta. Palvelin käsittelee pyynnön ja - jos sivu on olemassa - lähettää sen takaisin asiakkaan selaimelle, joka näyttää sivun käyttäjälle.

Tuossa www-sivujen toimintaperiaate hyvin rajusti yksinkertaistaen.

Selain (asiakas)

Asiakaspuolen päätelaitteena toimii yleensä internet-selain. Yleisimpiä selainohjelmia ovat Microsoft Internet Explorer, Mozilla Firefox sekä Apple Safari. Selain muodostaa sivun (x)html-koodin perusteella ja näyttää sivun selainikkunassa. Sivujen ulkoasuun ja toiminnallisuuteen voidaan vaikuttaa erilaisilla tekniikoilla. Yleisimpiä selainpään tekniikoita ovat:

Palvelin

Palvelin on ohjelma, joka ylläpitää www-sivuja. Yleisimpiä ja laajimmin käytössä olevia palvelinohjelmistoja ovat Apache ja Microsoft IIS (Internet Infomation Server).

Saatuaan selaimelta pyynnön www-sivusta, palvelin käsittelee pyynnön sekä lähettää pyydetyn sivun takaisin selaimelle. Tarvittaessa sivua muokataan eri ohjelmointikielten avulla palvelimen päässä. Sivun sisältö saatetaan esimerkiksi hakea tietokannasta tai sivulla olevalla materiaalilla saatetaan tehdä laskutoimituksia yms. Yleisimpiä palvelimen päässä toimivia tekniikoita ovat:

Verkkosivut jaetaan yleensä toimintaperiaatteeltaan staattisiin ja dynaamisiin sivuihin.

Staattinen www-sivu

Staattinen sivu pysyy samanlaisena niin kauan, kunnes sivun ylläpitäjä tekee siihen muutoksia ja lataa muokatun sivun palvelimelle uudestaan. Staattisen sivun erottaa yleensä tiedostopäätteestä (.html tai .htm).

Dynaaminen www-sivu

Dynaaminen sivu luodaan palvelimella vasta, kun palvelin vastaanottaa pyynnön selaimelta. Palvelin tunnistaa tiedostopäätteestä (.php) esimerkiksi php-koodia sisältävän sivun ja lähettää sivun php-tulkin käsiteltäväksi. Php-koodissa saatetaan edelleen tehdä vaikkapa kyselyjä tietokantaan, joka taas sijaitsee erillisellä tietokantapalvelimella. Kun sivu saa hakemansa tiedot tietokannasta ja muun sivun sisältämän koodin perusteella sivun valmiiksi, lähettää palvelin näin muodostuneen sivun takaisin sivua pyytäneelle selaimelle.

Tällaista toimintamallia kutsutaan kolmitasomalliksi (selain-palvelin-tietokanta).

PHP-ohjelmointikieli

Tässä osassa kerrotaan lyhyesti PHP-ohjelmointikielen historiasta, mitä PHP on ja mitä sillä voidaan tehdä.

Historia

PHP (lyhenne sanoista: Hypertext Preprocessor) on www-sovellusten ohjelmointiin hyvin soveltuva scriptikieli, joka muistuttaa syntaksiltaan Perl ja C-ohjelmointikieliä. PHP on avoimen lähdekoodin ohjelmisto, jonka kehittämisen Rasmus Lerdorf aloitti, vuonna 1994, kirjoittamalla pienen kokoelman C-kielisiä CGI-skriptejä.

PHP on alusta alkaen kehitetty erityisesti web-ympäristön sovelluksia varten ja PHP-scriptit voidaankin upottaa suoraan sivun HTML-koodin sekaan. Koodi käsitellään palvelimella sivun pyynnön yhteydessä. Käsittelyn suorittaa palvelimelle asennettu ns. PHP tulkki. PHP tulkki voidaan asentaa sekä Apache, että IIS palvelimiin. PHP-tulkki onkin nykyään asennettuna suureen osaan eri palveluntarjoajien web-palvelimista.

Versiot

Mihin käytetään?

PHP:tä käytetään siis yleisimmin web-sovellusten rakentamiseen. PHP:n avulla voidaan mm. lisätä verkkosivuille erilaisia toimintoja, tarkastaa ja lähettää lomaketietoja ja rakentaa monimutkaisiakin sovelluskokonaisuuksia, kuten esimerkiksi erilaisia sisällönhallintajärjestelmiä.

Hyvät puolet

Huonot puolet

Ohjelmointiympäristö

Koodin kirjoittaminen suoraan HTML:n sekaan, ei siis tarvita välttämättä erillistä kehitysympäristöä vaan PHP-sivuja voi kirjoittaa hyvin vaikkapa Windowsin Notepad-ohjelmalla. Tuki PHP:lle pitää kuitenkin löytyä web-palvelimelta, jonne sivut tallennetaan. Kaikki PHP-koodiin liittyvä prosessointi suoritetaan palvelinpäässä ja selaimelle lähetetään normaali HTML-sivu eli selaimen päässä ei tarvita mitään erityislaajennuksia.

PHP-ohjelmoinnin perusteet

Tässä osassa käydään läpi PHP-ohjelmoinnin perusteita, kuten kielioppi(syntaksi), muuttujat, taulukot, ohjaus- ja ehtorakenteet, funktiot ja oliot.

PHP-kielioppi (syntaksi)

PHP-koodi lisätään HTML:n sekaan <?php ?> -elementin sisään ja sivu tallennetaan .php tiedostopäätteellä (joskus käytössä myös .php3/.php4 riippuen käytettävästä versiosta).

Edellinen merkintätapa on yleisimmin käytössä oleva, mutta palvelimen asetuksista riippuen voidaan käyttää myös seuraavia merkintöjä:
<? ?>
<% %> (ns. ASP-tagi)
<script language="php">...</script>

Rivit lopetetaan puolipisteellä (;) poikkeuksena viimeinen rivi, jolla se ei ole pakollista. Puolipistettä kuitenkin saa - ja näin kannattaa myös tehdä - käyttää myös viimeisellä rivillä.

HUOM! Koska koodi suoritetaan palvelimella, eivät PHP-tagit (eikä niiden sisällä ollut koodi) näy selaimelle lähetetyllä sivulla. Sivu sisältää ainoastaan koodin perusteella muokatun HTML-koodin!

Kommentit

Koodin sekaan voidaan lisätä kommentteja selventämään sitä, mitä koodissa sillä hetkellä tehdään. Näin varmistetaan, että koodi on ymmärrettävää myös silloin, kun sen pariin palataan pitkän ajan kuluttua tai sitä muokkaa jälkeenpäin joku muu, kuin alkuperäinen kirjoittaja. Kommentteja ei oteta huomioon koodin suorituksessa, eivätkä ne näy sivulla selaimessa.

Selkeä ja asiallinen koodin kommentointi helpottaa koodin ylläpitoa ja muokkausta huomattavasti. Tee kommentoinnista tapa, mutta älä ylikommentoi (ts. älä kommentoi päivänselviä asioita).

Yksirivinen kommentti

Kommenttirivin alkuun kaksi kauttaviivaa (//), joiden jälkeen varsinainen kommenttiteksti:

// Tämä on yksirivinen kommentti...
// Tämä on toinen yksirivinen kommentti...

Monirivinen kommentti

Alkaa kauttaviiva-kertomerkki yhdistelmästä ja jatkuu kommenttina niin kauan, kunnes saavutetaan kertomerkki-kauttaviiva yhdistelmä.

/*
Tämä on useamman rivin kommentti. Kommentti alkaa
aloitusmerkistä ja loppuu lopetusmerkkiin.
*/

Muuttujat

Muuttujia käytetään säilyttämään tietoja, kuten esimerkiksi nimiä ja numeroita, ohjelman suorituksen aikana. Muuttujia voisi ajatella eräänlaisena lokerikkona, jonka lokeroihin voidaan säilöä tietoa ja hakea sieltä tarvittaessa.

Muuttujan nimi viittaa tietokoneen muistissa olevaan muistipaikkaan, johon muuttujan sisältämä tieto on tallennettu.

PHP on ns heikosti tyypitetty kieli, eikä muuttujia tarvitse ennen niiden käyttöä erikseen esitellä, kuten useissa ohjelmointikielissä täytyy tehdä. PHP:ssä muuttujat ovat käytössä siitä lähtien, kun niihin koodissa on viitattu.

Muuttuja määritellään PHP:ssä kirjoittamalla ensin dollarinmerkki ($) ja sen perään muuttujan nimi. Esim: $etunimi, $osoite, $ika.

Muuttujan nimi voi sisältää kirjaimia, numeroita ja alaviivoja (_). Nimen tulee alkaa joko kirjaimella tai alaviivalla. HUOM! Ei voi sisältää välilyöntiä!

Nimetessäsi muuttujia, käytä aina loogisia nimiä, joiden perusteella muuttujan toiminta ja käyttötarkoitus on helppo päätellä. Jos muuttuja on esimerkiksi nimetty $p ja koodin pariin palataan vaikkapa vuoden kuluttua, on luultavasti melko vaikeaa muistaa tallennettiinko muuttujaan posti- vai puhelinnumero. Kyseisessä tilanteessa $postinumero olisi siis ollut paljon järkevämpi muuttujan nimi.

Varsinkin pitkissä ja monisanaisissa muuttujan nimissä voidaan luettavuuden parantamiseksi käyttää ns Camel casing nimeämistapaa. Tällöin muuttujan nimi aloitetaan pienellä kirjaimella ja tämän jälkeen jokainen erillinen sana nimessä kirjoitetaan isolla alkukirjaimella. Esim. $tassapaErittainPitkaMuuttujanNimi.

Esimerkkejä oikein muodostetuista muuttujien nimistä:

$auto
$vuosimalli
$korin_vari
$keskinopeus
$kuljettu_matka
$kaytettyAika

Esimerkkejä virheellisistä muuttujien nimistä:

$68_vuosimallin_toyota
$auton väri
$korin-vari
$alennus%
$kysymys?

Hyvä kommentointi sekä loogisesti valitut muuttujanimet tekevät koodista selkeää ja helppolukuista.

Arvon sijoittaminen muuttujaan

Arvo sijoitetaan muuttujaan yhtäsuuruusmerkillä (=).

$etunimi = "Matti";
$osoite = "Kuusitie 1";
$onnennumero = 7;

Jos muuttujan arvoksi asetetaan merkkijono eli tekstiä, tulee teksti syöttää lainausmerkkien välissä. Numeroarvon voi syöttää ilman lainausmerkkejä.

HUOM! Yhtäsuuruusmerkki asettaa merkin oikealla puolella olevan arvon, merkin vasemmalla puolella olevaan muuttujaan. Yhtäsuuruusmerkkiä ei siis voi käyttää arvojen vertailuun vaan siihen käytetään == merkintää!

vakion määrittäminen

PHP:ssä voidaan määritellä myös vakiomuuttujia, joille annetaan nimi ja arvo. Tämän jälkeen muuttuja säilyttää saamansa arvon ohjelman suorituksen ajan ja vakiomuuttujaa voidaan kutsua koodissa nimeltä. Vakiomuuttuja määritellään define funktion avulla. Funktiolle annetaan parametrinä muuttujan nimi sekä arvo.

define ("PII", "3.14") // asettaa PII nimisen vakiomuuttujan arvoksi 3.14
print PII;

Tulostaa:

3.14

Vakiomuuttujien nimet kirjoitetaan yleensä isoin kirjaimin, jolloin ne erottuvat koodissa selkeästi "normaaleista" muuttujista. Define funktio on ns case sensitive, mikä tarkoittaa, että jos vakiomuuttujan nimi määritellään isoin kirjaimin, täytyy sitä kutsuttaessa nimi kirjoittaa isoin kirjaimin ts. PII ei ole sama kuin Pii. Funktiolle voidaan kuitenkin antaa kolmas parametri, true, jolloin siitä tulee case insensitive.

Muuttujan arvon tulostaminen (print / echo)

PHP:ssä tietojen ja arvojen tulostamiseen näytölle voidaan käyttää joko print tai echo funktioita. Käytössä ja ominaisuuksissa näiden välillä ei ole juurikaan eroja eli on täysin makuasia kumpaa haluaa käyttää.

$etunimi = "Matti";
$sukunimi = "Meikäläinen";
$kenganNumero = 49;

print $etunimi; // tulostaa näytölle Matti
print $sukunimi; // tulostaa näytölle Meikäläinen
print kenganNumero; // tulostaa näytölle 49

Erikoismerkit merkkijonoissa (escape characters)

Tulostettaessa merkkijonoja voidaan käyttää joko lainaus-(") tai heittomerkkejä('). Näillä on kuitenkin eroa!

print "Etunimi: $etunimi"; // tulostaa Etunimi: Matti
print 'Etunimi: $etunimi'; // tulostaa Etunimi: $etunimi

Jos lainausmerkkien sisässä olevaan tekstiin sisältyy esimerkiksi lainausmerkkejä, käytetään ns erikoismerkkejä (escape characters).

print ""Mitä kuuluu?""; // ei toimi
print "\"Mitä kuuluu?\""; // toimii, tulostaa: Mitä kuuluu?

Erikoismerkit PHP:ssä:

Merkkijonojen yhdistäminen

Merkkijonojen yhdistämiseen käytetään pistettä (.). (concatenation operator)

$etunimi = "Matti";
$sukunimi = "Meikäläinen";
$pituusSentteina = 175;
print "Hei! Olen $etunimi, $etunimi $sukunimi";
print "Olen " . ($pituusSentteina/100) . " metriä pitkä.";

Tulostaa

Hei! Olen Matti, Matti Meikäläinen
Olen 1.75 metriä pitkä.

Operaattorit

Sijoitusoperaattori

Aritmeettiset(matemaattiset) operaattorit

Yhdistetyt sijoituslauseet

Vertailuoperaattorit

Loogiset operaattorit

Operaattorien järjestys

Tietotyypit (datatyypit)

PHP on ns. heikosti tyypitetty kieli (weakly typed), joka tarkoittaa, ettei PHP välitä minkä tyyppistä tietoa muuttujaan tallennetaan.

Vaikka tyyppiä ei tarvitse erikseen määrittää, tulee kuitenkin olla tarkkana muuttujiin syötettävien arvojen käsittelyssä. Jos esim. käyttäjä syöttääkin kirjaimia kenttään, johon odotetaan numeroita (vaikkapa puhelinnumero) ei PHP välitä tästä vaan tallettaa arvon muuttujaan tekstimuodossa (string). Tästä syystä täytyy ohjelmoijan muistaa aina tarkastaa ohjelman ulkopuolelta, kuten esimerkiksi lomakkeelta tulevat tiedot.

Käytössä on kahdeksan perustietotyyppiä.

boolean

Totuusarvo, TRUE/FALSE (tosi/epätosi).

integer

Kokonaisluku (1, 6, 28, 3423 jne). Ei voi sisältää pisteitä eikä pilkkuja. Max. arvo riippuu käyttöjärjestelmästä, mutta yleisesti 32-bittinen. Jos sijoitetaan arvo, joka on max. arvoa suurempi, muuttuu tyyppi automaattisesti liukuluvuksi (float)

Voidaan käyttää myös heksadesimaalilukuja, mutta niille tulee antaa arvo muodossa: 0xFFFFFF, 0xEECCDD jne.

string

Merkkijono. Käytetään tektimuotoisen tiedon käsittelyyn.

double (float)

Liukuluku eli desimaaliluku (3.14, 15.79 jne). Yleensä 64-bittinen.

array

Taulukko. Voi sisältää useita arvoja. Käydään läpi tarkemmin jäljempänä omassa osiossaan.

object

Olio tietotyyppi.

NULL

Null arvo tarkoittaa, ettei muuttujalle ole määritelty arvo ts. se on tyhjä. Kirjoitetaan yleensä isoin kirjaimin, mutta on case insensitive eli voidaan kirjoittaa myös Null.

resource

Sisältää viitteen johonkin ulkopuoliseen tietolähteeseen (tiedostokahvat, tietokannat jne).

Tyyppimuunnokset

Etuliite, joka sisältää halutun muuttujatyypin, jatkettuna muuttujan nimellä muuttaa muuttujan tyypin halutuksi.

(integer)$a; // muuttaa muuttujan $a tyypin integer-tyypiksi.

Muuttujan tyyppi voidaan muuttaa myös settype funktion avulla.

settype($testimuuttuja, integer);

Muuttujan tyyppi saadaan selville gettype funktion avulla.

print gettype($testimuuttuja); // tulostaa NULL
$testimuuttuja = 5;
print gettype($testimuuttuja); // tulostaa integer
$testimuuttuja = "viisi";
print gettype($testimuuttuja); // tulostaa string
$testimuuttuja = 5.0;
print gettype($testimuuttuja); // tulostaa double
$testimuuttuja = true;
print gettype($testimuuttuja); // tulostaa boolean

Tuloste:

NULL
integer
string
double
boolean

esimääritellyt muuttujat

PHP:ssä on myös useita esimääriteltyjä muuttujia, jotka ovat automaattisesti käytössä. Alla tärkeimmät.

Taulukot

Taulukko (array) tyyppiseen muuttujaan voidaan tallettaa useita arvoja. Kullekin arvolle luodaan indeksi, jonka avulla arvot erotetaan toisistaan. Ellei indeksin arvoja ilmoiteta erikseen, ne luodaan automaattisesti kokonaislukuina nollasta alkaen (0,1,2...).

$maat = array("Suomi", "Ruotsi", "Norja");
print $maat[1];

Tulostaa:

Ruotsi

Taulukko voidaan luoda myös ilman array sanaa, mutta selkeyden vuoksi sitä on suositeltavaa käyttää.

$kaupungit = array("Suomi" => "Helsinki", "Ruotsi" => "Tukholma", "Norja" => "Oslo");
print $kaupungit["Ruotsi"];

Tulostaa

Tukholma

Taulukkoon voidaan lisätä arvoja myöhemmin. Jos indeksille ei anneta arvoa, tulee arvoksi seuraava kokonaisluku. HUOM! Arvoja lisättäessä ei tarvitse käyttää array sanaa, vaan sijoitetaan vain arvo kyseiseen taulukkomuuttujaan (muista hakasulkeet).

$maat[] = "Tanska"; // Tanska saa automaattisesti indeksin 3
$kaupungit["Tanska"] = "Kööpenhamina";

Taulukoista voidaan luoda myös moniulotteisia, jolloin taulukon alkion sisään tallennetaan uusi taulukko omine alkioineen.

count funktio palauttaa taulukon arvojen lukumäärän.

print count($maat);

4

print_r funktio näyttää taulukon koko sisällön.

print_r($kaupungit);

$kaupungit = array("Suomi" => "Helsinki", "Ruotsi" => "Tukholma", "Norja" => "Oslo", "Tanska" => "Kööpenhamina");
print_r($kaupungit);

tulostaa:

Array ( [Suomi] => Helsinki [Ruotsi] => Tukholma [Norja] => Oslo [Tanska] => Kööpenhamina )

HUOM! Käytä aina print_r funktiota taulukon arvojen tulostamiseen, echo- tai print-funktioilla se ei toimi oikein!

foreach-lause

Toinen kätevä tapa tulostaa ja käsitellä taulukon sisältöä on foreach-lause.

Lauserakenne:

foreach (taulukkomuuttuja as avain => arvo) {
	tehdään jotain taulukon arvoilla...;
}

Koodirakenne:

foreach($kaupungit as $avain=>$arvo) {
	print "$avain: $arvo";
}

Tulostaa:

Suomi: Helsinki
Ruotsi: Tukholma
Norja: Oslo
Tanska: Kööpenhamina

ohjausrakenteet ja ehtolauseet

Kuten muillakin ohjelmointikielillä tehdyissä ohjelmissa, myös PHP:ssä, ohjelman toiminnallisuutta sen suorituksen aikana ohjataan erilaisilla ehto- ja ohjausrakenteilla. Ohjelmanhan tulee yleensä suorittaa erilaisia tehtäviä ja toimenpiteitä riippuen siitä millaisia arvoja sille ohjelman suorituksen aikana annetaan (esim. käyttäjän syöttäminä lomakkeelta).

if...else

Todennäköisesti yleisin ja käytetyin ohjausrakenne on ns. if-then-else rakenne (jos-siinä tapauksessa-muutoin). Tämä rakenne tarkastaa, onko sille välitetty ehtolauseke tosi, jos on, suoritetaan aaltosulkeiden välissä oleva ohjelmakoodi. Ellei ehto täyty eli on epätosi, suoritetaan else-lohkossa, aaltosulkeiden välissä, oleva ohjelmakoodi.

Lauserakenne:

if (ehto) {
	tehdään jotain, jos ehto tosi...;
	} else {
	tehdään jotain muuta...;
}

else if...

Samassa rakenteessa voi olla myös useita ehtolauseita. Tällöin tarkastatetaan ensin ensimmäinen ehto, jos ehto täyttyy, suoritetaan siihen liittyvä koodi. Jos ehto on epätosi, siirrytään seuraavaan ehtoon, jos tämä puolestaan on tosi, suoritetaan siihen liittyvä koodi, jos ei jatketaan seuraavaan ehtoon jne, kunnes saavutetaan if-lohkon sulkeva aaltosulku.

if (ehto) {
	tehdään jotain, jos ehto tosi...;
	} else if (ehto) {
	tehdään jotain muuta, jos tämä ehto oli tosi...;
	} else {
	tai jotain ihan muuta...;
}

Koodirakenne:

$saa = "aurinkoinen";
if ($saa == "aurinkoinen") {
	print "Onpa kaunis ilma tänään!";
}

Tulostaa:

Onpa kaunis ilma tänään!

$saa = "pilvinen";
if ($saa == "aurinkoinen") {
	print "Onpa kaunis ilma tänään!";
	} else if ($saa == "sateinen") {
	print "Blääh, vettä sataa...";
	} else {
	print "Tasaisen harmaata...";
}

Tulostaa:

Tasaisen harmaata...

while

Tarkastetaan onko ehto tosi vai epätosi, jos tosi, suoritetaan aaltosulkeiden välissä oleva ohjelmakoodi.

Lauserakenne:

while (ehto) {
	tehdään jotain, jos ehto tosi...;
}

Koodirakenne:

$laskuri = 1;
while ($laskuri <= 10) {
	print "$laskuri kertaa 2 on ".($laskuri*2);
	$laskuri++;
}

Tulostaa:

1 kertaa 2 on 2
2 kertaa 2 on 4
3 kertaa 2 on 6
4 kertaa 2 on 8
5 kertaa 2 on 10
6 kertaa 2 on 12
7 kertaa 2 on 14
8 kertaa 2 on 16
9 kertaa 2 on 18
10 kertaa 2 on 20

do...while

Muutoin täysin vastaava, kuin while-lauseke, mutta koska ehto tarkastetaan vasta lauserakenteen lopussa, suoritetaan aaltosulkeiden välissä oleva ohjelmakoodi ainakin kerran.

Lauserakenne:

do {
	tehdään jotain...;
} while (ehto);

Koodirakenne:

$laskuri = 20;
do {
	print "$laskuri kertaa 2 on ".($laskuri*2);
	$laskuri++;
} while ($laskuri <= 10);

Tulostaa:

20 kertaa 2 on 40

switch

Ehtolausetta verrataan case-lausekkeen arvoon, jos tosi, suoritetaan case-lausekkeen ohjelmakoodi. Jos taas tulokseksi saadaan epätosi, siirrytään seuraavaan case-kohtaan. Näin jatketaan, kunnes ehtoa vastaava case-lauseke saavutetaan tai saavutaan default-lausekkeeseen, jolloin suoritetaan oletuksena suoritettava ohjelmakoodi.

HUOM! Muista lisätä break-avainsana jokaisen case-kohdan koodilohkon loppuun. Break lopettaa switch-lausekkeen suorittamisen ja ohjelmassa jatketaan eteenpäin. Break-sanan puuttuessa ohjelmassa seurataan vain seuraavaan case-lauseeseen ja lopulta suoritetaan default-lausekkeen ohjelmakoodi.

Lauserakenne:

switch (ehto){
	case tulos1:
	toimenpiteet, jos ehto == tulos1;
	break;
	default:
	oletuksena suoritettavat toimenpiteet;
}

Koodirakenne:

$valinta = "Appelsiini";
switch ($valinta){
	case "Pizza":
	print "Roskaruokaa, valitse terveellisemmin!";
	break;
	case "Appelsiini":
	print "Hedelmä on aina terveellinen valinta!";
	break;
	default:
	print "Ei hedelmä, muttei sentään roskaruokaakaan...";
}

Tulostaa:

Hedelmä on aina terveellinen valinta!

for

For-lausekkeessa annetaan laskurimuuttujalle alkuarvo, ehto sekä kerrotaan, kuinka alkuarvoa tulee muuttaa (esim. kasvattaa).

Lauserakenne:

for(laskurin alustus; ehto; laskurin asetus uuteen arvoon) {
	suoritettavat toimenpiteet
}

Koodirakenne:

for ($laskuri=1; $laskuri <= 10; $laskuri++) {
	print "$laskuri kertaa 2 on ".($laskuri*2);
}

Tulostaa:

1 kertaa 2 on 2
2 kertaa 2 on 4
3 kertaa 2 on 6
4 kertaa 2 on 8
5 kertaa 2 on 10
6 kertaa 2 on 12
7 kertaa 2 on 14
8 kertaa 2 on 16
9 kertaa 2 on 18
10 kertaa 2 on 20

funktiot

Funktiolla tarkoitetaan aliohjelmaa. Funktiolla on aina tarkoitus ts. se tekee jotain. Funktio voi esimerkiksi tulostaa tekstiä näytölle tai vaikkapa laskea yhteen sille parametreinä välitetyt luvut. Funktioilla pyritään helpottamaan ohjelmoijan työtä, koska jotakin tiettyä, usein toistuvaa, tehtävää koodissa ei tarvitse aina kirjoittaa uudestaan, vaan tehtävä voidaan suorittaa kutsumalla funktiota, joka suorittaa tehtävän.

Funktiot jaetaan kahteen päätyyppiin:

Funktion määrittely

Funktio määritellään varatulla sanalla function. Funktiolle annetaan nimi sekä tarvittaessa parametrit. Parametrit määritellään funktion nimen jälkeen sulkeiden sisällä, pilkulla toisistaan erotettuina. Ellei parametrejä tarvita, jätetään sulkeet tyhjäksi. Tämän jälkeen kirjoitetaan funktion varsinainen toiminto (ohjelmakoodi) aaltosulkeiden sisään. Funktio voi myös palauttaa arvon. Mahdollinen palautusarvo ilmoitetaan return-lausekkeella.

Lauserakenne:

function funktion_nimi($parametri1, $parametri2) {
	Funktiossa suoritettava koodi tähän...;
  	return $palautusarvo; // Tämä ei ole pakollinen
} 

Koodirakenne:

function tervehdi($kohde) {
	print "Morjens!";
	print "Mitä kuuluu $kohde?";
} 
function laskeYhteen($luku1, $luku2) {
	$summa = $luku1 + $luku2;
	return $summa;
}
?>

Funktion kutsuminen

Funktiota kutsutaan koodissa nimellä ja parametrit syötetään nimen jälkeen sulkeiden sisään.

Koodirakenne:

tervehdi("Ville");

Tulostaa:

Morjens!Mitä kuuluu Ville?

$ekaluku = 22;
$tokaluku = 7;
print laskeYhteen($ekaluku, $tokaluku);

Tulostaa:

29

Muuttujien näkyvyys funktion sisällä

Funktion sisällä määritelty muuttuja säilyy paikallisena kyseisen funktion sisällä. Toisin sanoen sitä ei voida käyttää funktion ulkopuolelta suoraan (kutsumatta funktiota) tai muista funktioista.

testiFunktio () {
	$testimuuttuja = "Tämä on testimuuttuja funktion sisällä!";
}
print $testimuuttuja;

Tulostaa:

1

Myöskään funktion ulkopuolella määritelty muuttuja ei näy funktion sisälle, eikä näin ollen ole suoraan käytettävissä funktion sisällä.

globaalit muuttujat

Muuttuja voidaan määritellä ns. globaaliksi muuttujaksi jolloin sitä voidaan käyttää funktion sisällä ilman, että sitä on parametrinä erikseen lähetetty funktiolle. Muuttuja määritellään globaaliksi avainsanalla global.

$muuttujaUlkoa = "Muuttuja funktion ulkopuolella";
print $muuttujaUlkoa;
function globaaliTesti () {
	global $muuttujaUlkoa;
	print $muuttujaUlkoa;
	$muuttujaUlkoa = "Tämä on globaali muuttuja, jolle annetaan arvo funktion sisällä!";
	print $muuttujaUlkoa;
}
globaaliTesti();
print $muuttujaUlkoa;

Tulostaa:

Muuttuja funktion ulkopuolella
Muuttuja funktion ulkopuolella
Tämä on globaali muuttuja, jolle annetaan arvo funktion sisällä!
Tämä on globaali muuttuja, jolle annetaan arvo funktion sisällä!

HUOM! Asetettaessa globaaleja muuttujia tulee siis olla hyvin huolellinen ja tarkka, koska muuttujan arvo muuttuu funktion ulkopuolella ja näin ollen koko ohjelmakoodissa!

Muuttujan arvon säilyttäminen funktio-kutsujen välillä

Funktion sisällä määritellyt muuttujat säilyttävät arvonsa ainoastaan funktion suorituksen ajan. Joskus saattaa kuitenkin olla tarpeen säilyttää muuttujan arvo funktiokutsujen välillä (esim. erilaiset laskurit).

Static-avainsanalla määritelty muuttuja säilyttää arvonsa funktiokutsusta toiseen.

function laskuri($teksti) {
	static $kutsuttuLkm = 0;
	$kutsuttuLkm++;
	print "$teksti. Kutsuja $kutsuttuLkm kpl.";
}
laskuri("Eka kutsu");
laskuri("Toka kutsu");
laskuri("Kolmas kutsu");

Tulostaa:

Eka kutsu. Kutsuja 1 kpl.
Toka kutsu. Kutsuja 2 kpl.
Kolmas kutsu. Kutsuja 3 kpl.

Aika- ja päivämäärä-tietojen käsittely

date() & time() vakiofunktiot

PHP:tä, kuten muitakin ohjelmointikieliä käytettäessä, joudutaan usein käsittelemään aika- ja päivämäärätietoja. Onneksi näiden käsittelyyn löytyy vakiofunktioiden muodossa runsaasti työkaluja. Yleisimmät tällaiset funktiot ovat date() ja time().

time()

Funktio palauttaa ns. aikaleiman (timestamp). Käytännössä tämä arvo on lukema, joka kertoo kuinka monta sekuntia on kulunut alkaen hetkestä 00.00:00 1.1.1970. PHP tarjoaa useita funktioita, joiden avulla tämä lukema voidaan muuttaa helpommin luettavaan muotoon eli toisin sanoen "normaaliksi" päivämääräksi.

print time();

Tulostaa:

1413851375

getdate()

Aikaleima voidaan muuttaa luettavampaan muotoon getdate() vakiofunktion avulla.

$pvm = getdate();
foreach ($pvm as $avain => $arvo) {
	print "$avain: $arvo";
}
print "Tänään on: ".$pvm['mday'].".".$pvm['mon'].".".$pvm['year'];

Tulostaa:

seconds: 35
minutes: 29
hours: 3
mday: 21
wday: 2
mon: 10
year: 2014
yday: 293
weekday: Tuesday
month: October
0: 1413851375
Tänään on: 21.10.2014

date()

Aikaleiman palauttama lukema voidaan muotoilla myös date() funktion avulla. Funktiolle annetaan parametreina muotoiluarvot sekä aikaleima.

$aika = time();
print date("d.m.Y G.i:s", $aika);

Tulostaa:

21.10.2014 3.29:35

date() funktion avulla voidaan myös syöttää esim. nykyinen päivämäärä muuttujaan.

$pvm = date("d.m.Y");
print "Tänään on $pvm";

Tulostaa:

Tänään on 21.10.2014

date() funktion muotoiluarvot:

a = am/pm
A = AM/PM
d = kuukauden päivä, ilman etunumeroa
D = viikonpäivä
F = kuukauden nimi
h = tunnit (12, etunumerolla)
H = tunnit (24, etunumerolla)
g = tunnit (12, ilman etunumeroa)
G = tunnit (24, ilman etunumeroa)
i = minuutit
j = kuukauden päivä, numerona
l = kuukauden päivä, nimi
L = karkausvuosi (1=kyllä, 0=ei)
m = kuukauden numero (esim. 06)
M = kuukausi (esim. Jan)
n = kuukauden numero (esim. 6)
s = tunnin sekunnit
r = päivämäärä RFC 822 standardin muodossa
u = aikaleima
y = vuosi, 2 numeroa
Y = vuosi, 4 numeroa
z = vuoden päivä (0-365)
Z = sekunnit GMT ajasta

mktime()

mktime() funktion avulla voidaan luoda aikaleima halutusta ajasta ja päivämäärästä. Funktiolle annetaan parametreina tunnit, minuutit, sekunnit, kuukausi, päivä ja vuosi.

$aikaleima = mktime(18,0,0,12,24,2007);
print "Aikaleima: $aikaleima";
print date("d.m.Y G.i:s", $aikaleima);

Tulostaa:

Aikaleima: 1198512000
24.12.2007 18.00:00

checkdate()

Jos päivämäärätieto saadaan esim. lomakkeelta, jonka tiedot käyttäjä on lähettänyt, tulee tieto tarkastaa ennen kuin sitä voidaan käyttää.

Päivämäärän voi tarkastaa checkdate() funktion avulla. Funktio palauttaa true, jos päivämäärätieto on validi, false, jos ei ole.

print checkdate(12,24,2007);

Tulostaa:

1

Lomakkeiden käsittely

Web-sovellusten kannalta ehkäpä yleisimmät tehtävät, joita PHP:n avulla suoritetaan, ovat erilaiset lomakkeenkäsittely-tehtävät. Näitä ovat esim. lomaketietojen keräys lomakkeelta, tietojen tarkastaminen ja muokkaus ennen niiden käyttöä sekä tietojen edelleen lähettäminen vaikkapa tietokantaan tai sähköpostiosoitteeseen.

Lomakkeen tiedot lähetetään http-protokollan avulla joko GET- tai POST-metodilla. Näin välitetyt tiedot löytyvät vastaavasti $_GET ja $_POST esimääritellyistä muuttujista.

GET ja POST-metodien erot

Erona näiden kahden välillä on, että GET-metodilla välitetyt tiedot kuljetetaan sivun url-osoitteen mukana. Tiedot näkyvät sellaisenaan parametreina selaimen osoiterivillä, sivuosoitteen perässä. Tätä tapaa käytetään, kun tieto ei ole sellaista, ettei se saisi näkyä muille käyttäjille ja lomakkeelta välitettyjä tietoja tallennetaan esim. kirjanmerkiksi. Yksi esimerkki GET-metodista on tehdä Googlessa haku, jolloin hakuparametrit näkyvät tulossivulla sivuosoitteen perässä. Tällöin haun voisi tallentaa linkkinä ja säilyttää kirjanmerkkinä tai lähettää vaikkapa edelleen.

POST-metodia taas käytetään siirtämään tietoa, jota ei tule näyttää ulkopuolisille.

lomakkeen tiedot taulukosta

Lomake-esimerkki (lähettää tiedot sähköpostina sekä tulostaa lähetetyt tiedot näytölle)

Luokat ja oliot

Tämän kurssin puitteissa PHP-kielen olio-ominaisuudet käydään läpi hyvin nopeasti ja pintapuolisesti. Lähinnä käydään pikaisesti läpi yleisimmät olio-ohjelmoinnin periaatteet ja käsitteet. Lisätietoa luokista ja olioista löytyy sivustolta: www.php.net

Olio-ohjelmointi

Olio-ohjelmoinnissa pyritään tavallaan mallintamaan ohjelmassa reaalimaailman käsitteitä. Olio-ohjelmoinnin perusrakenteita ovat luokat sekä luokista luodut ilmentymät eli oliot.

Luokka on kokoelma metodeja (tekevät jotain, kuten funktiot) sekä attribuutteja (luokan muuttujia).

Olio on luokan ilmentymä. Yhdestä luokasta voi luoda useita olioita. Luokka on tavallaan kaava, jonka mukaan oliot luodaan.

Voitaisiin luoda esimerkiksi Auto-luokka, jossa attribuutteja olisivat merkki, vuosimalli ja väri. Metodeja voisivat puolestaan olla vaikkapa Kiihdytä ja Jarruta.

Kyseisestä luokasta voitasiin tämän jälkeen luoda useita olioita, kuten toyota, audi, skoda jne. ja antaa näille kullekin omat parametriarvot.

Luokan määrittely:

class Auto {
	private $_nimi;
	public $merkki;
	public $vuosimalli;
	public $vari;

	function Auto ( $nimi ) {
      $this->_nimi = $nimi;
	}

	public function Kiihdyta() {
		print "$this->vari $this->merkki kiihdyttää...";
	}
	public function Jarruta() {
		print "$this->merkki vuodelta $this->vuosimalli jarruttaa...";
	}	
}

Olion luominen luokasta:

$auto1 = new Auto("Toyota");
$auto1 -> merkki = "Toyota";
$auto1 -> vuosimalli = 1995;
$auto1 -> vari = "punainen";

print "Merkki: ".$auto1->merkki;
print "Vuosimalli: ".$auto1->vuosimalli." ja väri: ".$auto1->vari;
$auto1 -> Kiihdyta();
$auto1 -> Jarruta();

Tulostaa:

Merkki: Toyota
Vuosimalli: 1995 ja väri: punainen
punainen Toyota kiihdyttää...
Toyota vuodelta 1995 jarruttaa...

MySQL

MySQL Server

Tietokanta on kokoelma tietoja, jotka liittyvät jollain tavalla yhteen. Esimerkiksi tietokanta voisi sisältää tiedot kirjaston kirjoista. Www-sovelluksissa tietokantoihin voidaan tallettaa mm. tuoteluetteloita, asiakasrekisterin tiedot, vieraskirjan viestit jne.

PHP:ssa on tuki kaikille yleisimmille tietokantaohjelmistoille. Näistä verkkosivujen yhteydessä tällä hetkellä suosituin on MySQL Server. Se on ilmainen (GPL lisenssi) ja saatavana useille eri käyttöjärjestelmille. MySQL Server on myöskin käytännössä erittäin nopea ja soveltuukin juuri www-käyttöön erinomaisesti. Jos palvelintarjoajan palvelintilaan kuuluu tietokanta, on se käytännössä yleensä aina juuri MySQL Server tietokanta.

Tietokannan tietotyypit

Tietokanta koostuu tauluista, jotka sisältävät kenttiä, joihin varsinaiset tiedot tallennetaan. Luotaessa uusia kenttiä tietokannan tauluihin, tulee määrittää minkätyyppistä tietoa kenttään tullaan tallettamaan. Alapuolella on listattuna eri tietotyypit.

Numeeriset

Aika ja päivämäärä

Merkkijonot

Yhteys tietokantaan

Jotta MySQL tietokantaa voidaan käyttää, täytyy siihen ensin luoda yhteys. PHP:ssä yhteys luodaan funktiolla: mysql_connect();

Funktiolle välitetään parametreina käytettävän MySQL palvelimen osoite, käyttäjätunnus ja salasana.

Funktio palauttaa onnistuessaan ns. "kahvan" avattuun tietokantayhteyteen tai epäonnistuessaan false.

Yleisesti käytetään die() -funktiota tulostamaan käyttäjälle virheilmoitus, jos yhteyden luominen epäonnistuu (palauttaa: false).

Koodiesimerkki:

$yhteys = mysql_connect("mysql.palvelin.fi", "kayttajatunnus", "salasana") or die
("Tietokantayhteyttä ei voitu luoda!");

Halutun tietokannan valinta

Kun yhteys tietokantapalvelimeen on luotu, voidaan valita käytettävä tietokanta. Tietokanta valitaan funktiolla: mysql_select_db();

Parametreiksi annetaan halutun tietokannan nimi sekä avattu tietokantayhteys.

Koodiesimerkki:

mysql_select_db("Tietokanta1", $yhteys) or die("Tietokantaa ei voida valita!");

Tietokantakyselyt

Kun yhteys tietokantaan on onnistuneesti luotu sekä käytettävä tietokanta valittu, voidaan tietokantaan tehdä hakuja eli kyselyitä. Kyselyt kirjoitetaan SQL-kyselykielellä. Kysely suoritetaan funktiolla: mysql_query()

Funktiolle välitetään parametreina SQL-kielinen kyselylause sekä aiemmin luodun tietokantayhteyden kahva.

Koodiesimerkki:

$kyselyn_palauttama_tulosjoukko =
mysql_query("SELECT * FROM testitaulu1 WHERE etunimi LIKE 'Matti'" , $yhteys)
or die("Kyselyä ei voitu suorittaa!");

Tulosjoukon käsittely

Kyselyn palauttamaa tulosjoukkoa voidaan käsitellä mysql-funktioiden avulla. Kätevä funktio tulosjoukon käsittelyyn on mysql_fetch_array()

Funktiolle välitetään parametreina äskeisen kyselyn palauttama tulosjoukko ja käydään tiedot läpi while silmukan avulla.

Koodiesimerkki:

$laskuri = 1;
while ($rivi = mysql_fetch_array($kyselyn_palauttama_tulosjoukko)) {
$nimi = $rivi[0];
print "$nimi$laskuri";
$laskuri++;
}

Jos taulussa olisi vaikkapa 4 henkilöä, joiden etunimi on Matti, tulostaisi koodi (rivinvaihdot lisätty):

Matti1
Matti2
Matti3
Matti4

Tietokantayhteyden sulkeminen

Lopuksi yhteys tietokantaan katkaistaan funktiolla: mysql_close();

Funktiolle annetaan parametrina avoinna olevan tietokantayhteyden kahva.

Koodiesimerkki:

mysql_close($yhteys);

SQL-kielen peruskomennot

Kyselyiden yhteydessä käytettävät lajitteluoperaattorit

Esimerkkikyselyitä

SELECT * FROM testitaulu1 WHERE etunimi LIKE 'Matti'

Palauttaa niiden henkilöiden kaikki tiedot, joilla etunimi on Matti.

SELECT id, sukunimi FROM testitaulu1 WHERE etunimi LIKE 'Teppo'

Palauttaa niiden henkilöiden id:n ja sukunimen, joiden etunimi on Teppo.

SELECT etunimi, sukunimi FROM testitaulu1 WHERE lempiruoka LIKE 'Lasagne'

Palauttaa niiden henkilöiden etu- ja sukunimen, joiden lempiruoka on Lasagne.

SELECT sukunimi FROM testitaulu1 WHERE id BETWEEN 1 AND 5

Palauttaa niiden henkilöiden sukunimen, joiden id välillä 1-5.

SELECT id, etunimi, sukunimi FROM testitaulu1 WHERE etunimi LIKE 'Maija' ORDER BY 'sukunimi' DESC LIMIT 3

Palauttaa niiden henkilöiden id:n sekä etu- ja sukunimen, joilla etunimi on Maija. Näyttää maksimissaan 3 tulosta ja järjestää tulokset sukunimen mukaan käänteiseen aakkosjärjestykseen.

Sivuston päivitykset:

09.02.2009
Sivun loppuun lisätty linkit harjoitustehtäviin 1 ja 2 ratkaisumalleineen.
Lisätty myös linkki harjoitustehtävien 1 ratkaisumallien koodiin.
11.02.2009
Sivun loppuun lisätty linkit harjoitustehtäviin 3 ja 4 ratkaisumalleineen.
Lisätty myös linkki harjoitustehtävien 2 ratkaisumallien koodiin. 13.02.2009
Sivut päivitetty 2. kurssipäivän jälkeen. Kirjoitusvirheiden ja esimerkkilomakkeen korjaukset. Lisätty myös linkit harjoitustehtävien 3 ja 4 ratkaisumallien koodeihin. 22.02.2009
Lisätty MySQL Server osuus. 14.03.2009
Lomake-esimerkkiä muokattu hiukan. Nyt lähettää tiedot sähköpostiin sekä tulostaa näytölle lähetetyt tiedot.

Muutamia sekalaisia linkkejä: