Web-julkaisemisen opas, luku 3 Lisukkeet: Mitä kaikkea voisikaan lisäksi tehdä:

Palvelinskriptit (server-side scripting)

Sisällys

"Kaikki on mahdollista"

Tämän oppaan toisessa luvussa kuvattiin lomakkeiden käytön alkeita, ja siinä yhteydessä mainittiin myös, että lomakkeita käytettäessä varsinaisen työn tekee palvelinskripti.

Palvelinskriptiksi voidaan asentaa periaatteessa mikä hyvänsä ohjelma tai skripti. Sanoilla "ohjelma" ja "skripti" ei ole selvää eroa. Usein skripti tarkoittaa suhteellisen yksinkertaista ohjelmaa, joka on tavallisesti kirjoitettu tarkoitukseen sopivalla ohjelmointikielellä, skriptikielellä.

Teknisellä tasolla palvelinskripti voi esimerkiksi lukea ja kirjoittaa palvelimessa olevia tiedostoja ja tietokantoja, lähettää meilejä tai fakseja ja ylipäänsä tehdä kaikkea, mitä voidaan tehdä palvelinjärjestelmän laitteilla tai niiden kautta. Turvallisuus- ja muista syistä toimintamahdollisuuksia on usein rajoitettu, joten mainittu periaatteellinen mahdollisuus koskee ensisijaisesti Web-palvelimen ylläpitohenkilöstöä.

Jonkinlaisen kuvan siitä, millaisiin erilaisiin tarkoituksiin on käytännössä tehty palvelinskriptejä, antaa CGI Resource Indexin kohta Programs and Scripts. Lisäksi on tietenkin olemassa täysin sovelluskohtaisia skriptejä.

Jotta voisit käytännössä tehdä jonkin asian palvelinskriptillä (ja siihen liittyvällä lomakekäyttöliittymällä), tarvitset jommmankumman seuraavista:

Tekniikkaa: PHP, CGI, ASP...

Teknisesti skripti voi olla toteutettu monella eri tavalla. PHP-ohjelmointikielellä toteutettu sivu (jollaisen toisinaan tunnistaa siitä, että osoite loppuu .php eikä .html) on nykyään yleisin pienten sivustojen käytössä. Jäljempänä on lyhyitä PHP-esimerkkejä; muista tekniikoista on vain linkkejä tietolähteisiin.

Vanhin tekniikka on CGI-rajapinta. Se ei ole ohjelmointikieli vaan liityntä, jota voi käyttää mikä tahansa ohjelmointikieli; yleisin käytetyistä kielistä on Perl. Valmiita CGI-skriptejä on moniin tarkoituksiin vapaasti saatavilla, mutta nykyään myös PHP-kielisiä versioita löytyy lähes yhtä paljon.

Käytännössä palveluntarjoajasi ratkaisut määräävät, voitko lainkaan asentaa palvelinskriptejä. Lisäksi palveluntarjoajasi määrää, mitä liityntätekniikkaa käytetään ja millä ohjelmointikielellä tai -kielillä voit kirjoittaa skriptejä. Palveluntarjoajien tavallisimmat vaihtoehdot ovat (1) "eioo", (2) PHP ja (3) CGI, jossa kielenä Perl on tai C (tai molemmat vaihtoehdot).

Muita vaihtoehtoja ovat mm. ASP (ks. myös ASP FAQ) ja Java servlet -tekniikka. Nämä ovat käytettävissä selvästi harvemmin kuin PHP ja CGI.

Äänestetään!

On monia asioita, joita usein halutaan tehdä Webissä ja joita ei voi tehdä, ei ainakaan läheskään niin helposti kuin luullaan ja luulotellaan. Tyypillinen esimerkki tästä on kunnollisen äänestyksen tai mielipidetutkimuksen järjestäminen.

Äänestyksiä, mielipidetutkimuksia yms. on ruvettu yleisesti järjestämään Webissä. Monestakin syystä ne ovat useimmiten ihan huuhaata, ainakin jos niiden väitetään antavan yleistettävissä olevia tuloksia tyyliin "42 % suomalaisista - -" tai edes "42 % suomalaisista Internetin käyttäjistä - -". Useinkaan ei ole estetty edes moninkertaista äänestämistä, saati että äänestäjien joukko olisi otos jostakin tunnetusta perusjoukosta. Mutta monta hyvää lehtijuttua on pilattu faktojen tarkistamisella ja monta hyvää "Internet-kyselyä" tilastotieteen alkeiden tuntemisella. Niin ei ole erehdytty tekemään esim. Valittujen Palojen "kyselytutkimuksissa", joista tehdyt jutut aloitetaan komeasti tyyliin "85 prosenttia suomalaisista - -".

