PHP ja WWW-lomakkeet
Tehdään kurssille arvosanalaskuri opiskelijan ja opettajan tueksi.
Lomake PHP:lla

- Tallenna lomakkeen pohja index.php-nimellä V-asemalle johonkin hakemistoon.
- Avaa jokin sopiva tekstieditori (esim. Crimson Editor, HTML-kit, jEdit, Eclipse) ja siihen V-asemalle tallennettu tiedosto.
- Korjaa alun XML-deklaraatio siten, että se tulostetaan
printtaiecho-komennolla. Muutoin sivu ei toimi. Muista<?php ?>-tagit aina koodia kirjoitettaessa. - Kokeile sivua osoitteesta http://www.ad.jyu.fi/users/t/tunnus/hakemisto/. Kyseiselle IIS-palvelimelle on asennettu PHP5, joten kaikki Apacheen liittymättömät PHP-skriptit toimivat suoraan tästä osoitteesta.
- Aseta lomakkeen käsittelijäksi sivu itse. Tämä onnistuu helpoimmin esimääritellyllä $_SERVER['PHP_SELF'] -muuttujalla.
Tietojen validointi
- Tee lomakkeen alkuun tarkistus, että etunimi ja sukunimi on täytetty ja tiedekunta on valittu. Tee tarkistukset if-rakenteiden avulla ja lisää virheilmoitukset yhteen virhetaulukkoon, jossa avaimena käytetään virheellisen kentän nimeä ja arvona virheilmoitustekstiä (kts. luentoesimerkin virheentarkistukset). Tarvitset $_REQUEST, $_POST tai $_GET-muuttujaa, empty-funktiota ja vertailuoperaattoreita.
- Jos tiedot ovat ok, niin tulosta toistaiseksi etunimi, sukunimi ja tiedekunnan numero. Tulosteista kannattaa poistaa HTML-erikoismerkit htmlentities-funktiolla.
- Jos tiedoissa oli virheitä, niin tulosta virhe-ilmoitus
- Ensimmäinen versio: Jos virheitä on niin tulosta yleinen virheilmoitus ja estä lomakkeen näyttö. Tarvitset isset-funktiota.
- Toinen versio: Käy läpi kaikki virhetaulukon virheet ja tulosta ne lomakkeen alussa (ns. Korppi-metodi :D ).
- Kolmas versio: Tulosta lomake-elementin viereen virheilmoitus.
- Neljäs versio: Mieti mikä tässä tavassa on koodin ylläpidon kanssa ongelmallista? (ei tarvitse toteuttaa mitään vielä)
- Tarkista, että viikkotehtäviin on laitettu numero. Tarkista, että numero on väliltä 0-5. Älä kuitenkaan herjaa tyhjästä tekstilaatikosta. Kokeile tehdä tarkistus siten, että käyt yhdessä silmukassa läpi kaikki viikkotehtävien syötteet. Koko ryhmää koskeva virheilmoitus riittää toistaiseksi. Voit tarvita funktioita is_numeric, in_array ja for-silmukkaa sekä katenointioperaattoria.
- Kokeile lomakkeen lähetysmetodiksi post. Muuttuiko lomakkeen toiminta? Napauta selaimen osoiteriville ja paina enteriä, jos haluat testata lomaketta, niin ettei POST-muuttujia lähetetä uudelleen.
Laskentaa
Tulostetaan keskiarvo, jos kaikki tiedot on hyväksytty. Lasketaan aluksi normaali keskiarvo, jonka voi myöhemmin muuttaa painotetuksi keskiarvoksi.
- Käy for-silmukalla läpi lähetetyt parametrit vt_1 ... vt_10 ja summaa ne yhteen. Parametrin nimi on muodostettava merkkijonosta "vt_" ja silmukan indeksin arvosta. Jos tekstilaatikko on tyhjä, niin tämän arvoksi lasketaan 0.
- Laske ja tulosta keskiarvo.
- Muuta lomaketta siten, että viikkotehtävätiedot tulevat automaattisesti taulukkona. Laita myös tehtävänumero mukaan. Helpoiten tämä onnistuu nimeämällä pistetekstikentät nimillä vt[1], vt[2], ... ,vt[10]. Laita samat tiedot labelin for-ominaisuuteen.
- Muuta keskiarvon laskua siten, että summaat pisteet foreach-silmukalla.
Laske syötettyjen kertojen määrä taulukosta count-funktiolla.
- Huomaa, että
koska kyse on tekstilaatikoista, niin jokaisesta laatikosta tulee vähintään tyhjä merkkijono.
count-funktion arvoksi siis pitäisi tulla aina 10. Sama ei päde esim.
selecttaicheckbox-käyttöliittymäkomponentteihin. Aiheesta tarkemmin W3C:n forms-dokumentissa. Koska tekstilaatikoiden määrä on kiinteä, niin turvallisinta olisi selvittää tekstilaatikoiden määrä jostain muualta kuin käyttäjän syötteestä.
- Huomaa, että
koska kyse on tekstilaatikoista, niin jokaisesta laatikosta tulee vähintään tyhjä merkkijono.
count-funktion arvoksi siis pitäisi tulla aina 10. Sama ei päde esim.
Oletusarvojen täyttö
- Virhe-ilmoituksien yhteydessä on hyvä laittaa lomakekenttiin ne arvot mitä käyttäjä ensimmäisellä kerralla antoi, ettei tietoja tarvitse kirjoittaa uudestaan. Tulosta nämä tiedot tekstikenttien value-ominaisuuteen.
- Käyttäjä voi syöttää myös jotain HTML-koodia. Muunna HTML:n erikoismerkit entiteeteiksi htmlentities-funktiolla
Dynaaminen valintalista
Ongelmana on saada selected="selected" oikean
option-elementin kohdalle.
Koodi pystyy paremmin ylläpidettävänä, kun emme jokaisen
option-elementin kohdalla jossittele
oliko tämä valittu vaihtoehto.
- Tee ensin taulukkomuuttuja, jossa on
option-elementin vaihtoehdot. - Luo
select-elementin aloituksen ja lopetuksen väliinfor-silmukka, joka käy läpi taulukon alkiot. Aloita indeksinumero 0:sta ja päätä taulukon alkoiden määrään (count). - Tulosta
option-elementti, jossa on taulukon teksti javalue-ominaisuuteen indeksin arvo. - Kun indeksi on sama lomakkeelta saatu arvo, niin tulosta
option-elementtiin lisäksi teksti selected="selected". - Muuta hyväksyttyä tulostusta siten, että tulostat tiedekunnan numeron sijaan tiedekunnan nimen. Tämä onnistuu tiedekuntataulukon avulla.
Dynaaminen taulukko
Mitä jos viikkotehtävien määrä muuttuu? Kuinka paljon muutosvaivaa on nähtävä?
- Lisää sivun alkuun muuttuja, joka kertoo viikkotehtävien määrän.
- Tee ensimmäisen
tr-elementin sisällefor-silmukka, joka käy läpi numerot yhdestä viikkotehtävien määrään. Tulostathjalabel-elementtejä silmukan sisällä. Numerot saat silmukan indeksistä. - Tee toisen
tr-elementin sisälle vastaava silmukka. Nyt on tulostettavatdjainput-elementtejä. - Keskiarvon laskennan pitäisi toimia edelleen, koska se käy kaikki tehtäväkerrat läpi.
Vaativia tehtäviä
Seuraavista tehtävistä saa hyvää treenausta vaativimpia viikkotehtäviä varten.
Opettajan lomake
Miten opettaja voisi syöttää nopeasti monen opiskelijan tiedot ja saada kerralla kaikkien keskiarvot?

