Kirjoittaja: Antti Laaksonen (2011).
Tässä oppaassa teemme kokonaisen PHP:tä hyödyntävän nettisivuston, jossa jokainen sivu käyttää samaa sivupohjaa. Sivuston pääsisältönä on simulaatio, jossa voi tarkastella nopan silmälukujen jakaumaa, kun noppaa heitetään monta kertaa. Sivustolla on myös palautelomake, joka lähettää palautteen eteenpäin sähköpostitse.
Lopullinen sivusto toiminnassaan on tässä: Aapelin kotisivu.
Yleinen tapa toteuttaa nettisivusto on käyttää jokaisella sivulla samanlaista pohjaa, jossa on esimerkiksi sivuston valikkorakenne. Suoraviivainen tapa toteuttaa tällainen nettisivusto on kirjoittaa jokainen sivu samanlaisen HTML-pohjan sisään. Tässä tulee kuitenkin ongelmaksi, että jos sivupohja muuttuu, muutos täytyy tehdä erikseen jokaiseen sivuun. PHP tulee apuun tässä asiassa.
Tarkastellaan Aapelin kotisivun etusivua:
<!DOCTYPE html> <html> <head> <title>Aapelin kotisivu</title> </head> <body> <h1>Aapelin kotisivu</h1> <p> <a href="index.html">Etusivu</a> | <a href="matikka.html">Matematiikka</a> | <a href="palaute.html">Palaute</a> </p> <h2>Etusivu</h2> <p>Tervetuloa Aapelin kotisivulle!</p> </body> </html>
Jaamme nyt sivun uudestaan kolmeen osaan:
yla.php
sisältää jokaisen sivun yhteisen yläosanala.php
sisältää jokaisen sivun yhteisen alaosanindex.php
yhdistää yläosan, alaosan ja etusivun sisällönTiedoston yla.php
sisältö:
<!DOCTYPE html> <html> <head> <title>Aapelin kotisivu</title> </head> <body> <h1>Aapelin kotisivu</h1> <p> <a href="index.php">Etusivu</a> | <a href="matikka.php">Matematiikka</a> | <a href="palaute.php">Palaute</a> </p>
Tiedoston ala.php
sisältö:
</body> </html>
Tiedoston index.php
sisältö:
<?php include("yla.php"); ?> <h2>Etusivu</h2> <p>Tervetuloa Aapelin kotisivulle!</p> <?php include("ala.php"); ?>
Jatkossa voimme tehdä kaikki uudet sivut samaan tapaan kuin tiedoston index.php
. Komento include
liittää sivun alkuun tiedoston yla.php
sisällön ja sivun loppuun tiedoston ala.php
sisällön. Jos sivun yläosa tai alaosa muuttuu, riittää muuttaa yhtä tiedostoa.
Aapelin kotisivun Matematiikka-osiossa voi tarkastella, miten nopan antamat silmäluvut jakautuvat, kun noppaa heitetään monta kertaa. Pääsivu matikka.php
on seuraavanlainen:
<?php include("yla.php"); ?> <h2>Matematiikka</h2> <p>Kuinka monta kertaa haluat heittää noppaa?</p> <ul> <li> <a href="noppa.php?kerrat=100">100 kertaa</a> <li> <a href="noppa.php?kerrat=1000">1000 kertaa</a> <li> <a href="noppa.php?kerrat=10000">10000 kertaa</a> </ul> <?php include("ala.php"); ?>
Ideana on, että sivun noppa.php
osoitteessa kerrotaan nopan heittokertojen määrä. Tähän tietoon pääsee käsiksi PHP:ssä taulukon $_GET
avulla samaan tapaan kuin lomakkeiden yhteydessä. Erona aiempaan on kuitenkin, että missään ei ole lomaketta vaan tieto lisätään suoraan sivun osoitteeseen.
Sivun noppa.php
koodi on seuraava:
<?php include("yla.php"); ?> <h2>Nopanheitto</h2> <?php for ($i = 1; $i <= 6; $i++) { $jakauma[$i] = 0; } $kerrat = $_GET["kerrat"]; for ($i = 1; $i <= $kerrat; $i++) { $heitto = rand(1, 6); $jakauma[$heitto]++; echo "<img src=\"noppa{$heitto}.png\" alt=\"$heitto\">"; if ($i % 20 == 0) { echo "<br>"; } } echo "<h3>Jakauma</h3>"; echo "<ul>"; for ($i = 1; $i <= 6; $i++) { echo "<li>silmäluku {$i} tuli {$jakauma[$i]} kertaa"; } echo "</ul>"; ?> <?php include("ala.php"); ?>
Koodissa oleva silmukka heittää noppaa halutun määrän kertoja arpomalla funktiolla rand
kokonaisluvun väliltä 1–6. Taulukkoon $jakauma
lasketaan kunkin nopan silmäluvun lukumäärä. Esimerkiksi $jakauma[1]
kertoo, kuinka monta kertaa silmäluku 1 on esiintynyt.
Koodi myös tulostaa kaikki heitetyt nopat sivulle. Noppien kuvat ovat tiedostoissa noppaX.png
, jossa X
on nopan silmäluku. Silmukan lopussa oleva koodi lisää rivinvaihdon 20 nopan välein käyttämällä apuna jakojäännöstä. Rivinvaihto tulee aina, kun muuttujan $i
arvo on jaollinen 20:llä, eli 20, 40, 60 jne. nopan kohdalla.
Lopuksi teemme vielä palautelomakkeen, jonka kautta lähetetty palaute välittyy Aapelille sähköpostitse.
Palautelomake on sivulla palaute.php
:
<?php include("yla.php"); ?> <h2>Palautelomake</h2> <form action="lahetys.php" method="post"> <p>Nimi: <br> <input type="text" name="nimi"></p> <p>Palaute: <br> <textarea name="viesti"></textarea></p> <p><input type="submit" value="Lähetä"></p> </form> <?php include("ala.php"); ?>
Sivu lahetys.php
lähettää lomakkeen tiedot eteenpäin sähköpostitse:
<?php $nimi = $_POST["nimi"]; $viesti = $_POST["viesti"]; $ok = mail("aapeli@ohjelmointiputka.net", "Palaute", "Nimi: $nimi\nViesti: $viesti"); if ($ok) { header("Location: kiitos.php"); } else { header("Location: virhe.php"); } ?>
Funktio mail
lähettää palautteen eteenpäin sähköpostitse. Funktiolle annetaan viestin vastaanottaja, otsikko ja sisältö. Viestin lähetyksen jälkeen on toteutettu ohjaus uudelle sivulle funktiolla header
. Jos lähetys onnistuu, uusi sivu on kiitos.php
ja muuten virhe.php
.
Meikäläisellä ei tuo palaute juttu vaan kerta kaikkisesti toimi, ohjaa aina tälle virhe.php :ta vastaavalle sivulle. Koodin olen tarkastanut moneen kertaan, ja virheitä en itse löydä =/
fineppu kirjoitti:
Meikäläisellä ei tuo palaute juttu vaan kerta kaikkisesti toimi
Onhan palvelimella oikein konfiguroitu mail-funktio? Kaikki palveluntarjoajat eivät anna sitä käyttää ja muidenkin on oltava oikein konfiguroituja.
Voi myös tehdä niin, että on yksi sivu joka sisältää muut sivut. Vaikka näin:
<!doctype html> <html> <head> <!-- otsaketietoja tähän... --> </head> <body> <?php include "sivut/" . $_GET["sivu"] . ".php" ?> </body> </html>
Eli sisällyttää kansiosta "sivut" sivu-lomakeväitteen, joka on php-tiedostopäätteinen, eli URL-osoite on "index.php?sivu=sivu-tähän". Voi myös tehdä niin, että jos "sivu"-väite on tyhjä, ohjataan sivulle "index.php?sivu=etusivu-tai-jotain".
krokotiili-nimeltä-682 kirjoitti:
Voi myös tehdä niin, että on yksi sivu joka sisältää muut sivut.
Ei missään tapauksessa pidä tehdä yllä olevan koodin mukaan! Käyttäjän antaman GET-parametrin syöttäminen include-komennolle on yksi pahimmista tietoturvavirheistä, joita PHP:llä voi tehdä. Pahimmassa tapauksessa hakkeri saa tuon kautta ajettua omia koodejaan ja saa koko palvelimen hallintaansa.
Metabolix kirjoitti:
Ei missään tapauksessa pidä tehdä yllä olevan koodin mukaan!
Okei, olen kyllä aloittelija enkä tiedä paljon. Kiitos kun kerroit. Mutta katsoin netistä apua, ja huomasin, että strip-tags ainakin on eräs vaihe tehdä koodistani turvallisempaa.
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.