Varsin usein vielä lisäksi kutsutaan äänestystä tms. "gallupiksi". "Gallup" on todellisuudessa rekusteröity tavaramerkki. Nimitystä ei pidä käyttää edes oikeista mielipidetutkimuksista elleivät ne ole tavaramerkin haltijan tekemiä.

Luotettava äänestäminen, otantatutkimus tms. Webissä on mahdollista lähinnä silloin, kun osallistujien joukko on selvästi määritelty, esim. jonkin yhdistyksen jäsenet, ja on (mieluiten laillisesti) saatavissa rekisteri heidän osoitetiedoistaan. Silloin kullekin äänioikeutetulle tai otokseen valikoituneelle voidaan toimittaa esimerkiksi käyttäjätunnuksen ja salasanan yhdistelmä, jolla voi äänestää yhden kerran. Tällöin virhelähteitä ja väärinkäytön mahdollisuuksia on suurin piirtein vain sen verran kuin äänestyksissä ja otantatutkimuksissa yleensäkin.

On tehty paljonkin sellaisia "äänestyksiä" tai "tutkimuksia", joissa vain pannaan Web-sivulle lomake, jonka kuka hyvänsä voi täyttää ja lähettää ja niin saada äänensä tai vastauksensa huomioon otetuiksi. Sen voi tehdä hyvinkin helposti, ja tulokset ovat silloin yleensä roskaa pahemmat. Joissakin tilanteissa, mahdollisesti erinäisiä melko vaativia tekniikoita käyttäen, voidaan ehkä kehittää systeemi, joka tuottaa jotain mielekästä. Lisäksi jos äänestyksen kohde ei herätä suuria intohimoja vaan on luokkaa ”kumpi näistä naamakuvistani miellyttää enemmän”, tulokset yleensä antavat jotain suuntaa. Kukaan tuskin viitsii häiriköidä sellaista äänestystä.

Ulkopuolisen skriptin käyttö (esimerkkinä vieraskirja)

Ensimmäisessä osassa esitettiin jo lyhyesti hakulomake, joka käyttää muualla olevaa valmista skriptiä. Sellaisen tekeminen edellyttää paitsi HTML:n lomakerakenteiden osaamista myös sitä, että tiedetään tai päätellään, miten skripti toimii ulkonaisesti katsottuna: mitä sille pitää "syöttää", jotta se saataisiin tekemään haluttu asia. Hakuskriptien tapauksessa tämä voi vaatia arvailua, joten katsotaanpa selvempää tilannetta.

Aika usein aloitteleva Web-sivujen tekijä haluaa sivuilleen vieraskirjan (guestbook). Tämä tarkoittaa järjestelmää, jonne kuka hyvänsä voi kirjoittaa viestin ja josta kuka hyvänsä voi lukea muiden kirjoittamia viestejä. Usein vieraskirja tehdään sivulle ennen omaa sisältöä, jolloin vaikutelma on lähinnä säälittävä.

Vieraskirjat täyttyvät helposti roskasta, koska osa kävijöistä on häiriköitä ja töhertelijöitä. Suurempi ongelma ovat hakukonespammerit, jotka yrittävät huijata esimerkiksi Googlea luulemaan omaa sivuaan suosituksi. Google nostaa hakutuloksissa ylemmäs sivun, johon osoittaa paljon linkkiä. Jotkut ovat tehneet ohjelmia, jotka automaattisesti täyttävät vieraskirjoja pelkillä linkeillä.

Voisimme valita CGI Resource Indexin asianomaisesta osasta, Programs and Scripts: Remotely Hosted: Guestbooks, jonkin vaihtoehdon, tutustua sen käyttöohjeisiin ja rakentaa vieraskirjan. Itse asiassa tässä oppaassa oli aiemmin esimerkkinä eräs sellainen. Nyttemmin kyseinen palvelu on poistunut. Ilmaispalvelujen varaan ei todellakaan kannata rakentaa paljoakaan. TANSTAAFL!

