PHP:n perusteet - Demo 2
Näissä demoissa tutustutaan PHP:n perusteisiin. Käydään läpi PHP:n syntaksia, muuttujia, tietotyyppejä, operaattoreita, kontrollirakenteita ja taulukoita.
Jos et ole tehnyt ensimmäistä demoa, niin sen materiaaleista kannattaa tutustua ainakin alkuvalmisteluihin ja etenkin editorin valintaan. Mikä tahansa mainituista editoreista käy myös PHP:tä ohjelmoidessa, mutta paras vaihtoehto virheenjäljityksen kannalta on Eclipse, jossa on varsin hyvät Debug-ominaisuudet.
CSS:n vaihtaminen vuodenajan mukaan
Tehtävässä vaihdetaan XHTML-sivun tyylitiedostoa vuodenajasta riippuen. Käytettävät tyylit ovat seuraavat:
- Talvi (joulukuu-helmikuu): http://www.danielgreene.com/styles/photo.css
- Kevät (maaliskuu-toukokuu): http://www.danielgreene.com/styles/pretty.css
- Kesä (kesäkuu-elokuu): http://www.danielgreene.com/styles/oldstyle.css
- Syksy (syyskuu-marraskuu): http://www.danielgreene.com/styles/typewriter.css
- Mallisivuksi (XHTML) voit kopioida esimerkiksi vuodenaika.html-tiedoston sisällön. Nimeä tiedosto nimelle vuodenaika.php ja tallenna se W-asemallesi esimerkiksi /sovellukset/demo2/-kansioon (luo kansio tarvittaessa).
- Korjaa alun XML-deklaraatio siten, että se tulostetaan
print- taiecho-komennolla. Muutoin sivu ei toimi. Muista<?php ?>-tagit aina koodia kirjoitettaessa. - Tee tiedostoon head-elementin alkuun PHP-lohko (
<?php ?>), jossa tullaan jatkossa tarkistamaan, mitä tyylitiedostoa tulee käyttää ja tarkistuksen jälkeen otetaan käyttöön oikea tyylitiedosto. - Tee merkkijonomuuttuja
$tyylija alusta se tyhjäksi. - Tee kokonaislukumuuttuja
$kuukausi, johon laitat arvoksi meneillään olevan kuukauden. Meneillään olevan kuukauden saat selvilledate()-funktiolla. Funktion kutsun tulee olladate("m");, kun sen halutaan palauttavan pelkästään meneillään oleva kuukausi. - Tee seuraavaksi if...elseif...else-kontrollirakenne, missä sijoitat halutun tyylitiedoston osoitteen
$tyyli-muuttujaan meneillään olevan vuodenajan perusteella.- Tarkista ensin
if-lauseella, onko meneillään talvi.if-lauseen ehdoksi täytyy siis laittaa se, että kuukausi on joko 12, 1 tai 2.if($kuukausi==12 || $kuukausi==1 || $kuukausi==2) { $tyyli = "http://www.danielgreene.com/styles/photo.css"; } - Tarkista
elseif-lauseilla, onko meneillään kevät tai kesä. Kevään kohdalla ehdoksi täytyy siis määritellä, että kuukausi on välillä 3-5 eli suurempi tai yhtäsuuri kuin 3 ja pienempi tai yhtäsuuri kuin 5. Kesän kohdalla vastaava ehto on suurempi tai yhtäsuuri kuin 6 ja pienempi tai yhtäsuuri kuin 8. Alla esimerkki keväänelseif-rakenteesta.elseif (6 <= $kuukausi && $kuukausi <= 8) { $tyyli = "http://www.danielgreene.com/styles/pretty.css"; } - Aseta lopuksi
else-lauseessa$tyyli-muuttujan arvoksi syksyn tyylitiedoston osoite.
- Tarkista ensin
- Nyt oikea tyylitiedoston osoite on
$tyyli-muuttujassa, eli enää tarvitsee määrittää sivu käyttämään tyylitiedostoa kyseisestä muuttujasta.- Tulosta tyylimääritys
echo-komennolla. Laita tyylin nimen paikalle$tyyli-muuttuja. Tarvitset yhdistämisoperaattoria (.). Lisäksi tulostus pitää tehdä heittomerkeissä ('), jotta lainausmerkit (") tulostuvat oikein XHTML-koodiin. Loppuun kannattaa laittaa vielä rivinvaihto ("\n"), jolloin XHTML-koodi pysyy siistinä.echo '<link rel="StyleSheet" href="'.$tyyli.'" type="text/css" />'."\n";
- Tulosta tyylimääritys
- Kokeile sivun toimintaa selaimella ja korjaa virheet tarvittaessa.
Lottorivin arpoja
Tässä tehtävässä tulostetaan näytölle sattumanvaraiset 7 lukua väliltä 1-39. Arvottua numerosarjaa voi käyttää siis esimerkiksi lottorivinä. :-)
- Tee tyhjä XHTML-tiedosto, johon laitat kaikki tarvittavat määritykset (xml-deklaraatio, dokumenttityyppi, dokumentin kieli yms.) ja tallenna tiedosto nimelle lotto.php. Muista tulostaa xml-deklaraatio esimerkiksi echo-lauseella.
- Tee tiedostoon body-elementin alkuun PHP-lohko (
<?php ?>), jossa tullaan jatkossa arpomaan lottonumerot ja tulostamaan ne näytölle. - Laita lohkon alkuun seuraava alla oleva tulostuslause (numerot tulostetaan myöhemmin siis suoraan nyt
lisättävän lauseen perään).
echo "<p>Lottorivisi on seuraava: ";
- Tee taulukkomuuttuja nimeltä $numerot. Tee lisäksi kokonaislukumuuttuja $numero, johon sijoitetaan viimeiseksi arvottu numero. Alusta $numero-muuttujan arvoksi 0.
- Tee while-kontrollirakenne, jonka jokaisella kierroksella on tarkoitus arpoa yksi numero ja
lisätä se $numerot-taulukkoon. while-silmukkaa tulee käydä läpi siihen asti, kunnes $numerot-taulukko
sisältää 7 numeroa. Taulukon arvojen lukumäärän voi laskea count-funktiolla, jolle viedään parametriksi itse taulukko. Funktio
palauttaa taulukossa olevien arvojen lukumäärän.
while(count($numerot) < 7) { //täällä arvotaan numerot ja tulostetaan ne näytölle } - Ensin while-rakenteen sisällä täytyy arpoa numero väliltä 1-39. Sen saa tehtyä rand()-funktiolla,
jolle viedään parametreiksi minimi- ja maksimiarvot. Sijoita arvonnan tulos muuttujaan $numero.
$numero = rand(1,39);
- Saatua arvoa ei voi suoraan sijoittaa taulukkoon, koska siellä voisi olla jo sama numero edellisiltä arvontakierroksilta.
Täytyy siis ensin tarkistaa, löytyykö arvo taulukosta ja lisätä se sinne vain silloin, jos numeroa ei löytynyt.
- Tee ensin apumuuttuja $loytyi, jonka arvoksi sijoita false. Arvoa muutetaan jatkossa, jos taulukosta löytyy jo valmiiksi arvottu numero.
- Tarkistuksessa käydään taulukko läpi for-kontrollirakenteella (läpikäynti olisi mahdollista myös foreach-rakenteella,
mutta käytämme nyt for-rakennetta, koska sitä tarvitaan viikkotehtävässä). Tee kyseisen kontrollirakenteen lohko. Kierroslaskurina
voit käyttää esimerkiksi apumuuttujaa $i. Silmukkaa tulee käydä läpi niin kauan, kun apumuuttuja $i on
pienempi kuin taulukon alkioiden lukumäärä. Taulukon alkioiden lukumäärän voit jälleen laskea count-muuttujalla.
for($i=0; $i<count($numerot); $i++) { //täällä tarkistetaan löytyikö taulukosta arvottu numero jo valmiiksi } - Kirjoita for-rakenteen sisälle if-lause, jossa tarkistat, onko $numerot-taulukon
meneillään olevan alkion (apumuuttuja $i) arvo sama kuin arvottu numero (muuttuja $numero). Jos numero on sama,
sijoita $loytyi-muuttujan arvoksi true. for-silmukan suorituksen voi tällöin myös katkaista
break-lauseella, koska taulukkoa on turha käydä läpi enää eteenpäin.
if($numerot[$i] == $numero) { $loytyi = true; break; } - for-silmukan suorittamisen jälkeen muuttujassa $loytyi on siis arvo "ei", jos arvottua numeroa ei ollut ennestään $numerot-taulukossa. Jos taas arvottu numero oli jo ennestään taulukossa, niin $loytyi-muuttujan arvo on true.
- Seuraavaksi while-silmukassa lisätään arvottu numero $numerot-taulukkoon, jos $loytyi-muuttujan
arvo on false. Tarkista $loytyi-muuttujan arvo if-lauseella.
if($loytyi == false) { //täällä lisätään arvottu numero taulukkoon ja tulostetaan se } - Äsken luodussa if-lauseessa arvottu numero lisätään $numerot-taulukkoon ja tulostetaan se näytölle.
- Lisää $numero-muuttujan arvo $numerot-taulukkoon seuraavaan tyhjään indeksiin. Tähän on kätevintä käyttää
array_push()-funktiota, jolle viedään parametreinä taulukko, mihin lisätään ja lisättävä(t) arvo(t).
array_push($numerot, $numero);
- Tulosta vielä arvottu numero näytölle echo-lauseella. Lisää echo-lauseeseen myös yksi välilyönti numeron perään, jotteivät numerot menee yhteen pötköön XHTML-sivulla.
- Lisää $numero-muuttujan arvo $numerot-taulukkoon seuraavaan tyhjään indeksiin. Tähän on kätevintä käyttää
array_push()-funktiota, jolle viedään parametreinä taulukko, mihin lisätään ja lisättävä(t) arvo(t).
- Tulosta vielä PHP-lohkon loppuun echo-lauseella kappale-elementin (p) lopputagi (</p>).
- Kokeile sivun toimintaa selaimella ja korjaa virheet tarvittaessa. Veikkausonnea! ;-)
Lisätehtävä
Laajenna äskeistä Lottorivi-tehtävää yleiseksi numeroiden arvontakoneeksi. Tee ensin lomake, jolla käyttäjältä kysytään, miltä väliltä numeroita arvotaan ja montako numeroa arvotaan. Käytä sen jälkeen Lottorivi-tehtävän koodia apunasi ja tulosta arvotut numerot näytölle. Lottorivi-tehtävän koodia täytyy siis muuttaa siten, ettei aina tulosteta 7 numeroa numeroa väliltä 1-39, vaan nämä määrä- ja tulostuväliarvot luetaan käyttäjän lomakkeella antamista arvoista (eli joko $_GET- tai $_POST-taulukosta).


Käyttäjien kommentit