Kirjoittaja: Antti Laaksonen (2011).
Käytännössä jokaisen laajemman nettisivuston toiminta perustuu tietokantaan, johon on tallennettu sivuston muuttuva tietosisältö. Esimerkiksi keskustelualueen viestit ja verkkokaupan tuotteet tallennetaan tietokantaan. Yleisin PHP:n kanssa käytettävä tietokanta on MySQL, jota käytämme myös tässä oppaassa.
Ohjelmointiputkassa on erillinen opassarja MySQL ja PHP, joka käsittelee kattavasti tietokantaohjelmointia PHP:llä. Tässä oppaassa tutustumme lyhyesti aiheeseen luomalla tietokantaa käyttävän vieraskirjan.
Valmis vieraskirja toiminnassaan on tässä: Aapelin vieraskirja
Tietokanta on tehokas tapa sivuston muuttuvan tietosisällön käsittelyyn. Tietokanta muodostuu tauluista, joista jokainen sisältää tietyn muotoista tietoa. Tietokantaa käytetään suorittamalla SQL-kielisiä kyselyjä, joilla voi hakea ja muuttaa tietoa.
Vieraskirjaa varten meille riittää yksi tietokantataulu viestit
, joka sisältää kaikista vieraskirjan viesteistä seuraavat tiedot:
Käytännössä voimme luoda taulun seuraavalla kyselyllä:
CREATE TABLE viestit ( id INT PRIMARY KEY AUTO_INCREMENT, kirjoittaja TEXT, aika DATETIME, sisalto TEXT );
Seuraavat kyselyt lisäävät tauluun viestit
testiksi kolme riviä:
INSERT INTO viestit (kirjoittaja, aika, sisalto) VALUES ('Aapeli', '2011-07-18 15:12:03', 'Heippa!');
INSERT INTO viestit (kirjoittaja, aika, sisalto) VALUES ('Maija', '2011-07-18 15:44:20', 'Moikka!');
INSERT INTO viestit (kirjoittaja, aika, sisalto) VALUES ('Uolevi', '2011-07-18 17:01:56', 'Tsaukki!');
Nyt voimme tarkistaa, että taulun sisältö on oikea:
SELECT * FROM viestit;
Tämän kyselyn tulos on seuraava:
+----+-------------+---------------------+----------+ | id | kirjoittaja | aika | sisalto | +----+-------------+---------------------+----------+ | 1 | Aapeli | 2011-07-18 15:12:03 | Heippa! | | 2 | Maija | 2011-07-18 15:44:20 | Moikka! | | 3 | Uolevi | 2011-07-18 17:01:56 | Tsaukki! | +----+-------------+---------------------+----------+
Tiedostoon yhteys.php
tulee kaikille muille sivuille yhteinen koodi, joka yhdistää tietokantaan:
<?php $yhteys = new PDO("mysql:host=localhost;dbname=testit", "aapeli", "kissa"); ?>
Tässä palvelimella olevan tietokannan nimi on "testit", käyttäjän nimi on "aapeli" ja salasana on "kissa". Koodi luo PDO-muuttujan $yhteys
, jonka kautta voimme suorittaa kyselyitä tietokantaan.
Vieraskirjan pääsivu vieraskirja.php
on seuraavanlainen:
<!DOCTYPE html> <html> <head> <title>Aapelin vieraskirja</title> </head> <body> <h1>Aapelin vieraskirja</h1> <p><a href="uusiviesti.html">Lähetä uusi viesti</a></p> <?php include("yhteys.php"); $sql = "SELECT kirjoittaja, aika, sisalto FROM viestit ORDER BY aika DESC"; $kysely = $yhteys->prepare($sql); $kysely->execute(); while ($rivi = $kysely->fetch()) { $kirjoittaja = htmlspecialchars($rivi["kirjoittaja"]); $aika = $rivi["aika"]; $sisalto = htmlspecialchars($rivi["sisalto"]); $sisalto = nl2br($sisalto); echo "<hr>"; echo "<p><b>Kirjoittaja:</b> {$kirjoittaja}</p>"; echo "<p><b>Aika:</b> {$aika}</p>"; echo "<p><b>Viesti:</b> <br> {$sisalto}</p>"; } ?> </body> </html>
Seuraava SQL-kysely hakee viestit tietokannasta:
SELECT kirjoittaja, aika, sisalto FROM viestit ORDER BY aika DESC
Kysely hakee taulusta viestit
kaikkien rivien kentät kirjoittaja
, aika
ja sisalto
, ja järjestää ne laskevaan suuruusjärjestykseen kentän aika
mukaan.
Kyselyn suorituksen jälkeen koodissa on silmukka, joka käy yksi kerrallaan läpi kyselyn tuloksena olevat rivit. Huomaa funktio nl2br
, joka muuttaa merkkijonossa olevat rivinvaihdot HTML:n mukaisiksi <br>
-tageiksi.
Vieraskirjaan voi lähettää uuden viestin seuraavan lomakkeen kautta:
<!DOCTYPE html> <html> <head> <title>Uusi viesti</title> </head> <body> <form action="uusiviesti.php" method="post"> <p>Nimi: <br> <input type="text" name="nimi"></p> <p>Viesti: <br> <textarea name="viesti"></textarea></p> <p><input type="submit" value="Lähetä"></p> </form> </body> </html>
Lomakkeen tiedot käsitellään näin:
<?php include("yhteys.php"); $nimi = $_POST["nimi"]; $viesti = $_POST["viesti"]; $sql = "INSERT INTO viestit (kirjoittaja, aika, sisalto) VALUES (?, NOW(), ?)"; $kysely = $yhteys->prepare($sql); $kysely->execute(array($nimi, $viesti)); header("Location: vieraskirja.php"); ?>
Seuraava SQL-kysely lisää uuden viestin tietokantaan:
INSERT INTO viestit (kirjoittaja, aika, sisalto) VALUES (?, NOW(), ?)
Uudesta viestistä ilmoitetaan kentät kirjoittaja
, aika
ja sisalto
. Kenttä id
saa automaattisesti seuraavan vapaan id-numeron, koska kentän tyypiksi valittiin AUTO_INCREMENT
. Merkit ?
kuvaavat puuttuvia arvoja, jotka annetaan taulukossa kyselyn suoritusvaiheessa. Funktio NOW()
asettaa viestin lähetysajaksi tämänhetkisen ajan.
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.