Muuan erityisesti suomalaisille tarkoitettu ilmainen vieraskirjapalvelu on Freebok. Se kertoo: "Palvelun avulla vieraskirjan käyttöönotto on helppoa eikä vaadi kokemusta ohjelmoinnista: rekisteröinnin jälkeen lisäät vain sivuillesi linkin uuteen vieraskirjaasi!" Ja tämä näyttäisi pitävän paikkansa. Rekisteröinnin jälkeen tulee tieto, millaiset linkit sivulle tarvitaan vieraskirjaa varten. Seuraavassa on tämän oppaan vieraskirjaa varten tekemäni linkit:

Kyseiseen vieraskirjaan, kuten moneen muuhun, on kirjoitettu lähinnä eri sivustojen mainoksia. Vakavasti otettavan vieraskirjan ylläpitäminen vaatisi käytännössä valvontaa ja roskaviestien poistamista.

Ulkopuoliset, ilmaiseksi tarjolla olevat skriptit voivat kadota ilman ennakkovaroitusta. Sivuntekijän kannalta turvallisempi on oman palveluntarjoajan valmiiksi asentama skripti. Käyttö ei eroa ulkopuolisen skriptin käytöstä. Moni palveluntarjoaja antaa asiakkaidensa käyttöön valmiin skriptin palautelomakkeen tekoa varten, harvempi muihin tarkoituksiin.

PHP, alkeiden perusteet

PHP on yksinkertaisin tapa omien palvelinskriptien tekemiseen. Aloita tekemällä normaali HTML-sivu (huomioiden pakolliset kuviot), mutta nimeä se .php-loppuiseksi ja kirjoita runko-osaan seuraava rivi:

<P>Tänään on <?php $aika=getdate(); print $aika['weekday']; ?>.

Jos kaikki meni hyvin, olet nyt tehnyt sivun jossa lukee esimerkiksi "Tänään on perjantai." tai "Tänään on monday.", riippuen viikonpäivästä ja palvelimen asetuksista. Jos homma ei toiminut, ei palveluntarjoajasi ehkä tue PHP:ta. Voi myös olla, että PHP on otettava erikseen käyttöön, tai siitä peritään lisämaksu, tai sivu pitääkin nimetä .phtml, tai jotain muuta. Lue palveluntarjoajan ohjeet!

PHP-osa alkoi koodilla <?php ja loppui ?>. Kaikki sen ulkopuolella tulkittiin normaalina HTML:nä. Selaimelle siis annettiin ensin <P>Tänään on , sitten PHP:n tuloste, ja lopuksi piste. PHP-ohjelma koostui kahdesta lauseesta. Ensimmäinen sijoitti senhetkisen ajan muuttujaan $aika, toinen tulosti tämän muuttujan kentän (komponentin) 'weekday'.

Yleiskatsauksellisuuden vuoksi lomakkeessa on käytetty yksinkertaistettua merkkausta. Todellisessa lomakkeessa olisi hyvä mm. määritellä kenttien ja niiden selitysten vastaavuudet LABEL-elementin avulla.

Toisena esimerkkinä tehdään yksinkertainen palautelomake. Aloita tekemällä HTML-tiedosto, johon tulee seuraava lomake:

<FORM ACTION="laheta.php" METHOD="post">

<P>Nimesi: <INPUT TYPE="text" NAME="nimi">

<P>Sukupuolesi:<BR>
<INPUT TYPE="radio" NAME="sukupuoli" VALUE="1">Mies<BR>
<INPUT TYPE="radio" NAME="sukupuoli" VALUE="2">Nainen

<P>Kommentit tekstistä "Sukupuolen vaikutus PHP-ohjelmointiin":

<TEXTAREA NAME="palaute" ROWS=10 COLS=60>
</TEXTAREA>

<P><INPUT TYPE="submit" VALUE="Lähetä">
</FORM>

Tämän jälkeen tehdään laheta.php, joka tekee varsinaisen työn. Pakollisten kuvioiden jälkeen lisää seuraava:

<?php

if (strlen($HTTP_POST_VARS['nimi']) == 0) {
    print "<P>Nimi puuttuu! Palaa takaisin!";
} else {
    print "<P>Lähetän viestin.";
    mail('oma.osoitteesi@domain.example', 'Palaute WWW-lomakkeelta',
     "Nimi: ".$HTTP_POST_VARS['nimi']."\n".
     "Sukupuoli: ".$HTTP_POST_VARS['sukupuoli']."\n\n".
     "Viesti: ".$HTTP_POST_VARS['palaute']);
}

