Käytännön PHP-opas

Kirjoittaja: Antti Laaksonen [antti.laaksonen@mbnet.fi]

Osa 4 - PHP ja Internet-sivut

Opassarjan kolme ensimmäistä osaa ovat käsitelleet PHP-kieltä yleensä. Varsin yleinen käyttökohde on kuitenkin Internet-sivujen tekeminen. Tässä oppaassa käsitellään aiheeseen liittyviä asioita, kuten sivupohjien käyttöä ja tietojen välittämistä lomakkeiden kautta. Samalla selviää, kuinka PHP:llä lähetetään sähköpostia, ja miten toiselle sivulle ohjaaminen tapahtuu.

Sivupohjat

Sivupohjia käytetään yhä useammalla sivustolla. Pohja sisältää sivuston logon, valikot ja muut jokaiselle sivulle tulevat perusasiat. Jos sama pohja olisi kirjoitettu jokaiseen sivuun, pienikin muutos, kuten uuden valikkokohdan lisääminen, olisi työlästä tehdä. Siksi sivupohjat toteutetaankin usein esimerkiksi PHP:n avulla, jolloin riittää, että pohja löytyy yhdestä tiedostosta.

Käytämme esimerkkinä Villen korttipelisivua. Jokaisen sivun ylälaidassa on sivuston logo sekä valikkorivi. Lisäksi sivujen alalaidassa on tekijän nimi ja sähköpostiosoite. Moninpeleistä kertovan sivun koodi näyttää tältä:

***moninpelit.php

<html>
<head>
  <title>Villen korttipelisivu</title>
</head>
<body>
  <img src="logo.png">
  <p><a href="etusivu.php">Etusivu</a> | <a href="pasianssit.php">Pasianssit</a> | <a href="moninpelit.php">Moninpelit</a> | <a href="palaute.php">Palaute</a></p>
  <h1>Moninpelit</h1>
  <p>Omiin suosikkipeleihini kuuluvat pokeri ja skat, joista löytyykin paljon tietoa näiltä sivuilta...</p>
  <p>Kirjoittaja: <a href="mailto:ville@esimerkki.fi">Ville Virtanen</a></p>
</body>
</html>

Tarkoitus on, että sekä ylä- että alaosa on joka sivussa yhtenäinen. Ratkaisu on tehdä kaksi uutta tiedostoa, esimerkiksi yla.htm ja ala.htm. PHP:n include-komennolla niiden linkittäminen sivulle on helppoa.

***yla.htm

<html>
<head>
  <title>Villen korttipelisivu</title>
</head>
<body>
  <img src="logo.png">
  <p><a href="etusivu.php">Etusivu</a> | <a href="pasianssit.php">Pasianssit</a> | <a href="moninpelit.php">Moninpelit</a> | <a href="palaute.php">Palaute</a></p>

***ala.htm

  <p>Kirjoittaja: <a href="mailto:ville@esimerkki.fi">Ville Virtanen</a></p>
</body>
</html>

***moninpelit.php

<?php include("yla.htm"); ?>
  <h1>Moninpelit</h1>
  <p>Omiin suosikkipeleihini kuuluvat pokeri ja skat, joista löytyykin paljon tietoa näiltä sivuilta...</p>
<?php include("ala.htm"); ?>

Nyt kiinteä logo, valikko ja tekijän nimi ovat eri tiedostoissa, jolloin muutos kaikkiin sivuihin onnistuu yhtä tiedostoa muokkaamalla. Tietenkin include soveltuu moneen muuhunkin käyttöön: sen avulla voi yhdistää mitä tahansa sivun osia, myös PHP-koodia, toisiinsa.

Tietojen välitys

Olet varmaan huomannut joidenkin sivujen osoiterivillä kysymysmerkin, jota seuraa yksi tai useampi muuttujamäärittely. Tämä on yksi tapa välittää tietoa palvelimella olevalle skriptille. Esimerkiksi Googlen osoite voi näyttää seuraavalta, kun etsitään tietoa skat-pelistä:

http://www.google.fi/search?q=skat

Hakusana välittyy q-muuttujassa skriptille. Skripti muodostaa siitä edelleen tietokantakyselyn, jonka perusteella käyttäjälle palautuva sivu muodostuu. Monesti nämä muuttujat määräytyvät edellisellä sivulla olleen lomakkeen perusteella. Googlessa tämän lomakkeen tärkein osa on tekstikenttä, johon hakusana kirjoitetaan.

HTTP-protokollan tiedonvälitystapoja ovat get ja post. Get-muuttujat kulkevat sivun osoitteen (URL:n) mukana, ja siksi niiden ei ole mikään pakko tulla lomakkeista - yhtä hyvin muuttujat voivat olla skriptin tuottamia tai suoraan osoiteriville kirjoitettuja. Post on tarkoitettu suurempien tietomäärien välittämiseen. Siinä tieto kulkee palvelinpyynnön mukana eikä näy käyttäjälle.

