php.jpgJohdatus PHP-kieleen

Sisällysluettelo

JohdantoSyntaksiTietotyypitMuuttujatOperaattoritKontrollirakenteetTaulukotFunktiotLomakkeetTietokantaEvästeetSessiot

www.php.net

Lomakkeiden käsittely

Valmiiksi määritellyt muuttujat ylös

PHP luo automaattisesti vastaanotetuista lomaketiedoista taulukkotyyppisen muuttujan. Käytettävä muuttuja riippuu lomakkeen käyttämästä metodista. Get-metodilla lähetetyistä tiedoista syntyy taulukko $_GET ja post-metodilla lähetetyistä tiedoista taulukko $_POST. Lomakkeista on hyvä huomata, että lomakekenttien arvot ovat aina merkkijonoja.

Lomakkeella lähetettyihin tietoihin viitataan aina lomakekentän nimen eli name-attribuuttiin sijoitetun arvon perusteella. Automaattisesti muodostuvan taulukkomuuttujan solun avaimeksi tulee vastaavan lomakekentän nimi. Siis esimerkiksi get-metodilla lähetettyyn "etunimi" nimiseen lomakekenttään viitataan seuraavasti.

$_GET["etunimi"]

Varoitus: Useissa oppaissa kerrotaan virheellisesti, että lomakekentän nimestä syntyy saman niminen muuttuja. Sen mukaisesti esimerkiksi "etunimi" nimisestä lomakekentästä alustuu PHP:ssa automaattisesti $etunimi niminen muuttuja. Hämäävästi tämä vielä toimii yliopiston palvelimella. Kuitenkin oletusasetuksin asennetuissa uudemmissa PHP:n versioissa se ei enää toimi. Lomakkeiden käsittelyyn on siis viisasta käyttää $_GET ja $_POST muuttujia.

Esimerkki ylös

Kaikissa input-tyyppisissä lomake-elementeissä lähetettävä arvo sijoitetaan value-attribuuttiin. Teksti- ja salasanakentissä luonnollisesti lähetetään kenttään syötetty teksti. Valintalistassa lähetetään valitun option-elementin value-attribuuttiin sijoitettu arvo. Tekstialueesta taas lähetetään luonnollisesti elementtiin kirjoitettu teksti tai oletusteksti. Seuraavassa on yksinkertainen esimerkki lomakekenttien tulostamisesta.

XHTML-lomake


Lomakkeen XHTML-koodi

...
<form action="handler.php" method="get">
  <p>
    <label for="nimi">Nimi: </label>
    <input id="nimi" type="text" name="nimi" size="50" />
  </p>
  <p>
    <label for="mies">Mies</label>
    <input id="mies" type="radio" name="sukupuoli" value="mies" /> 
    <label for="nainen">Nainen</label>
    <input id="nainen" type="radio" name="sukupuoli" value="nainen" />
  </p>
  <p>
    <label for="lisa">Lisätietoja</label><br />
    <textarea id="lisa" name="lisa" cols="40" rows="5"></textarea>
  </p>
  <p>
    <input type="submit" name="nappi" value="Lähetä" />
  </p>
</form>
...

Käsittelijän PHP-koodi

...
echo $_GET["nimi"];
...
echo $_GET["sukupuoli"];
...
echo $_GET["lisa"];
...

Lomaketietojen tarkistaminen ylös

Usein on tarpeen tarkistaa lomaketiedot jollain tavalla ennen kuin niille tehdään halutut toimenpiteet. Kun tämä tarkistus halutaan tehdä PHP:ssä, on hyvä tapa sijoittaa lomake ja sen käsittelevä koodi samaan tiedostoon. PHP:ssä määritellään sitten ehtolauseiden avulla, mikä osa sivusta toteutetaan milläkin suorituskerralla. Aluksi luonnollisesti näytetään käyttäjälle tyhjä lomake. Sen jälkeen, kun lomaketiedot on lähetetty, ne ensin tarkistetaan. Jos tiedot kelpuutetaan, ei enää näytetä käyttäjälle lomaketta, vaan toteutetaan lomakkeen käsittelevä osa koodista. Jos tiedoissa on puutteita, näytetään lomake uudestaan ja pyydetään korjaamaan syötettä. Alla on esimerkki tämän toteuttavasta koodista.

... sivun alkuosa
<?php 
  $ehto = false;
  if(isset($_GET["nappi"])){
    if(... ehto, joka tarkistaa lomakekentissä vikaa ...)
      $ehto = true;
  }
  if(!isset($_GET["nappi"]) || $ehto){ //Jätetään sulku auki ?>

...
Lomakeosa XHTML-koodista
...

<?php } //if-osan loppu
  else{
    ...Lomakkeen käsittelevä koodi
  }
?>
... sivun loppuosa

Esimerkissä on oletuksena, että käytetyllä lomakkeella on nappi-niminen submit-nappula ja että lomake käyttää get-metodia. Siinä tutkitaan isset()-funktiolla, onko $_GET["nappi"] nimistä muuttujaa olemassa. Jos on, tiedetään, että jotain lomaketietoa on vastaanotettu. Jos sitä ei ole olemassa, tiedetään, että sivulle tullaan ensimmäistä kertaa. Seuraavaksi on muodostettava ehto, joka tutkii, onko lomaketiedoissa jotain korjattavaa, jos yleensäkin lomaketietoa on vastaanotettu. Sitten saadaan aikaan ehto, jonka mukaan ensimmäistä kertaa sivulle tultaessa tai lomaketietoja korjatessa näytetään lomake. Muussa tapauksessa siirrytään suoraan else-osaan eli tehdään lomaketietojen käsittely.

Useamman vaihtoehdon valitseminen ylös

PHP:ssä on pieni puute siinä tapauksessa, kun valintaruuduista tai valintalistasta halutaan valita useampi vaihtoehto kerralla. Jos esimerkiksi valintaruuturyhmässä nimeltä kulkuneuvo valitaan useampi vaihtoehto ja käytetään get-metodia, kutsuttu URL on seuraavaa muotoa.

http://www.palvelin.com/sivu.php?kulkuveuvo=juna&kulkuveuvo=auto

Tässä tapauksessa PHP:n puute on se, että se ei osaa muodostaa automaattisesti taulukkoa $_GET["kulkuneuvo"]-muuttujan arvoksi. Sen sijaan muuttujan arvoksi sijoitetaan yksi kerrallaan vastaanotetut lomakkeen kentät. Lopputuloksena siis $_GET["kulkuneuvo"] arvoksi jää viimeinen valittu vaihtoehto ja tieto muista valinnoista hukkuu.

Ratkaisu

PHP:ssä ongelmaan joudutaan käyttämään hiukan keinotekoista ratkaisua. Silloin, kun lomakekentälle sallitaan useampi arvo, täytyy se nimetä XHTML-koodissa muotoon kulkuneuvo[]. Silloin PHP luo $_GET["kulkuneuvo"]-muuttujan arvoksi taulukon, joka sisältää kaikki valitut lomakekentät. Sama koskee myös valintalistan käyttöä silloin, kun siinä sallitaan käyttäjän valita useampi vaihtoehto.

Tiedoston lataus palvelimelle ylös

WWW-lomake tiedoston latauksessa

WWW-lomakkeen avulla voidaan siirtää myös paikallisia tiedostoja palvelimelle. Tätä varten on lomakkeella oltava tiedostokenttä. Se määritellään XHTML-koodissa antamalla input-elementin type-attribuutille arvo "file". Tiedostoja siirrettäessä täytyy lomakkeen käyttää post-metodia tietojen välittämiseen. Lisäksi lomake-elementille (form) määrittää enctype-attribuutille arvo "multipart/form-data". Muuten tiedoston siirto ei onnistu. Alla on esimerkki lomakkeen XHTML-koodista.

<form action="jokusivu.php" method="post" enctype="multipart/form-data">
  <p>
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <input type="file" name="tiedosto" />
  </p>
</form>

Lomakkeelle voidaan laittaa esimerkin mukainen MAX_FILE_SIZE niminen piilokenttä, jolle annetaan tavuina suurin sallittu siirrettävän tiedoston koko. PHP-tulkki hoitaa silloin automaattisesti asetetun kokorajoituksen siten, että tiedoston siirto palvelimelle ei onnistu, jos käyttäjän valitseman tiedoston koko ylittää rajoituksen. Kannattaa ottaa huomioon, että myös PHP:n asetukset vaikuttavat sallittuun tiedoston maksimikokoon. Oletusasetuksissa PHP sallii korkeintaan 2 Mt:n tiedostojen siirron palvelimelle.

Ladatun tiedoston käsittely PHP:ssä

PHP kirjoittaa tiedoston latauksen onnistuessa ensin tiedoston tulkin asetuksissa määriteltyyn tilapäiskansioon. Ohjelmoijan tehtäväksi jää siirtää tiedosto palvelimella haluttuun paikkaan. PHP muodostaa automaattisesti www-lomakkeelta ladatun tiedoston tiedoista esimääritellyn taulukkotyyppisen muuttujan $_FILES. $_FILES sisältää seuraavat tiedot (['tiedosto'] viittaa lomakkeen tiedostokentän name-attribuuttiin):

Alla on esimerkki tiedoston vastaanottamisesta PHP:n avulla:

<?php
  $polku = "tiedostot/".$_FILES['tiedosto']['name'];
  if(move_uploaded_file($_FILES['tiedosto']['tmp_name'], $polku)){
    echo "Tiedoston siirto palvelimelle onnistui!";
  } else{
    ... Asianmukaiset vierheilmoitukset
  }
?>

Esimerkissä käytetään move_uploaded_file()-funktiota tiedoston siirtämiseen palvelimella. Funktio palauttaa false, jos tiedosto ei ole validi lomakkeelta ladattu tiedosto tai tiedoston siirto palvelimella ei onnistu. Tiedosto siirretään siis onnistuneessa tapauksessa sivun oman hakemiston alla olevaan "tiedostot" nimiseen hakemistoon. Funktion epäonnistuessa on hyvä tutkia vieheen syy ja antaa siitä asianmukainen palaute. Virheen syy voi olla esimerkiksi liian suuri tiedosto.

Haluttaessa voidaan ensin tutkia is_uploaded_file()-funktiolla, onko tiedoston siirto palvelimelle onnistunut. Se tekee siis samanlaisen tarkistuksen kuin move_uploaded_file(), mutta ei siirrä tiedostoa.

Hyödyllisiä funktioita ylös

is_uploaded_file()

Tarkistaa, onko parametrina annettu tiedosto kelvollinen www-lomakkeen kautta palvelimelle ladattu tiedosto. Parametrina annetaan polku tilapäistiedostoon, jonka PHP kirjoittaa palvelimelle tiedoston latauksen yhteydessä, esim. $_FILES['tiedosto']['tmp_name']. Palautusarvo on true tai false.

move_uploaded_file()

Tekee samanlaisen tarkistuksen kuin is_uploaded_file() ja siirtää sen lisäksi tiedoston haluttuun paikkaan. Parametreina annetaan tilapäistiedoston polku ja polkuineen tiedosto, johon tilapäistiedosto kirjoitetaan. Funktio palauttaa false, jos annettu tilapäistiedosto ei ole kelvollinen www-lomakkeen kautta palvelimelle ladattu tiedosto tai, jos tidoston siirto ei onnistu. Katso esimerkki edellisestä kappaleesta tällä sivulla.