Ohjelmointikielet ja -paradigmat 5op Markus Norrena
Framework Framework tavoitteet Miten viikko meni?
Photo Gallery Project Public / Admin sides Pagination (next / prev) thumbnails Full size images Comments Log in Upload images Delete images Review/delete somments
Luokkien hahmotelmani User Käyttäjätunnus / kokonimi, salasana, oikeudet, omistamat kuvat ja kommentit, kirjautuminen (log in), Photograph Lisää / poista kuva, kenen lisäämä, milloin, tila (näkyvissä?) Comments Teksti, kenen kirjoittama, milloin, tila (näkyvissä / poistettu) Database Aukaisee yhteyden, suorittaa haut, jne. Pagination Näyttää kuvat: thumbnails / isot, jne.
Kotitehtävä 8 : Photo Gallery - UML Piirtäkää UML-kaavio tarvittavista luokista, attribuuteista ja metodeista Suunnitelkaa samalla miten valokuvagalleriaohjelmanne voisi toimia UML-kaavio tai jokin yhtä selkeä esitystapa Tarkoitus on että joudutte miettimään nyt kokonaisuutta Edellisten kalvojen ohjelmamäärittelyjen mukaan!
Kotitehtävä 8 : Minimi-UML User Photograph Database id username password first_name last_name id filename size state caption upload_dir connection last_query jne. find_all() find_by_id() full_name() save() destroy() find_all() find_by_id() open_connection() close_connection() query() escape_value() fetch_array()
Kotitehtävä 8 : Photo Gallery - UML Oikeasti en tiedä miten tehdä, tehtävän tarkoitus oli saada teidät miettimään tätä itse, ennen kuin esitän joitain ratkaisuja. Itse suunnittelen enemmän omassa päässäni sekä samalla kuin koodaan (mikä ei ole kovinkaan tiimiystävällistä)
Photo Gallery Project Lähdetään toteuttamaan, tänään: 1. Ensin esimerkki database-luokan tekemisestä 2. Sitten valitkaa yksi projektin luokka ja ryhtykää toteuttamaan sitä
Käytännön asiat: hakemistorakenne Projektihakemisto joka on projektin juuri Sen alle public hakemisto, joka sisältää julkisesti jaettavan tiedon Kuten esim. Css, javascriptit, kuvat Publicin ulkopuolelle koodia jota halutaan suojata erityisen tarkkaan Kuten esim. Includes -kansio Esim hakemistorakenteesta:
Käytännön asiat: hakemistorakenne kuvagalleria public images javascripts stylesheets Includes database password Kun "includes" ei ole webbipalvelimen alaisuudessa, niin se luo lisäturvaa meille.
Käytännön asiat: hakemistorakenne kuvagalleria public images javascripts stylesheets Sisältää index.php tiedoston includes Sisältää php oliokoodimme, joka liitetään esim. include käskyllä muuhun koodiimme: include '../includes/users.php';
Käytännön asiat: hakemistorakenne Miten toteuttaa? Esim. symbolinen linkki public_html hakemistosta muualle: cd ~/public_html/ ln -s /home/markus/kuvagalleria/ public./kuvagalleria Jonka jälkeen näkyy: http://195.148.97.131/~markus/ kuvagalleria/
Tehtävä Luokaa itsellenne hakemistorakenne kuvagalleriaanne varten
Database-luokka: karkea suunnitelma Luodaan luokka Database.php Config.php -> tietokanta, tunnukset jne. MySQLDatabase class open_connection() metodi» Select db $connection attribuutti construct() aukaisee yhteyden aina close_connection() new MySQLDatabase Ajatuksena olla tietokantaneutraali, eli tarvittaessa voidaan myös luoda vaikkapa OracleDatabase -luokka myöhemmin.
Database-luokka : tietokanta Luodaan projektille oma tietokanta Tarvitaan testataksemme luokkaamme Terminaalissa: mysql -u okp -p Salasana oli: oli9trr3 Create database mn_kuvagalleria; Käyttäkää etuliitettä jotta jokainen saa oman tietokantansa Tai luokaa tietokanta phpmyadminissa: http://195.148.97.131/phpmyadmin/
Database-luokka : eka tietokantataulu CREATE TABLE users ( id int(11) NOT NULL auto_increment, username varchar(50) NOT NULL, password varchar(40) NOT NULL, first_name varchar(30) NOT NULL, last_name varchar(30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO users VALUES (1,'markus','secretpwd', 'Markus','Norrena');
Tehtävä Luokaa kuvagalleriallenne oma tietokanta ja sinne vähintään yksi taulu ja siihen yksi rivi dataa testausta varten Yleistä olisi myös että projektilla on oma tietokantatunnuksensa, mutta sitä en ottanut tällä kertaa huomioon.
Database-luokka PHP:tä varten luodaan config.php Tämä sisältää tietokannan salasanat jne. määriteltyinä vakiomuuttujiin Sijoitetaan includes kansioon <?php // Database Constants defined('db_server')? null : define("db_server", "localhost"); defined('db_user')? null : define("db_user", "okp"); defined('db_pass')? null : define("db_pass", "oli9trr3"); defined('db_name')? null : define("db_name", "mn_kuvagalleria");?>
database.php Luodaan database.php includeskansioon Tämä tiedosto määrittelee tietokantaluokan
database.php <?php require_once("config.php"); class MySQLDatabase { } $database = new MySQLDatabase();?> Kutsuttaessa luo tietokantaolion Mahdollista luoda omat luokkansa eri tietokannoille Oracle, Microsoft SQL Server, SQLite, jne.
database.php : periaate public function open_connection() { } $connection = mysql_connect(db_server, DB_USER, DB_PASS); if (!connection) { die("database connection failed: ". mysql_error()); } $database = new MySQLDatabase(); $database->open_connection(); Tämä ei vielä toimi, tässä näkyy vain periaate mitä haetaan.
private $connection; database.php : toimii public function open_connection() { } $this->connection = mysql_connect(db_server, DB_USER, DB_PASS); if (!$this->connection) { die("database connection failed: ". mysql_error()); } else { $db_select = mysql_select_db(db_name, $this->connection); if (!$db_select) { die("database selection failed: ". mysql_error()); } } $database = new MySQLDatabase(); $database->open_connection();
Tehtävä Luokaa config.php ja database.php äskeisten kalvojen mukaan, tarkistakaa etteivät ne anna virheilmoituksia. Index.php: <?php require_once("../includes/database.php");?>
database.php : parantelua $database->open_connection(); On turha käsky, siirretään se construct metodiin, jotta yhteys aukaistaan automaattisesti aina kun olio luodaan. function construct() { $this->open_connection(); }
database.php Luodaan vielä metodit public function close_connection() public function query($sql) public function escape_value( $value ) public function fetch_array($result_set) public function num_rows($result_set) public function insert_id() public function affected_rows() confirm_query($result)
database.php : close_connection() public function close_connection() { if(isset($this->connection)) { mysql_close($this->connection); unset($this->connection); } } Nyt voimme halutessamme sulkea yhteyden: $database->close_connection();
database.php : query($sql) public function query($sql) { $result = mysql_query($sql, $this->connection); if (!$result) { die("database query failed: ". mysql_error()); } return $result; } Saa parametrina kyselyn ($sql) Tarkistaa onnistuiko kysely Ellei onnistunut antaa virheilmoituksen ja lopettaa ohjelman, muuten Palauttaa kyselyn tuloksen.
database.php : confirm_query($result) public function query($sql) { $result = mysql_query($sql, $this->connection); $this->confirm_query($result); return $result; } private function confirm_query($result) { if (!$result) { die("database query failed: ". mysql_error()); } } Yleiskäyttöinen confirm_query($result) kertoo aina onnistuiko kysely.
Database-luokka : periaatteista Querying the Database The sql statement is going to change every time But the PHP mysql_query command stays the same Public query() method with $sql parameter
Kokeillaan koodia : index.php <?php require_once("../includes/database.php"); if(isset($database)) {echo "true";} else {echo "false";} echo "<br />"; $sql = "SELECT username FROM users"; $result_set = $database->query($sql); // output first username found echo mysql_result($result_set, 0);?> mysql_result() kannattaisi siirtää luokan sisälle ja luoda tietokantaneutraali metodi.
Muita metodeja Yleisistä tietokantakäskyistä kannattaa tehdä tietokantaneutraalit metodit mysql_fetch_array Tästä tulee: fetch_array() mysql_num_rows mysql_insert_id mysql_affected_rows Tietoturvasyistä kannattaa luoda erikoismerkit poistava metodi: escape_value( $value )
Tehtävä Tutustukaa viimeiseen versioon koodista! Löytyy kurssisivulta database.php index.php Sekä nämä kalvot Kokeilkaa & kyselkää!
Object-oriented programming How OOP is an improvement Grouping code together Database neutrality
Kotitehtävä 9 Luokaa kuvagallerialle user luokka käyttäjien hallintaan, joka pitää sisällään vähintään: find_all() palauttaa kaikki käyttäjät tietokannasta find_by_id($id) palauttaa tietyn id:n käyttäjätiedot full_name() palauttaa tietyn käyttäjän kokonimen authenticate($username, $password) tarkistaa tunnuksen & salasanan Minimoikaa tietokantahaut toteutuksessanne Kunhan perustelette, niin voitte valita jonkin toisen luokan ja toteuttaa se Palauttakaa luokkanne koodi sähköpostitse ennen ensi kertaa.
Framework Muistakaa työstää myös tätä ensi kerraksi
Kotitehtävistä Aloittakaa myös kotitehtävien työstöä luokassa, haluan nähdä mitä teette seuraavaksi ja ilmeneekö heti ongelmia / kysymyksiä.