Tietojen käsittely skriptissä

Otetaan esimerkiksi seuraava yksinkertainen lomake, joka sisältää tekstikentän sekä lähetysnappulan. Käyttäjän kirjoittama hakusana välitetään kasittely.php-skriptille getillä, joten se tulee näkyviin skriptin osoiteriville.

*** lomake.htm

<html>
<body>
  <form action="kasittely.php" method="get">
   <p>Hakusana: <input type="text" name="hakusana"> <br>
   <input type="submit" value="Lähetä"></p>
  </form>
</body>
</html>

PHP:n vanhoissa versioissa lomakkeiden kautta tai muutoin välitetyt muuttujat olivat käytössä skriptissä suoraan saman nimisinä muuttujina. Lomakkeeseen kirjoitettu hakusana olisi siis löytynyt muuttujasta $hakusana ja skripti olisi voinut olla seuraavanlainen:

*** kasittely.php

<?php
echo "Haettiin sanalla $hakusana.";
?>

Tämän huomattiin kuitenkin olevan joissain tapauksissa turvallisuusriski. Siksi uudemmissa PHP:n versioissa register_globals-asetus on usein poissa päältä, ja muun muassa getin ja postin kautta tulleet tiedot löytyvät omista taulukoistaan. Taulukoiden nimet ovat $_GET ja $_POST. Nyt skriptiä pitää muuttaa näin:

*** kasittely.php

<?php
echo "Haettiin sanalla ".$_GET['hakusana'].".";
?>

Kumpaako tapaa sitten pitäisi käyttää? Valinta riippuu PHP:n versiosta ja sen asetuksista sekä siitä, arvostaako enemmän helppoa muuttujien käsittelyä vai turvallisuutta. Itse tapaan käyttää mukavuudenhaluisena suoria muuttujia. Tämän oppaan skripteissä on kuitenkin käytössä uudempi, suositeltava, tapa, jotta en johtaisi ketään huonoille poluille.

Lomakkeen elementit

Lomakkeen elementit lähettävät erilaista tietoa skriptille. Tässä taulukossa on esitelty yleisimmät elementit ja annettu ohjeita niiden lähettämien tietojen tutkimiseen PHP-skriptissä.

Lähetyspainike ja tyhjennyspainike
KäyttötarkoitusLähetyspainike lähettää lomakkeen elementtien tiedot kohteena olevalle skriptille. Tyhjennyspainike tyhjentää elementit tai palauttaa ne oletusasentoihinsa.
Esimerkkikoodi

<input type="submit" value="Lähetä">
<input type="reset" value="Tyhjennä">

Ulkonäkö
Tekstikenttä ja salasanakenttä
KäyttötarkoitusTekstikenttä on yksirivinen tekstielementti. Salasanakenttä on salasanan pyytämiseen käytettävä tekstielementti. Se eroaa tekstikentästä siten, että merkit näkyvät tähtinä tai muina peitekuvioina.
Esimerkkikoodi

<input type="text" name="teksti" value="Teksti tähän.">

Ulkonäkö
Käsittely skriptissäTekstikenttään kirjoitettu teksti löytyy muuttujasta $_GET['teksti'] tai $_POST['teksti']. Salasanakenttä käyttäytyy täsmälleen samoin.
Tekstialue
KäyttötarkoitusTekstialue on useampia rivejä sisältävä tekstielementti.
Esimerkkikoodi

<textarea name="teksti">Ensimmäinen rivi.
Toinen rivi.
Kolmas rivi.</textarea>

Ulkonäkö
Käsittely skriptissäTekstialueeseen kirjoitettu teksti löytyy muuttujasta $_GET['teksti'] tai $_POST['teksti'].
Valintanappi
KäyttötarkoitusValintanapin avulla käyttäjä voi valita yhden monista vaihtoehdoista.
Esimerkkikoodi

<input type="radio" name="nappi" value="mies">mies <br>
<input type="radio" name="nappi" value="nainen">nainen

Ulkonäkö mies
nainen
Käsittely skriptissäSamaan ryhmään kuuluville valintanapeille on annettava sama name mutta eri value. Tällöin $_GET['nappi'] tai $_POST['nappi'] sisältää valitun vaihtoehdon, tässä tapauksessa "mies" tai "nainen".
Valintaruutu
KäyttötarkoitusValintaruudun avulla käyttäjä voi valita yhden, useamman tai ei yhdenkään vaihtoehdon.
Esimerkkikoodi

