Kirjautuminen

Haku

Tehtävät

Oppaat: PHP-ohjelmointi: Osa 12 - Tietokannat

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat
  3. Osa 3 - if-rakenne
  4. Osa 4 - for-silmukka
  5. Osa 5 - Taulukot
  6. Osa 6 - Lomakkeet
  7. Osa 7 - Nettisivusto
  8. Osa 8 - Lisää silmukoista
  9. Osa 9 - Tiedostot
  10. Osa 10 - Omat funktiot
  11. Osa 11 - Istunnot
  12. Osa 12 - Tietokannat
  13. Osa 13 - Tietoturva
  14. Osa 14 - Olio-ohjelmointi
  15. Osa 15 - Kuvien luonti
  16. Osa 16 - Säännölliset lausekkeet
  17. Osa 17 - Merkistöt
  18. Osa 18 - PHP:n ongelmat

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

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! |
+----+-------------+---------------------+----------+

Viestien näyttö

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.

Viestin lisäys

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.


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