?>

Esimerkissä on hyvin alkeellinen tarkistus: nimeksi pitää syöttää jotain. Sitä, että herrat Aku Ankka ja Mikki Hiiri lähettävät palautetta, ei kuitenkaan voi estää.

Liityntä HTML:n ja palvelinskriptin välillä on hyvin yksinkertainen: kun HTML-lomakkeessa on lomakkeen elementillä name-attribuutin arvo xyz, se näkyy PHP-skriptille muuttujana $HTTP_POST_VARS['xyz'] tai $HTTP_GET_VARS['xyz'], riippuen siitä onko form-elementin method-attribuuttina post vai get.

PHP-kielen virallinen sivusto on php.net, jossa on myös manuaali. Suomeksikin on olemassa monenlaisia ohjeita, esimerkiksi Jarkko Leponiemen kurssimateriaali Verkkopalvelut ja PHP tai Pauli Kujalan LuK-tutkielma Dynaamisten WWW-sivujen tuottaminen PHP-kielen avulla.

CGI-skriptin asentaminen

CGI-skriptin asennus vaatii ennen muuta sitä, että olet selvittänyt, miten skriptejä ylipäänsä asennetaan Web-palvelimeen, jota käytät. Tästä, kuten muistakin vastaavista asioista, saat tietoja omalta palveluntarjoajaltasi tai Web-palvelimen ylläpidolta. Suurin osa ongelmista skriptien asentamisessa johtuu siitä, että asiaa koskevia palvelinkohtaisia ohjeita ei ole saatu tai ei ole luettu tai ei ole ymmärretty. Ohjeiden taso vaihtelee. Usein ne on kirjoitettu olettaen, että lukija tuntee asiaan liittyviä tekniikoita aika paljon.

Yleistä taustatietoa antaa Lars Marius Garsholin kirjoittama How the web works: HTTP and CGI explained.

Erityisesti jos skripti on kirjoitettu Perl-kielellä, kuten suurin osa palvelinskripteistä on, tarvitset yleensä tiedon siitä, minne (millä polkunimellä) Perl-tulkki on asennettu. Jos Perl-skriptien asennuksessa Unix-järjestelmään tulee ongelmia, niin mainio tarkistuslista löytyy dokumentista The Idiot's Guide to Solving Perl CGI Problems, joka on nimeään paljon ystävällisempi (mutta edellyttää Unixin käytön perusasioiden tuntemista).

Lisäksi jonkun muun tekemän skriptin asennus vaatii skriptikohtaisesti ennen muuta seuraavan:

  1. Lue asennusohjeet. Jos skriptille ei ole asennusohjetta, älä asenna sitä.
  2. Lue asennusohjeet uudestaan. Jos et ymmärrä jotain, hanki taustatietoja.
  3. Tarkista, oletko ymmärtänyt asennusohjeet oikein. Jos et, palaa kohtaan 1. Jos mielestäsi olet, lue ne kuitenkin vielä kerran uudestaan.
  4. Kun jotain menee pieleen, mene kohtaan 1.

Siinäpä se suunnilleen onkin. Käytetyn ohjelmointikielen (Perl, C, joskus jokin muu) tuntemus ei periaatteessa ole välttämätöntä, jos haluat asentaa skriptin sellaisenaan ja sen asennusohjeet ovat hyvät.

Kun yrität ymmärtää toisaalta palvelinkohtaisia, toisaalta skriptikohtaisia ohjeita, niin CGI Resource Indexin osasta CGI Tutorials voi olla apua.

CGI-skriptien tekeminen

Omien CGI-skriptien teko on yleensä hiukan PHP-sivun tekemistä vaativampaa. Kannattaa aloittaa jostakin helposta, esimerkiksi skriptistä, joka vain tulostaa Hello world. Sitten voi asteittain siirtyä vaativampiin toimintoihin. Käytäntö on osoittanut, että ohjelmoinnin aloituskynnys on korkea: kun olet saanut ajetuksi ensimmäisen ohjelmasi, teki se sitten miten triviaalin asian tahansa, olet jo ratkaissut monta ongelmaa.

Edellä mainittu CGI Tutorials sisältää monia erityyppisiä johdatuksia CGI-ohjelmointiin. Seuraavat minun kirjoittamani johdatukset aihepiiriin on tarkoitettu lähinnä havainnollistamaan, millaisista asioista on kyse: