Ohjelmointikielet ja -paradigmat 5op Markus Norrena
Viimeksi: 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 Miten meni?
User -class Sisältää käyttäjään liittyvää dataa Lähtökohta: siirrä nämä koodirivit index.php:stä user -luokkaan $sql = "SELECT * FROM users WHERE id = 1"; $result_set = $database->query($sql); $found_user = $database-> fetch_array($result_set); user.php Käyttämällä staattisia metodeita voimme milloin tahansa hakea tietoa käyttäjistä
User -class Esimerkkikoodia kurssisivulla index.php user.php Käydään läpi & kokeilkaa!
autoload() Muuta hyödyllistä PHP:n funktio josta saattaisi olla hyötyä. Jos unohtaa liittää jonkin php-tiedoston, niin tämä etsii sitä määritellyistä hakemistoista automaattisesti. http://php.net/manual/en/ language.oop5.autoload.php (tätä ei tarvitse käyttää)
session.php user.php Nyt: Sessions -luokka Hoitaa kirjautumisen admin puolelle Yhdistetään authenticate($username, $password) kirjautumislomakkeeseen ja käynnistetään samalla sessio.
Sessions -luokka Tehdään toimiva kirjautumisjärjestelmä Liittyy user luokan: authenticate($username, $password) metodiin Päätiedosto session.php Mutta käyttää useita muita tiedostoja
session_start() -esimerkki <?php session_start(); // store session data $_SESSION['views']=1;?> <html> <body> <?php //retrieve session data echo "Pageviews=". $_SESSION['views'];?> </body> </html>
Sessions -class Hoitaa sisäänkirjautuminen admin puolelle Php:n session_start() käsky pitää kirjaa siitä onko kirjautunut vai ei class Session { function construct() { session_start(); $this->check_login();...
Sessions -class Luodaan attribuutteja joihin tallennamme tiedon olemmeko kirjautuneina vai emme Metodi check_login() tarkistaa olemmeko kirjautuneina class Session { private $logged_in=false; function construct() { session_start(); $this->check_login(); if($this->logged_in) { // actions to take right away if user is logged in } else { // actions to take right away if user is not logged in } }
Sessions -class Lisätään User luokkaan authenticate() metodi public static function authenticate($username="", $password="") { global $database; $username = $database->escape_value($username); $password = $database->escape_value($password); } $sql = "SELECT * FROM users "; $sql.= "WHERE username = '{$username}' "; $sql.= "AND password = '{$password}' "; $sql.= "LIMIT 1"; $result_array = self::find_by_sql($sql); if (!empty($result_array)) { return array_shift($result_array); } else { return false; }
Sessions -class Luodaan nämä tiedostot jotta voidaan logata admin-puolelle includes/session.php public/admin/index.php public/admin/login.php Tarvitaan myös User-luokan metodi: User::authenticate($username, $password)
public/admin/index.php Ensin tarkistetaan onko kirjaudu8u if (!$session->is_logged_in()) { redirect_to("login.php"); } Sen jälkeen tulee itse html- koodi <html> <head> <title>photo Gallery</title>...
includes/functions.php Luodaan myös func@ons.php joka sisältää yleishyödyllisiä funk@oita kuten redirect_to() function redirect_to( $location = NULL ) { if ($location!= NULL) { header("location: {$location}"); exit; } }
includes/initialize.php Otetaan myös käy8öön yleishyödyllinen initialize.php Yksi tiedosto joka lisää kaikki tarvittavat luokat sun muut tiedostot yhdestä paikkaa, tämä: require_once("../../includes/initialize.php"); Korvaa nämä require_once("../../functions.php"); require_once("../../session.php"); require_once("../../database.php"); require_once("../../user.php"); jne
public/admin/login.php Tarkista onko kirjautunut, jos niin ohjaa pääsivulle, muuten Tarkista onko lähetä nappia lähete8y ja täsmääkö tunnus & salasana @etokannasta Tarvi8aessa anna virheilmoitus (kirjautuminen epäonnistui) Näytä kirjautumislomake <form action="login.php" method="post"> <input type="text" name="username" maxlength="30" value="<?php echo htmlentities($username);?>" />...
Tiedostot ja polut Initialize.php: hoitaa kaikki polut ja kaikki liitettävät tiedostot jne. // DIRECTORY_SEPARATOR is a PHP pre-defined constant // (\ for Windows, / for Unix) defined('ds')? null : define('ds', DIRECTORY_SEPARATOR); // File system path defined('site_root')? null : define('site_root', DS.'home'.DS.'markus'.DS.'kuvagalleria'); // Includes directory defined('lib_path')? null : define('lib_path', SITE_ROOT.DS.'includes'); // load config file first require_once(lib_path.ds.'config.php');
Html -layout Itse saitille luodaan layouts kansio, jonne tulee footer ja header tiedot, jotka ovat samat sivulta toiselle Luodaan myös include_layout_template() funktio joka tuo layoutit oikeasta paikkaa
Tutustukaa koko koodiin Kurssisivulla: sessions_kuvag.zip Näyttää tältä: http://195.148.97.131/~markus/kuvagalleria/ http://195.148.97.131/~markus/kuvagalleria/ admin/
Tehtävä Lisää sivulle toimiva logout -painike Sivuston admin-puolelle
Kotitehtävä 10: Framework esitelmä Valmistelkaa viimeiselle kerralle esitelmä Frameworkistanne Tarkoituksena antaa muille kurssilaisille käsitys Frameworkinne toiminnallisuuksista sekä sen hyvistä ja huonoista puolista Esitelkää myös mitä olette saaneet sillä aikaan Esitelmät 10.4. (Nic) vai 17.4. (muut)
Vielä toteutamme Käyttäjien luominen, päivittäminen ja poistaminen (creating, updating and deleting users): User luokkaan Jos ehditään Tiedostojen latauksen (File Upload): Photograph -luokka Kuvien näyttäminen ja niiden ylläpito
user.php create, update and delete users (CRUD): user.php Käy8äjä = olion ilmentymä Tätä voidaan päivi8ää, poistaa jne., mu8a sillä ei ole vaikutusta ellei nämä muutokset sen jälkeen ajeta myös @etokantaan!
user.php On tärkeää erottaa oliopäivitykset ja tietokantapäivitykset. Olion ilmentymä pitää tiedot sisällään: class User { public $id; public $username; public $password; public $first_name; public $last_name;
user.php Voidaan ensin tehdä muutokset olion ilmentymään, ja sen jälkeen tallettaa muutokset tietokantaan: // muutetaan arvo: $user->password = "uusipasswd"; // viedään muutos tietokantaan: $user->save();
user.php: public func@on save() public func@on save() metodi joka joko luo uuden db- recordin tai talle8aa muutokset jo olemassa olevaan: public function save() { // A new record won't have an id yet. return isset($this->id)? $this->update() : $this->create(); } Seuraavaksi luokaa create() ja update() metodit Onnistuessaan palau8avat true Muuten palau8avat false
user.php Käytän taulun nimeä apumuu8ujassa, jo8a se on tarvi8aessa helppo muu8aa class User {... protected static $table_name="users";
user.php: public func@on create() public function create() { global $database; // - INSERT INTO table (key, key) VALUES ('value', 'value') // - single-quotes around all values // - escape all values to prevent SQL injection $sql = "INSERT INTO ".self::$table_name." ("; $sql.= "username, password, first_name, last_name"; $sql.= ") VALUES ('"; $sql.= $database->escape_value($this->username)."', '"; $sql.= $database->escape_value($this->password)."', '"; $sql.= $database->escape_value($this->first_name)."', '"; $sql.= $database->escape_value($this->last_name)."')"; } if($database->query($sql)) { $this->id = $database->insert_id(); return true; } else { return false; }
admin/test.php Tilapäinen @edosto jolla testata koodimme <?php require_once('../../includes/initialize.php'); if (!$session->is_logged_in()) { redirect_to("login.php"); } include_layout_template('admin_header.php'); $user = new User(); $user->username = "johnsmith"; $user->password = "abcd12345"; $user->first_name = "John"; $user->last_name = "Smith"; $user->create(); echo "User created.<br>"; // you should check if it went ok <?php include_layout_template('admin_footer.php');?>
Ko@tehtävä 11 Toteuta update() ja delete() - metodit User luokkaan, seuraavien kalvojen mukaan:
user.php: public func@on update() Luodaan samalla tapaa, mu8a sql- muoto on: UPDATE table SET key='value', key='value' WHERE condition Toteuta. Voisi toimia esim. näin: $user = User::find_by_id(2); $user->password = "uusisalasana"; $user->update();
user.php: public func@on delete() public func@on delete() SQL- lauseen muoto DELETE FROM table WHERE condition LIMIT 1 Limit - kanna8aa @etoturvasyistä käy8ää delete- lauseissa aina kun mahdollista. Huomatkaa e8ä ilmentymä (olio) on yhä olemassa vaikka poistamme käy8äjän @etokannasta! Tämä mahdollistaisi esim. Tällaisen: echo $user->first_name. " was deleted";
Ensi kerralla valokuvat