Storybook

Sorakuilu

Harjoituksen osat

Tunti 1. Toimeksianto ja storybook-sovelluksen esitutkimus
Tunti 2. Suunnittele storybook
Tunti 3. Toteuta tietokanta
Tunti 4. Toteuta käyttöliittymä
Tunti 5. Laadi runko ja reititys järjestelmään
Tunti 6. Toteuta lukijan etusivu (tietojen haku lukijan näkymässä)
Tunti 7. Toteuta rekisteröityminen(tietojen lisäys lukijan näkymässä)
Tunti 8. Toteuta autentikointi (kirjaudu ja kirjaudu ulos)
Tunti 9. Toteuta ylläpidon etusivu (tietojen haku)
Tunti 10.Toteuta jutun lisäys ylläpitonäkymässä, tietojen tarkistus mukaan
Tunti 11.Toteuta jutun muokkaus ylläpitonäkymässä, tietojen tarkistus mukaan
Tunti 12.Toteuta jutun poistaminen ylläpitonäkymässä
Omat tehtävät: suunnittele ja toteuta admin-näkymän yhden jutun näyttäminen (linkki on jo olemassa), omien tietojen muokkaaminen sekä salasanan vaihtaminen (piirrä lisäksi kaaviot)


Tunti 3. Toteuta tietokanta

Tämän tunnin tavoite

Toteuta yhteys tietokantaan ja laadi yksinkertainen asennusohjelma.

Tunnilla toteutettavat php-sivut on esitetty alla luokkakaaviossa.

Tallennuspaikat

Luo seuraavat alikansiot sovellukseesi (tässä koko sovellus kansiossa storybook):

kansiorakenne

Tietoturvallinen yhteys tietokantaan

Tietokannan salasanoja ei suositella sijoitettavaksi web-kansioon (public_html). Tässä sijoitamme ne tiedostoon config.php ja sijoitamme sen web-kansion äitikansioon.

../config.php

Polku luonnollisesti vaihtelee sen mukaan, minkälainen kansiorakenne on palvelimessa.

<?php