<input type="checkbox" name="ruutu1">radio <br>
<input type="checkbox" name="ruutu2">televisio <br>
<input type="checkbox" name="ruutu3">Internet

Ulkonäkö radio
televisio
Internet
Käsittely skriptissäJos valintaruutu on tyhjä, sen mukaisella muuttujalla ei ole arvoa. Jos valintaruutu on valittu, muuttujan arvo on "on". Jos ylläolevista ruuduista on valittu "televisio", muuttujan $_GET['ruutu2'] tai $_POST['ruutu2'] arvo on "on".
Valintalista
KäyttötarkoitusValintalista sisältää joukon vaihtoehtoja, joista valitaan tavallisesti yksi. Lista on oletuksena avautuva, joten se mahtuu valintanappeja pienempään tilaan.
Esimerkkikoodi

<select name="valinta">
<option value="mies">mies
<option value="nainen">nainen
</select>

Ulkonäkö
Käsittely skriptissäValintalista käyttäytyy samalla tavalla kuin valintanapit: $_GET['valinta'] tai $_POST['valinta'] sisältää valitun vaihtoehdon, joka on tässä tapauksessa "mies" tai "nainen".
Näkymätön tieto
KäyttötarkoitusNäkymätön tieto on skriptille muiden elementtien mukana kulkeva tieto, joka ei ole käyttäjän muokattavissa tai nähtävissä (muuten kuin HTML-koodista).
Esimerkkikoodi

<input type="hidden" name="sivu" value="palaute">

Käsittely skriptissäTieto, tässä "palaute", löytyy muuttujasta $_GET['sivu'] tai $_POST['sivu'].

Esimerkki: Palautesivu

Villen sivusto alkoi saavuttaa suosiota, ja niinpä hän päätti tehdä toiminnon, jolla käyttäjät voivat lähettää hänelle palautetta suoraan sivuston kautta. Usein kynnys palautteen lähettämiseen näin on sähköpostia pienempi - ja mikä on tärkeämpää sivun kehitykselle kuin käyttäjien palaute?

Ensin tarvitaan lomake, joka sisältää kysyttävät tiedot. Tässä lomakkeessa tiedot ovat lähettäjän nimi ja sähköpostiosoite, palauteteksti sekä vastauspyyntö.

***palaute.php

<?php include("yla.htm"); ?>
  <h1>Palaute</h1>
  <p>Tällä lomakkeella voit lähettää palautetta sivuistani.</p>
  <form action="laheta_palaute.php" method="post">
   <b>Nimi:</b> <br> <input type="text" name="nimi"> <br>
   <b>Sähköposti:</b> <br> <input type="text" name="sposti"> <br>
   <b>Palaute:</b> <br><textarea name="palaute">
   </textarea> <br>
   <b>Haluatko vastauksen?</b> <br>
   <input type="radio" name="vastaus" value="kylla"> Kyllä <br>
   <input type="radio" name="vastaus" value="ei"> En <br><br>
   <input type="submit" value="Lähetä palaute">
  </form>
<?php include("ala.htm"); ?>

Tämän jälkeen tarvitaan palautteen käsittelevä skripti. Tämä skripti yhdistää palautteeseen kaikkien lomakkeen elementtien sisällön, se on siis yleiskäyttöinen. Palautteen lähettäminen sähköpostiin onnistuu helposti mail-funktion avulla. Lopuksi käyttäjä ohjataan eteenpäin header-funktion avulla.

***laheta_palaute.php

<?php

//muodostetaan merkkijono $_POST-taulukon alkioista
foreach($_POST as $nimi => $arvo) {
   
$palaute .= $nimi.": ".$arvo."\n";
}

//lähetetään palaute PHP:n mail-funktiolla
$viesti = mail("ville@esimerkki.fi", "Palaute", $palaute);

//$viesti on true sähköpostin lähetyksen onnistuessa
if($viesti) {
   
//jos lähetys onnistui, käyttäjä ohjataan kiitossivulle
   
header("Location: kiitos.php");
} else {
   
//muussa tapauksessa käyttäjä ohjataan virhesivulle
   
header("Location: virhe.php");
}
?>

Loppusanat

Ensimmäinen palauteviesti kolahti Villen sähköpostilaatikkoon heti seuraavana päivänä. "PHP on melkein yhtä kova juttu Internet-ohjelmoinnissa kuin herttareeti pokeripelissä", tuumi Ville palautteen luettuaan. Tähän on hyvä lopettaa tämä opas, seuraava osa ilmestyy taas muutaman viikon kuluttua. Oppaan aiheesta ei ole vielä varmuutta, mutta todennäköisiä vaihtoehtoja ovat funktiot tai tiedostojen käsittely. osa 5

Antti Laaksonen, 23.3.2003