Kirjoittaja: Antti Laaksonen [antti.laaksonen@mbnet.fi]
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ä.
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