Kirjautuminen

Haku

Tehtävät

Oppaat: PHP-ohjelmointi: Osa 2 - Muuttujat

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat
  3. Osa 3 - if-rakenne
  4. Osa 4 - for-silmukka
  5. Osa 5 - Taulukot
  6. Osa 6 - Lomakkeet
  7. Osa 7 - Nettisivusto
  8. Osa 8 - Lisää silmukoista
  9. Osa 9 - Tiedostot
  10. Osa 10 - Omat funktiot
  11. Osa 11 - Istunnot
  12. Osa 12 - Tietokannat
  13. Osa 13 - Tietoturva
  14. Osa 14 - Olio-ohjelmointi
  15. Osa 15 - Kuvien luonti
  16. Osa 16 - Säännölliset lausekkeet
  17. Osa 17 - Merkistöt
  18. Osa 18 - PHP:n ongelmat

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.

Muuttuja

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.

<?php
$nimi = "Aapeli";
$vuosi = 1960;
echo $nimi;
echo $vuosi;
echo $nimi;
?>

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.

Merkkijono osista

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ä.

Laskutoimitukset

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ä:

Esimerkiksi seuraavat koodit vastaavat toisiaan:

<?php
$vuosi = 1960;
$vuosi = $vuosi + 1;
echo "Vuosi: " . $vuosi;
?>
<?php
$vuosi = 1960;
$vuosi++;
echo "Vuosi: " . $vuosi;
?>

Muuttujan olemassaolo

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.

Esimerkki: Palkkalaskuri

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;
?>

Kokeile koodia

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.

Esimerkki: Nimen pituus

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.

HTML:n estäminen

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 &lt; ja &gt;, 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.";
?>

Kokeile koodia

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ä.


Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta