Kirjautuminen

Haku

Tehtävät

Opasarkisto: Käytännön PHP-opas: Osa 4 - PHP ja Internet-sivut

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat ja taulukot
  3. Osa 3 - Komentorakenteet
  4. Osa 4 - PHP ja Internet-sivut
  5. Osa 5 - Tiedostojen käsittely
  6. Osa 6 - Funktiot
  7. Osa 7 - Evästeet ja istunnot
  8. Osa 8 - Tietokannat (MySQL)
  9. Osa 9 - Vinkkejä ja vihjeitä

Kirjoittaja: Antti Laaksonen. Vuosi: 2003.

Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi.

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 muuten välitetyt muuttujat olivat käytössä skriptissä suoraan samannimisinä muuttujina. Lomakkeeseen kirjoitettu hakusana olisi siis löytynyt muuttujasta $hakusana ja skripti olisi voinut olla seuraavanlainen:

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

Nykyään kuitenkin tämä asia tehdään toisin, koska muuttujien suora välittäminen saattaa olla turvallisuusriski huolimattomasti koodatussa skriptissä. 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'].".";
?>

Kumpaa 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ä on esiteltynä 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@esimer.kki", "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.

Antti Laaksonen, 23.3.2003


Kommentit

Gwaur [25.03.2003 21:58:17]

Lainaa #

Tuossa lopussa kun on nuo

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");
}

niin mitenkäs jos haluan tohon ekaan sen kielteisenä? teenko näin?:

if(!$viesti) {

(!= operaattoria mukaillen...)

kaviaari [03.04.2003 20:54:12]

Lainaa #

MAHTAVAA!

NiKC [16.05.2003 13:32:54]

Lainaa #

kun käytetään checkboxeja tai multi-selectiä kannattaa ne nimetä 'nimi[]' jolloin tehdyt valinnat palautuu arrayna php:lle.

esim.

<input type="checkbox" name="cb[]" value="1"> PHP
<input type="checkbox" name="cb[]" value="2"> VB
<input type="checkbox" name="cb[]" value="3"> Joku muu

...tai...

<select name="ms[]" multiple>
   <option value="1"> PHP
   <option value="2"> VB
   <option value="3"> Joku muu
</select>

TETRIS [27.05.2003 17:35:38]

Lainaa #

Hahaaa! Lähetä painike bugaa tossa esimerkissä.... tosin sehän on vaan näytillä siinä :)

(nimetön) [09.06.2003 19:21:07]

Lainaa #

hehee.. Testailin lähetä painiketta:

Ensimmäinen rivi.
Toinen rivi.
Kolmas rivi.
---------------------------------------------
Fatal error: Call to undefined function: hae_tieto() in /www/int2000/a/8694/html/oppaat_nayta.php on line 65

T.M. [10.07.2003 22:51:07]

Lainaa #

bugaa? öö.. just

kurz [22.08.2003 23:43:56]

Lainaa #

Hyödyllinen opas; kun ei tänä iltana nukuttanu, tulin koneelle ja lukasin oppaasi 4 ensimmäistä osaa. Huomattavasti helpommin oppii php:n kun on ohjelmoinut jonkun vuoden muuten, toisin kun aluksi rupesin opettelemaan vuosia sitten. PHP on myös melko helppo oppia, kun se on C-pohjainen kieli, kun on silläkin vähän koodaillut. Kiitokset hyvästä oppaasta.

simänen [06.10.2003 08:48:36]

Lainaa #

Buahhahhahhahhaaaaaaa!

TETRIS [06.01.2004 16:27:33]

Lainaa #

Painakaapas tosta Lähetyspainike ja tyhjennyspainike kohdasta Lähetä nappia niin tulee "hauska" Mysli errori

Silakka [27.01.2004 16:26:44]

Lainaa #

Minun nimi on Ville.

Slamtilt [06.08.2004 15:17:14]

Lainaa #

Kiva lomake tuo. Mitenkähän sen saisi toimimaan omalta koneelta? Kaikki muu on tähän mennessä toiminut..

ozmou [22.09.2004 17:28:00]

Lainaa #

kuinka ton palautelomakkeen sais tallentamaan noi tiedot vaik tekstitiedostoon

Cooper [27.09.2004 15:17:08]

Lainaa #

Hyvin opettavainen opas. Opin php:tä enemmän kuin olen muista (suomenkielisistä)oppaista ennen oppinut. Selkeätä ja yksinkertaista.

Biotank [14.12.2004 21:29:33]

Lainaa #

Loistavaa, kun ihmiset jaksaa tehdä ilmaiseksi näin hyviä ja käyttäväystävällisiä oppaita. Aloittelin muutama kuukausi sitten HTML:llä ja nyt PHP:tä sovelletaan faijan servulla:)

No, yllätävän helppoa-vielä toistaiseksi. Lisää tällaisia oppaita, työtänne arvostetaan!

pikkut [13.01.2005 18:53:10]

Lainaa #

Ihan kurko opas. Tossa on kuitenki tollanen juttu, jota en älyy. Eli toi on vissii kaikissa lomakkeissa. Osaan siis tavallaa käyttää sitä, mut en älyy, mitä se tekee..?

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

Puhveli [25.01.2005 16:58:13]

Lainaa #

pikkut: toi foreach on for joka ottaa huomioon jokaisen $_POSTilla luettavan arvon riippumatta siitä kuinka monta niitä on, jos oikein olen ymmärtänyt. jonkun kasvavan (tai pienenevän) numeron sijasta muuttujassa onkin vuorollaan jokainen alkio. koska tietääkseni $_POSTilla luettavissa olevien arvojen lukumäärää ei saa selville muuta kuin näin (vaikka se lukumäärän tietäminen ei esimerkissä olekaan oleellista, vaan niiden tulostaminen). toivottavasti tajusit jotain tästä tilityksestä?
edit: kiitos antille havainnollistavasta oppaasta. näköjään php:n oppii myös basic- ja vbasictaustastakin huolimatta. seuraavaksi opettelemaan c:tä :)

Nail_Eye [20.05.2005 16:58:29]

Lainaa #

Siis toihan menee näinkin.

<?php
foreach($_POST as $nimi ) {
  $palaute .= $nimi;
}
  $viesti = mail("maili osoite", "Palaute", $palaute);
 ?>

Toi $arvo muuttuja on tossa ihan turhaan.

edmundos [20.05.2005 23:26:24]

Lainaa #

jos on esimerkiksi empty ja !empty, niin se jossa on kysymysmerkki, onko se emptyn vastakohta (eli empty = tyhjä, !empty = täysi)?

Jaqqo [19.08.2005 18:31:38]

Lainaa #

Mulla ei toimi toi mail-funktio...
"sendmail_from" not set in php.ini or custom "From:" header missing in [tiedosto.php] on line 13.....?

ville-v [30.08.2005 18:42:42]

Lainaa #

empty = tyhjä
!empty = epätyhjä (ei siis välttämättä "täysi")

Dasi [17.09.2005 15:27:28]

Lainaa #

Määritelläänkö tuo $arvo jossakin vaiheessa?

arnold super [13.02.2006 00:43:17]

Lainaa #

olen samaa mieltä kuin pikkut. mahtava opas osaan käyttää tuota skriptiä mutta miten tuo alku oikein toimii?

Andu [26.06.2006 17:33:32]

Lainaa #

Miten tekstialueen kokoa voi vaihtaa?

Lahha [20.10.2006 02:11:22]

Lainaa #

rows ja cols:

<textarea rows=2 cols=5 name="teksti">Ensimmäinen rivi.
Toinen rivi.
Kolmas rivi.</textarea>

(nimetön) [27.10.2006 22:37:24]

Lainaa #

ei tollasta määrää koodia voi muistaa mikä tässäkin oppaassa on jo tähän mennessä tullu!!!

prakka [29.10.2006 18:31:13]

Lainaa #

No laita kirjanmerkkiin/suosikkiin ja sitten katsot kun tarttet

pienipoika [04.11.2006 21:05:49]

Lainaa #

hmph. osaisikos joku auttaa, kun tein tuon pohjalta sivun ja laitoin sen koti.mbnettiin. kaikkit oimi. koitin samaa omalla palvelimella. php asennettu jakaiken pitäisi toimia. scripti ohjaa vielä kjäyytäjän kiitos sivulle mutta sitä postia ei ikinä tule laatikkooni :S

mauku [26.11.2006 17:39:31]

Lainaa #

onko oikea osoite? :)

Tiala [29.12.2006 00:03:25]

Lainaa #

oisko mitää helppoa tapaa tehä valintalistaa tai ruutu ilman että tarttis kirjottaa jokaseen nuo tägit. eli on valmiina noin 300 eri tekstiä joista lista pitäisi tehdä ja kaikki ovat omalla rivillänsä notepadilla... kiitos jos joku tajuaa :D

Hugo [30.12.2006 20:26:59]

Lainaa #