return [
    
'database' => [
        
'dsn' =>'mysql:host=localhost;dbname=guestbook',
        
'username' => 'kayttaja',
        
'password' => 'salainen',
        
'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    ]
];


?>

Muut tietokantaan liittyvät tiedostot sijoitetaan alikansioon database.

Connection.php

<?php
class Connection {

    public static function 
make($config)

    {
        try {

            return new 
PDO(

                
$config['dsn'],
                
$config['username'],
                
$config['password'],
                
$config['options']
            );
        }

        catch (
PDOException $e) {

            die(
$e ->getMessage());

        }

    }
}


//static on oliosta riippumaton. Kirjoitettaessa se helpottaa kutsua - sen sijaan, että käyttäisimme koko ajan pitkää muotoa
//$connection = new Connection();
// $connection ->make();
//voimme kirjoittaa vain lyhyesti
//Connection::make();
// static -määrettä käytetään, jos metodi ei ei liity mihinkään olioon vaan saa parametreinä olioita

/* postgres - assosiatiivinen taulukko, jossa tiedot

return [
    'database' => [
        'dsn' =>'pgsql:host=127.0.0.1;dbname=guestbook',
        'username' => 'postgres',
        'password' => 'salasana',
        'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    ]
];

ja sama käyttäen mysql:ää


return [
    'database' => [
        'dsn' =>'localhost',
        'username' => 'root',
        'password' => '',
        'options' => [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    ]
];*/

db.php

Tämä yhdistää edelliset - niitä voisi toki kutsua index.php:ssa erikseenkin

<?php
require_once './database/Connection.php';

$config = require '../../../config.php'//__DIR__
//riippuu sijainnista, tässä kolmen kansion päässä

$db Connection::make($config['database']);

?>

Ja, varmuuden vuoksi, koko storybook-sovelluksen tietokanta sql-muodossa.

Laadi asennusohjelma ./install.php

./install.php

Kaikkiin tauluihin tauluhin kerrotaan tallennettavan tiedon merkistö ja annetaan järjestelmämääritys innoDb.

Taulun stories vierasavaimeksi määritetään users-taulun pääavain.

<?php

require "./database/db.php";


$sql ="CREATE TABLE IF NOT EXISTS users (
  account_id int(10) AUTO_INCREMENT PRIMARY KEY NOT NULL,
  last_name varchar(30),
  first_name varchar(30),
  account_name varchar(255) NOT NULL,
  account_passwd varchar(255) NOT NULL,
  account_reg_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  account_enabled tinyint(1) UNSIGNED NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;"
;

$statement $db->query($sql);
if(
$statement!=FALSE) echo "Taulu users lisätty!<br>";


$sql ="CREATE TABLE IF NOT EXISTS account_sessions (
  session_id varchar(255) PRIMARY KEY NOT NULL,
  account_id int(10) UNSIGNED NOT NULL,
  login_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8"
;

$statement $db->query($sql);
if(
$statement!=FALSE) echo "Taulu sessions lisätty!<br>";

$sql "CREATE TABLE IF NOT EXISTS stories (
   story_id int(10) AUTO_INCREMENT PRIMARY KEY NOT NULL,
   headline varchar(100),
   article text,
   hidedate date NOT NULL,
   published date,
   account_id int(10)
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8"
;

$statement $db->query($sql);
if(
$statement!=FALSE) echo "Vierasavain on lisätty!<br>";

   
   
$sql="ALTER TABLE stories ADD CONSTRAINT foreigner FOREIGN KEY (account_id) REFERENCES users(account_id)";
$statement $db->query($sql);
if(
$statement!=FALSE) echo "Vierasavain on lisätty!<br>";









Extra: PostgreSQL-kanta mahdollisuutena

Tässä käytetään PostgreSQL-tietokantaa Xamppiin liitettynä. Tietokanta eroaa jossain määrin MySql:stä, alla tärkeimpiä eroja:

extension=pdo_pgsql
extension=php_pgsql

PostgreSQL kouluympäristössä

Jos haluamme käyttää kouluympäristössä PostgreSQL:ää, teemme sen dockerin avulla. Valmis järjestelmä siirretään jollekulle palvelimelle, esim. truudelille (tai herokuun, mikäli portit meille aukeavat). Ohje käyttöönottoon.

Asennusohjelma, jos haluat käyttää PostgreSQL-tietokantaa:

<?php

require "./database/db.php";

$sql="CREATE TABLE users(account_id SERIAL NOT NULL PRIMARY KEY,
last_name VARCHAR(30),
first_name VARCHAR(30),
account_name VARCHAR(30),
account_password VARCHAR(100),
account_enabled smallint NOT NULL DEFAULT '1',
account_expiry date NOT NULL DEFAULT '1999-01-01')"
;

$statement $pdo->query($sql);
if(
$statement!=FALSE) echo "Taulu user  lisätty!<br>";

$sql="CREATE TABLE sessions (
session_id SERIAL NOT NULL PRIMARY KEY ,
session_account_id integer NOT NULL,
session_cookie char(32) UNIQUE NOT NULL,
session_start timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)"
;

$statement $pdo->query($sql);
if(
$statement!=FALSE) echo "Taulu session lisätty!<br>";

$sql="CREATE TABLE IF NOT EXISTS stories(story_id SERIAL NOT NULL PRIMARY KEY,
headline VARCHAR(100),
article TEXT,
hidedate DATE NOT NULL,
published DATE, 
account_id INTEGER)"

$statement $pdo->query($sql);
if(
$statement!=FALSE) echo "Taulu story  lisätty!<br>";


$sql="ALTER TABLE stories ADD CONSTRAINT foreigner FOREIGN KEY (account_id) REFERENCES users(account_id)";
$statement $pdo->query($sql);
if(
$statement!=FALSE) echo "Vierasavain on lisätty!<br>";

// ja siemenet (seed) eli ensimmäiset tiedot kantaan testausta varten
$user=new User($pdo);
$user->add_account("leevi","salasana",$pdo);
$story = new Story($pdo);
$data=array("testi","testi","2019-09-09","2020-01-01");
Story::add_story($data,$pdo);

?>

>> Tunti 4. Toteuta käyttöliittymä >>