Kirjoittaja: Antti Laaksonen (2011).
Muuttujaa voi ajatella muistipaikkana, johon voi tallentaa koodissa tarvittavaa tietoa. Muuttujalla on nimi, jolla siihen viitataan koodissa, ja muuttuja voi sisältää esimerkiksi tekstiä tai lukuarvon. Esimerkiksi muuttuja $nimi
voi sisältää käyttäjän nimen.
Tässä oppaassa tutustumme muuttujiin ja samalla HTML-lomakkeen kautta lähetetyn tiedon käsittelyyn PHP:llä. Teemme muutaman yksinkertaisen lomakkeen, joiden kautta lähetetyt tiedot ovat käytettävissä PHP:n muuttujissa.
Muuttujan nimi on tunnus, jolla muuttujaan viitataan koodissa. Muuttujan arvo on muuttujan sisältö tietyllä hetkellä koodin suorituksen aikana. Seuraavassa koodissa on kaksi muuttujaa: muuttuja $nimi
saa arvon "Aapeli" ja muuttuja $vuosi
saa arvon 1960. Sitten koodi tulostaa muuttujien arvoja.
Koodin tulostus on seuraava:
Aapeli1960Aapeli
Muuttujan nimen aloittaa aina dollarimerkki ($
), jonka jälkeen nimessä voi olla kirjaimia, numeroita ja alaviivoja (_
). Kuitenkaan ensimmäinen merkki dollarimerkin jälkeen ei saa olla numero. Muuttujan nimessä kirjankoolla on merkitystä, eli $nimi
ja $Nimi
ovat kaksi eri muuttujaa.
Muuttujan tyyppi tarkoittaa, millaista tietoa muuttujassa on. Tavallisimmat muuttujan tyypit ovat merkkijono ja lukuarvo.
Merkkijonomuuttuja sisältää tekstiä. Koodissa merkkijonon ympärille kirjoitetaan lainausmerkit (""
) tai heittomerkit (''
). Esimerkiksi "abc"
, "Helsinki"
ja "tulin, näin, voitin"
ovat merkkijonoja.
Lukuarvomuuttuja sisältää kokonaisluvun tai desimaaliluvun. Lukuarvo kirjoitetaan koodiin sellaisenaan, ja jos kyseessä on desimaaliluku, käytetään desimaalipistettä. Esimerkiksi 5
, 1741
ja 8.22
ovat lukuarvoja.
Merkkijonon voi muodostaa osista laittamalla osien väliin pisteen (.
). Seuraava koodi havainnollistaa tätä:
<?php $etunimi = "Aapeli"; $sukunimi = "Koodinen"; $kokonimi = $etunimi . " " . $sukunimi; echo $kokonimi; ?>
Koodin tulostus on seuraava:
Aapeli Koodinen
Koodissa muuttujaan $kokonimi
tulee ensin muuttujan $etunimi
sisältö, sitten välilyönti ja lopuksi muuttujan $sukunimi
sisältö. Niinpä muuttujan sisällöksi tulee "Aapeli Koodinen", jonka koodi myös tulostaa.
Toisaalta muuttujat voi kirjoittaa myös suoraan merkkijonon sisään:
<?php $etunimi = "Aapeli"; $sukunimi = "Koodinen"; $kokonimi = "{$etunimi} {$sukunimi}"; echo $kokonimi; ?>
Huomaa, että tämä merkintätapa toimii vain silloin, kun merkkijonon ympärillä on lainausmerkit. Jos merkkijonon ympärillä on heittomerkit, muuttujat säilyvät käsittelemättöminä tekstissä.
Muuttujilla voi laskea seuraavaan tapaan:
<?php $leveys = 10; $korkeus = 12; $pintaala = $leveys * $korkeus; $piiri = 2 * $leveys + 2 * $korkeus; echo "Pinta-ala on {$pintaala} ja piiri on {$piiri}"; ?>
Koodin tulostus on seuraava:
Pinta-ala on 120 ja piiri on 44.
Jos muuttujan arvo lasketaan sen vanhan arvon perusteella, voidaan käyttää mm. seuraavia lyhennysmerkintöjä:
$a++
on sama kuin $a = $a + 1
$a--
on sama kuin $a = $a - 1
$a += $b
on sama kuin $a = $a + $b
$a -= $b
on sama kuin $a = $a - $b
Esimerkiksi seuraavat koodit vastaavat toisiaan:
<?php $vuosi = 1960; $vuosi = $vuosi + 1; echo "Vuosi: " . $vuosi; ?>
<?php $vuosi = 1960; $vuosi++; echo "Vuosi: " . $vuosi; ?>
Merkinnällä ??
voi tuottaa vaihtoehtoisen arvon siinä tapauksessa, että muuttujaa ei ole tai muuttujassa on erityinen tyhjää merkitsevä arvo null
. Tästä on hyötyä esimerkiksi silloin, kun jotain tietoa pitäisi saada käyttäjältä: jos jostain syystä tieto puuttuu kokonaan, koodi ei pääty virheeseen, vaan puuttuvan arvon tilalle voidaan ottaa oletusarvo.
<?php $nimi = $_POST["nimi"] ?? "(tyhjä)"; echo "Nimesi on " . $nimi; ?>
Tässä $_POST
viittaa lomakkeessa olevaan kenttään, kuten seuraavassa esimerkissä tarkemmin nähdään. Esimerkiksi tyhjä teksti ""
tai luku 0 ovat kelvollisia arvoja, joten ??
-merkintä ei muuta niitä miksikään. Kuitenkin hakkeri voi poistaa koko kentän lomakkeelta ennen lähetystä, ja ??
-merkinnällä voi välttää virheen tällaisessa tilanteessa.
Tavallinen tapa välittää tietoa PHP-koodille on tehdä lomake, jonka kautta käyttäjä voi antaa tietoa. Lomake tehdään HTML:n form
-rakenteella. Esimerkiksi seuraava lomake kysyy käyttäjältä tuntipalkan ja tuntimäärän. Tarkoituksena on laskea tämän perusteella kokonaispalkka.
<!DOCTYPE html> <html> <head> <title>Palkkalaskuri</title> </head> <body> <form action="palkka.php" method="post"> Tuntipalkka: <input type="text" name="tuntipalkka"> <br> Tuntimäärä: <input type="text" name="tuntimaara"> <br> <input type="submit" value="Lähetä"> </form> </body> </html>
Lomakkeessa on kaksi tekstikenttää, joiden nimet ovat tuntipalkka
ja tuntimaara
. Kun käyttäjä painaa lähetysnapista, tekstikenttien sisällöt välittyvät PHP-sivulle palkka.php
. Tämän sivun koodi on seuraava:
<?php $tuntipalkka = $_POST["tuntipalkka"] ?? 0; $tuntimaara = $_POST["tuntimaara"] ?? 0; $yhteispalkka = $tuntipalkka * $tuntimaara; echo "Yhteispalkka: " . $yhteispalkka; ?>
Koodi hakee muuttujiin $tuntipalkka
ja $tuntimaara
lomakkeen kenttien tuntipalkka
ja tuntimaara
arvot. Tässä $_POST
viittaa lomakkeessa olevaan kenttään. Tämän jälkeen koodi kertoo tuntipalkan tuntimäärällä ja sijoittaa tuloksen muuttujaan $yhteispalkka
. Lopuksi koodi tulostaa muuttujan $yhteispalkka
sisällön sivulle.
Seuraavan esimerkin tarkoituksena on laskea käyttäjän nimen pituus. Käyttäjä antaa nimensä seuraavan lomakkeen kautta:
<!DOCTYPE html> <html> <head> <title>Nimen pituus</title> </head> <body> <form action="nimenpituus.php" method="post"> Mikä on nimesi? <input type="text" name="nimi"> <br> <input type="submit" value="Lähetä"> </form> </body> </html>
Tiedostossa nimenpituus.php
on seuraava koodi:
<?php $nimi = $_POST["nimi"] ?? "Huijari"; $pituus = strlen($nimi); echo "Nimesi on {$nimi} ja siinä on {$pituus} kirjainta."; ?>
Koodissa on käytössä funktio strlen
, joka laskee sille annetun merkkijonon merkkien määrän. PHP-kielen osana on paljon valmiita funktioita merkkijonojen käsittelyyn, joista tärkeimmät tulevat tutuksi opassarjan kuluessa.
Huomaa, että funktio strlen
ilmoittaa merkkijonon pituuden liian suureksi, jos käytössä on UTF-8-merkistökoodaus ja merkkijonossa on ääkkösiä. Lisätietoa asiasta on oppaassa 17.
Mitä edellisessä esimerkissä tapahtuu, jos käyttäjä antaa nimekseen <h1>Aapeli</h1>?
Koodi tulostaa käyttäjän antaman nimen sellaisenaan HTML-sivulle, joten selain muotoilee nimessä olevan HTML-koodin. Ongelmana on, että vieras HTML-koodi voi sotkea sivua ja aiheuttaa jopa turvallisuusriskin, jos siihen liittyy JavaScript-koodia.
HTML:n käsittelyn pystyy estämään funktiolla htmlspecialchars
. Funktio muuttaa käytännössä merkit < ja > muotoon <
ja >
, jolloin selain ei tulkitse tekstissä mahdollisesti olevia HTML-tageja.
Edelliseen koodiin funktion voisi kytkeä seuraavasti:
<?php $nimi = $_POST["nimi"] ?? "Huijari"; $pituus = strlen($nimi); $nimi = htmlspecialchars($nimi); echo "Nimesi on {$nimi} ja siinä on {$pituus} kirjainta."; ?>
Käytännössä HTML:n käsittely kannattaa estää aina, jos merkkijonon arvona voi olla mitä tahansa tekstiä eikä ole erityistä syytä sallia HTML:n käyttämistä.
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.