Siis täytyykö PHP-palvelimessa (minun kohdallani Apache, johon on asennettu PHP-tuki) olla asennettuna jokin sähköpostinlähetysprotokolla, koska minulla kyseinen palautekaavake heittää minut aina epäonnistuneen lähetyksen sivulle? Minulla ei siis kovin paljon ole kokemusta oman palvelimen pitämisestä ja PHP-koodauksesta vieläkin vähemmän. Koitin myös muilta sivuilta löytyviä ohjeita sähköpostin lähettämiseen oman palvelutarjoajan SMTP-palvelimella kirjautumisen kanssa, mutta nämäkin lisätessäni koodiin kyseinen skripti edelleen heitti minut epäonnistuneen lähetyksen sivulle.

EDIT: Eli siis vikaa selvitellessäni huomasin, että Windowsista ei siis todellakaan pysty lähettämään sähköpostia ilman sähköpostipalvelinta :D fiksu minä. Eli siis muokkasin php.inistä lähtevän palvelimen käsittelijäksi oman palveluntarjoajani sähköpostipalvelimen ja johan homma pelaa.

Mr_woodoo [13.03.2007 12:01:51]

Lainaa #

testailin tota koodia ilman check boxeja tässä näin ja huomasin, että kun lähetin palautteen itselleni niin textarean sisältö tuli kahteen kertaan varsinaiseen viestiin. Olisiko siihen jotain korjaus keinoa?

posti.php

<?php  ?>
  <h1>Lähetä postia</h1>
  <p>Tällä lomakkeella voit lähettää postia</p>
  <form action="laheta_posti2.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>
   <input type="submit" value="Lähetä posti">
  </form>
<?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("j.o@g.com", "Posti", $palaute);

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

Jontzzu [23.05.2007 18:19:14]

Lainaa #

Minulla ei toimi toi lomakejuttu ei sit millään. En tiedä missä virhe on, mutta nakkaa aina tolle mun tekemälle virhe.php sivulle. Tiedä sit miksei voi lähettää? :(

Väpä [31.07.2007 20:37:17]

Lainaa #

Oothan muuttanu sähköposti osotteen... :)

Ceox [02.01.2008 14:00:15]

Lainaa #

Itselläkin on ongelmia viestin lähetyksessä WAMPseverillä, mutta kyllä se sitten toimii kun uploadaa johonkin toiselle palvelimelle kuin sinne localhostille. Miten saisi lähetettyä POST- tietoa ilman formeja ihan PHP- koodilla suoraan?

apsu [05.07.2008 06:27:29]

Lainaa #

Oikein hyvä, siisti juttu toi

foreach($_POST as $nimi => $arvo) {
   $palaute .= $nimi . ": " . $arvo . "\n";
}

en ois ite keksiny! :)

Tietovirus [18.06.2009 16:58:45]

Lainaa #

<?php include("yla.htm"); ?>

Toi ei toiminu mulla :O

Rocceri [26.06.2009 14:35:47]

Lainaa #

Onkohan sulla tuommoinen yla.htm tiedosto, mitä koitat includettaa tai puuttuuko PHP tuki?

Taic [09.10.2009 14:38:14]

Lainaa #

freehostiaa käytän palvelimena, ja PHPpitäisi toimia jne.
Kokeilin kanssa tuota palautteelnlähetys juttua, laitoin sinne omat arvot ja sposti osotteen, kun sitten painan submit, se heittää kiitos -sivulleni, mutta mitään viestiä ei koskaan tullut. Mitä unohdin tai tein väärin?

Väpä [27.11.2009 21:11:25]

Lainaa #

Tietovirus kirjoitti:

<?php include("yla.htm"); ?>

Toi ei toiminu mulla :O

Ainakin MBnetin kotisivupalvelimet siirtyivät joskus PHP:n 5.2.9 versioon ja include sekä fopen käskyt kiellettiin. Kuulemma tietoturvariski.

Horny The Horrible [06.02.2010 19:43:09]

Lainaa #

tuolla on yks hml virhe!

AkeMake [26.11.2010 00:05:58]

Lainaa #

Meniköhän minulla jokin kohta ohi vai miksi en löydä selitystä tuolle .= -merkinnälle?

$palaute .= $nimi . ": " . $arvo . "\n";

Millä tavalla se eroaa tavallisesta = -merkistä?

ErroR++ [16.04.2011 10:43:13]

Lainaa #

Toihan on kiva toi PHP!

ErroR++ [16.04.2011 10:57:28]

Lainaa #

Jee! Latasin XAMPPin omalle koneelle!

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