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:

  1. 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).
  2. Korjaa alun XML-deklaraatio siten, että se tulostetaan print- tai echo-komennolla. Muutoin sivu ei toimi. Muista <?php ?> -tagit aina koodia kirjoitettaessa.
  3. 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.
  4. Tee merkkijonomuuttuja $tyyli ja alusta se tyhjäksi.
  5. Tee kokonaislukumuuttuja $kuukausi, johon laitat arvoksi meneillään olevan kuukauden. Meneillään olevan kuukauden saat selville date()-funktiolla. Funktion kutsun tulee olla date("m");, kun sen halutaan palauttavan pelkästään meneillään oleva kuukausi.
  6. 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ään elseif-rakenteesta.
      elseif (6 <= $kuukausi && $kuukausi <= 8) {
        $tyyli = "http://www.danielgreene.com/styles/pretty.css";
      }
      
    • Aseta lopuksi else-lauseessa $tyyli-muuttujan arvoksi syksyn tyylitiedoston osoite.
  7. 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";
      
  8. 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ä. :-)

  1. 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.
  2. Tee tiedostoon body-elementin alkuun PHP-lohko (<?php ?>), jossa tullaan jatkossa arpomaan lottonumerot ja tulostamaan ne näytölle.
  3. 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: ";
    
  4. Tee taulukkomuuttuja nimeltä $numerot. Tee lisäksi kokonaislukumuuttuja $numero, johon sijoitetaan viimeiseksi arvottu numero. Alusta $numero-muuttujan arvoksi 0.
  5. 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
    }
    
  6. 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);
    
  7. 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.
  8. 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
    }
    
  9. Ä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.
  10. Tulosta vielä PHP-lohkon loppuun echo-lauseella kappale-elementin (p) lopputagi (</p>).
  11. 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

Kommentoi tätä sivua Lisää uusi kommentti
Kurssimateriaalien käyttäminen kaupallisiin tarkoituksiin tai opetusmateriaalina ilman lupaa on ehdottomasti kielletty!
http://appro.mit.jyu.fi/sovellukset/demot/demo2/
© Jukka Mäntylä (jmantyla@mit.jyu.fi) <http://www.iki.fi/jmantyla/>
Tommi Lahtonen (tommi.j.lahtonen@jyu.fi) <http://hazor.iki.fi/>
Antti Ekonoja (anjoekon@jyu.fi) <http://users.jyu.fi/~anjoekon/>
2007-03-02 10:58:32