- Tallenna sivu toisella nimellä. Poista alusta henkilötietojen kyselyt.
- Lisää taulukkomuuttuja, jossa on muutaman oppilaan nimi.
- Kapseloi jälkimmäisen rivin tulostava silmukka toisella
foreach-silmukalla, joka käy läpi kaikki opiskelijat. - Tulosta rivin ensimmäiseen soluun (th) opiskelijan nimi.
- Tee name-ominaisuudesta kaksiulotteinen taulukko, jossa ensimmäinen avain on opiskelijan nimi ja
toinen avain on tehtävän numero. HTML-koodiin pitäisi tulla siis esimerkiksi
<tr> <th>Nano Nano</th> <td><input type="text" name="vt[Nano Nano][1]" /></td> ... <td><input type="text" name="vt[Nano Nano][10]" /></td> </tr> <tr> <th>Diiba Daaba</th> <td><input type="text" name="vt[Diiba Daaba][1]" /></td> ... <td><input type="text" name="vt[Diiba Daaba][10]" /></td> </tr> ...- Huomaa, että HTML 4.0 ei salli name-attribuutin arvossa mitään erikoismerkkejä (esim. hakasulkeita, välilyöntejä tai ääkkösiä), mikä on PHP:n kannalta ongelmallista. XHTML on tässä suhteessa sallivampi. Jos haluat, että sivu on HTML-yhteensopiva, joudutaan nimeäminen tekemään esimerkiksi tyyliin vt_n_m, missä n on opiskelijan nimen paikka taulukossa ja m on tehtävän numero. Läpikäytävä moniulotteinen taulukko on muodostettava erikseen. Tarkemmin aiheesta:
- Lisää keskiarvon laskennan ympärille
foreach-silmukka, joka käy kaikki opiskelijat. Tulosta ensin opiskelijan nimi. Käy sitten sisemmässä silmukassa opiskelijan tulokset läpi ja summaa ne. Tämä onnistuu, kun läpikäytäväksi taulukoksi antaa $_REQUEST['vt'][$opiskelijan_nimi]. Tulosta ulomman silmukan lopussa opiskelijan tehtävien keskiarvo.
Huomaa, että yhdellä labelilla ei pysty enää viittaamaan yhteen lomake-elementtiin. Tämä rikkoo hieman lomakkeemme esteettömyyttä.
Painotettu keskiarvo
Kurssilla arvioinnissa käytetään painotettua keskiarvoa. Muuta sovellusta siten, että se laskee normaalin keskiarvon sijaan painotetun keskiarvon seuraavan taulukon mukaan ($n = tehtävien määrä):
| Tehtävä | Painokerroin |
|---|---|
| 1 - 3 | 1 |
| 4 - 7 | 1.5 |
8 - $n | 2 |
- Muuta foreach-silmukkaa siten, että saat taulukon avaimen johonkin muuttujaan.
- Lisää silmukkaan kertoimen määritys avaimen perusteella. Laske kertoimien summa. Painotettua keskiarvoa laskettaessa sitä tarvitaan jakajana. Jakaja (=kertoimien summa) tulee laskettua turhaan useampaan kertaan, mutta tämä ei nyt haittaa.
Demopistelaskuri
Useiden matematiikan, fysiikan ja tietotekniikan kurssien arvioinnissa mitataan myös demotyöskentelyn aktiivisuutta. Aktiivisella demotyöskentelyllä saa lisäpisteitä tenttiin. Mieti miten laajentaisit opiskelijan arvosanalaskuria yleiseksi demopistelaskuriksi. Huomioitavaa:
- Kurssit ja näiden lisääminen
- Kurssien vaihteleva demokertojen määrä
- Bonuspisterajat
Jatkossa voisi miettiä myös seuraavia laajennusmahdollisuuksia:
- Useiden kurssitietojen muuttaminen kerralla
- Tietojen tallentaminen
- Kurssiarvosanalaskuri, jossa huomioidaan demobonus- ja tenttipisteet sekä arvosanan laskentatapa

