Dr. Christian Senger DB & IS II, SS15 09.05.2015



Ähnliche Dokumente
Oracle SQL Tutorium - Wiederholung DB I -

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Unsere Webapplikation erweitern

Einführungskurs MOODLE Themen:

Adminer: Installationsanleitung

PHP - Projekt Personalverwaltung. Erstellt von James Schüpbach

SEMINAR Modifikation für die Nutzung des Community Builders

5. Übung: PHP-Grundlagen

CMS.R. Bedienungsanleitung. Modul Cron. Copyright CMS.R Revision 1

GITS Steckbriefe Tutorial

FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7

Datenbanken für Online Untersuchungen

Whitepaper. Produkt: combit Relationship Manager. Einbindung externer FiBu-/Warenwirtschaftsdaten. combit GmbH Untere Laube Konstanz

7. Übung - Datenbanken

Arbeiten mit UMLed und Delphi

Einführung in die Java- Programmierung

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3

Hochschule Karlsruhe Technik und Wirtschaft Anhänge: Fakultät für Informatik und Wirtschaftsinformatik SS 2013 Prof. Schmidt.

Programmierkurs Java

Datenmanagement in Android-Apps. 16. Mai 2013

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Mediator 9 - Lernprogramm

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

STRATO Mail Einrichtung Mozilla Thunderbird

Datenbanken Kapitel 2

4. BEZIEHUNGEN ZWISCHEN TABELLEN

Professionelle Seminare im Bereich MS-Office

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Datenbanken Microsoft Access 2010

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

Erstellen der Barcode-Etiketten:

Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum:

CartCalc FAQ (frequently asked questions) häufige Fragen zu CartCalc

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Internationales Altkatholisches Laienforum

Dokumentenverwaltung im Internet

Step by Step Softwareverteilung unter Novell. von Christian Bartl

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

ecaros2 - Accountmanager

Der neue persönliche Bereich/die CommSy-Leiste

AutoCAD Dienstprogramm zur Lizenzübertragung

Aufklappelemente anlegen

Wir arbeiten mit Zufallszahlen

XML Tutorium mit Oxygen. Oxygen Version 9.3!!

Vorgehensweise bei Lastschriftverfahren

Informatik 12 Datenbanken SQL-Einführung

CodeSaver. Vorwort. Seite 1 von 6

Electronic Systems GmbH & Co. KG

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Word 2010 Schnellbausteine

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Dreamweaver 8 Einführung

Suchmaschinen. Universität Augsburg, Institut für Informatik SS 2014 Prof. Dr. W. Kießling 23. Mai 2014 Dr. M. Endres, F. Wenzel Lösungsblatt 6

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Informatik Grundlagen, WS04, Seminar 13

Bedienungsanleitung für Mitglieder von Oberstdorf Aktiv e.v. zur Verwaltung Ihres Benutzeraccounts auf

Schritt 1 - Registrierung und Anmeldung

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Objektorientierte Programmierung

Workflows verwalten. Tipps & Tricks

Viele Bilder auf der FA-Homepage

Aufgaben zu XPath und XQuery

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

Webgestaltung - Jimdo 2.7

GEVITAS Farben-Reaktionstest

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

SQL - Übungen Bearbeitung der Datenbank Personal (1)

BENUTZERHANDBUCH für. Inhaltsverzeichnis. 1. Anmeldung. 2. Rangliste ansehen. 3. Platzreservierung. 4. Forderungen anzeigen

inviu routes Installation und Erstellung einer ENAiKOON id

Lehrer: Einschreibemethoden

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

Einführung in die Programmierung

1 Vom Problem zum Programm

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II - SS Metadaten

OP-LOG

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

State Machine Workflow mit InfoPath Formularen für SharePoint 2010 Teil 6

Installation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden

NODELOCKED LIZENZ generieren (ab ST4)

Grundlagen der Theoretischen Informatik, SoSe 2008

Stammdatenanlage über den Einrichtungsassistenten

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Erste Schritte mit Microsoft Office 365 von Swisscom

Wie halte ich Ordnung auf meiner Festplatte?

10.6 Programmier-Exits für Workitems

Anleitung für Autoren auf sv-bofsheim.de

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Objektorientierte Programmierung für Anfänger am Beispiel PHP

<script type="text/javascript"> <! <%= page(page.searchsuggestionsscript) %> // > </script>

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen

Amt für Natur und Umwelt Uffizi per la natira e l ambient Ufficio per la natura e l ambiente

P&P Software - Adressexport an Outlook 05/29/16 14:44:26

Transkript:

Übung MVC Dr. Christian Senger DB & IS II, SS15 09.05.2015 0) Allgemeine Hinweise: In den folgenden Lektionen soll die Realisierung einer objektrelationalen Abbildungsschicht gezeigt werden. Die Realisierung erfolgt mittels PHP, als zugrundeliegende Datenbank wird ein Auszug aus der Mondial Datenbank verwendet. Benutze dazu Deinen Oracle Account an der FH oder einen beliebigen Account auf einer Oracle Installation bei Dir Zuhause. Führe die im Folgenden aufgeführten Aufgaben der Reihe nach durch. 1) Vorbereitung Im Folgenden soll jetzt eine OR-Schicht realisiert werden, die auf einer Teilmenge der Tabellen und Attribute der original Mondial Datenbank basiert. Im Einzelnen sollen folgende Tabellen und Attribute verwendet werden: CITY: (NAME, COUNTRY, PROVINCE, POPULATION) COUNTRY (NAME, CODE, CAPITAL, PROVINCE, POPULATION) BORDERS (COUNTRY1, COUNTRY2) Kopiere die entsprechenden Attribute der Tabellen MONDIAL.COUNTRY, MONDIAL.CITY und MONDIAL.BORDERS mit ihren Inhalten in Dein Schema (Beachte: Hinweise). Setze weiterhin die Primär- und Fremdschlüssel, so wie sie auch im Mondial Schema definiert wurden. (Informationen darüber findest du in den Tabellen ALL_CONSTRAINTS und ALL_CONS_COLUMNS). In Anhang A ist eine Klasse, welche den Zugriff auf die Datenbank erleichtert abgedruckt. Kopier diese Klasse in eine Datei mit dem Namen MDB2_Util.php und speichere sie ab. Weiterhin findest du in Anhang B eine kleine Testdatei, welche diese Klasse nutzt. Speichere den Code aus Anhang B ebenfalls in einer Datei (Name: mondial-access.php) ab und führe folgendes Statement aus: php.exe mondial-access.php 1.1) Tests Modifiziere das Skript so, dass für jedes Land der höchste Berg ausgegeben wird. Modifiziere das Skript weiterhin so, dass du auf Deinen Datenbankaccount zugreifst und Hinterweidenthal (Pfalz) in die Datenbank einträgst. Lies den Ort anschließend zur Kontrolle wieder aus. 2) Orientierung Mittels der Kommandos DESCRIBE CITY DESCRIBE COUNTRY DESCRIBE BORDERS kann die Struktur der Tabellen ermittelt werden. Die Beziehungen lassen sich mittels der entsprechenden Einträgen in den Tabellen ALL_CONSTRAINTS und ALL_CONS_COLUMNS ermitteln. Daraus läßt sich das ER-Modell des Schemas ableiten, das wiefolgt aussieht:

Primärschlüssel sind unterstrichen. Die Attribute province und capital der Tabelle COUNTRY sind Umsetzungen der Beziehung ist_hauptstadt_von des ER-Modells auf das relationale Modell und tauchen deshalb im ER-Modell auch nicht auf. Analog verhält es sich mit dem Attribut country der Tabelle CITY. Die n:m-beziehung grenzt_an wird im relationalen Modell mittels der Beziehungstabelle BORDERS realisiert, aus diesem Grund tauchen auch die beiden Attribute COUNTRY1 und COUNTRY2 im ER-Modell nicht auf. Aus dem ER- Modell lassen sich jetzt eine Reihe von Eigenschaften für die objektrelationale Abbildungsschicht ableiten: Entitäten werden als Klassen realisiert: => Klasse Country, Klasse City. Die Klasse muss Methoden zum Anlegen von Instanzen in der Datenbank, zum Löschen und Modifizieren haben. Weiterhin sind Methoden zum Auffinden einzelner Datensätze (get_by_primary_key(<id>)) und Auslesen mehrerer Datensätze entsprechend einer Anfragebedingung notwendig (query(<condition>)). 3) Übung A Trage in Tabelle 1 die notwendigen Methoden ein und sage ob es sich dabei um eine Klassenoder Instanzenmethode handelt. Gib weiterhin Rückgabewert und Parameter an. 4) Beziehungen Beziehungen können mittels Methoden realisiert werden 1. Um die Methoden genauer spezifizieren zu können, betrachtet man die Kardinalitäten: Eine <0, 1> oder <1, 1> Kardinalität wie bei der Beziehung liegt_in auf Seite der Entität CITY bedeutet, dass eine Stadt in genau (Minimalkardinalität 1) bzw. maximal (Maximalkardinalität 1) einem Land liegen kann. Das bedeutet, dass eine Methode (get_country()) der Klasse City, welche uns das entsprechende Land zurückliefern soll, liefert genau eine Instanz eines Landes (oder null) zurückliefert. Soll das Land hingegen gesetzt werden, so wird eine Methode set_country(<country>) benötigt, welche das Land für diese Stadt setzt (um die Beziehung wieder zu lösen kann man entweder eine Methode unset_country() definieren oder man erlaubt die Übergabe des Null-Wertes an die Methode set_country(<country>)). 1. alternativ können Beziehungen durch zusätzliche Instanzenvariablen vom entsprechenden Typ (bei <0/ 1, 1> Kardinalitäten) oder mengenwertigen Instanzenvariablen (bei <0/1, n> Kardinalitäten) abgebildet werden.

Tabelle 1 Methodenname Ergebnistyp Parameter Beschreibung Klasse City Klasse Country

Anders verhält sich der Fall bei <0, n> und <1,n> Kardinalitäten. Betrachten wir die andere Seite der Beziehung liegt_in. Diese sagt aus, dass in einem Land zwischen 0 und n-städte liegen können. Eine Methode, welche alle Städte eines Landes zurückliefern soll muss also eine Menge von Instanzen vom Typ City zurückliefern (in einem Array). Entsprechend werden Methoden add_city(<city>), delete_city(<city>) und eventuell set_cities (<array of cities>) benötigt um die Beziehung verwalten zu können. 5) Übung Betrachte alle Beziehungen des ER-Modells und trage in Tabelle 2 die notwendigen Methoden für die beiden Klassen ein: 6) Definitionen Erstelle in einem Editor folgende Klassendefinition: <?php include_once 'MDB2_Util.php'; class Country { private $code; private $name; private $population; private $capital; private $province; function construct($code, $name, $population=null, $capital=null, $province=null) { $this->code = $code; $this->name = $name; $this->population = $population; $this->capital = $capital; $this->province = $province function tostring() { return "$this->name ($this->code) [Einwohner: $this->population, Hauptstadt: $this->capital ($this->province)]"; static function get($code) { $country = null; $list = MDB2_Util::query(" select code, name, population, capital, province from mondial.country where code=? ", $code); if (count($list)> 0) { $res = $list[0]; $country = new Country($res['CODE'], $res['name'], $res['population'], $res['capital'], $res['province']); return $country; MDB2_Util::connect("oci8://dein_account/dein_passwort@widb1"); echo Country::get('D'); MDB2_Util::close();?>

Tabelle 2 Methodenname Ergebnistyp Parameter Beschreibung Klasse City Klasse Country

Die Idee hierbei ist, für jede Spalte in der Tabelle eine entsprechende Instanzenvariable ($name, $code,...) zu definieren. Die Klasse verfügt über eine Instanzenmethode tostring(), die eine textuelle Repräsentation der Instanz zurückliefert. Die statische Methode get($code) zeigt exemplarisch, wie ein konkreter Datensatz aus der Mondial-DB ausgelesen wird und als Instanz der Klasse Country zurückgeliefert wird. 7) Übung Erweitere die Datei nun analog um die Klasse City. Erstelle in der Klasse Country eine Instanzenmethode get_cities(), welche alle Städte dieses Landes als Instanzen vom Typ City zurückliefert (in einem Array). Modifiziere den Konstruktor der Klasse Country derart, dass er nur einen Parameter (vom Typ assoziativer Array) entgegennimmt, der die Informationen aller Felder beinhaltet. Beispiel: $dic[ NAME ] = Baden Baden ; $dic[ POPULATION ] = 53421; $dic[ COUNTRY ] = D ; $nice_city = new City($dic); Die Vorteile dieser Lösung sind, dass die Reihenfolge der Parameter keine Rolle spielt und dass das Übergabeformat genau mit dem übereinstimmt, das von der Methode $res->fetchrow(db_fetchmode_assoc) beim Auslesen der Ergebnisse aus der Datenbank zurückgeliefert wird. Erstelle mit dieser Kenntnis nun eine weitere Methode MDB2_Util::object_query($sql, $class, $paras), die im Unterschied zur Methode MDB2_Util::query($sql, $paras) Instanzen vom angegebenen Typ (Parameter $class) zurückliefert. Erstelle mithilfe der Methode object_query(...) eine Instanzenmethode neighbours(), die für ein Land alle angrenzenden Nachbarn zurückliefert (als Instanzen vom Typ Country). Erstelle für die beiden Klassen per hand die fehlenden getter-/ und setter-methoden. Alternativ kannst du dir die Funktionsweise der Magic-Methode call(...) genauer anschauen 1. Erstelle für die Klasse Country eine statische Methode query($condition), die alle die Instanzen zurückliefert, welche die Bedingung $condition erfüllen. Optional kann noch ein zweiter Parameter genutzt werden um eine Sortierreihenfolge zu definieren. 1 http://www.phpbar.de/w/call()

8) Views Als nächstes sollen zwei Views (PHP Seiten, die Inhalte aus dem Modell auslesen und anzeigen) realisiert werden. Der erste View soll alle Länder in Tabellenform auflisten, der zweite View soll Details über ein Land ausgeben. Erstelle dazu ein Verzeichnis unterhalb des Verzeichnisses htdocs und kopiere die Dateien MDB2_Util.php (mit Deinen Erweiterungen) und die Datei mit den Klassendefinitionen für City und Country hinein. Erstelle weiterhin eine Datei, welche den eben erstellten View enthält (d.h. die Tabelle ausgibt). Anschließend soll ein weiterer View erstellt werden, der Details zu einem Land ausgeben soll. Dazu gehören u.a. die Städte, die in diesem Land liegen. Damit der View weiß, welches Land er anzeigen soll, muss dem View ein Parameter mit übergeben werden (in etwa so: http://localhost/tutorium/show_country_detail.php?code=d). Nachdem die beiden Views erstellt wurden können diese jetzt miteinander verbunden werden. Dazu müssen nur die Tabelleneinträge des ersten Views als Link realisiert werden, der dann (entsprechend parametrisiert) auf die Detailseite verweist. 9) Controller: Erweitere die Tabelle des ersten Views um eine zusätliche Spalte, die ein Zeichen enthält 1. Das Zeichen wird als Grafik wie folgt eingebunden: <img src="delete.gif">. Als nächstes verbinden wir das Zeichen mit einem Controler. Dazu bauen wir um die Grafik einen Link, der wie folgt aussieht: <a href="controler_delete_country.php?code=laendercode" border="0"> <img src="delete.gif"> </a> laendercode muss dabei entsprechend mit der ID des jeweiligen Landes ersetzt werden. Durch Drücken der Grafik wird von nun an der Controller gestartet. Dieser soll nun im letzten Schritt realisiert werden. Erweitere dafür zuerst deine Zugriffschicht um eine Instanzenmethode Country::delete(), die für das Löschen der konkreten Instanz in der Datenbank verantwortlich ist. Der Controler hat dann schlussendlich folgende Struktur: $code = $_REQUEST[ code ]; $country = Country::get($code); $country->delete(); header("location: $zielseite"); $zielseite ist hierbei eine URL, die nach dem Löschen angezeigt werden soll (z.b. wieder der erste View, der das soeben gelöschte Land dann nicht mehr anzeigen dürfte). Hinweise: create table city as select * from mondial.city; 1. Geh bei Googles Bildersuche stöbern

Anhang A (MDB2_Util Klasse für Datenbankzugriff) <?php // Klasse mit statischen Methoden zur Verwaltung einer // Datenbankverbindung. // Einsatz: // // $db = MDB2_Util::connect($dsn); // $db_handle = "MDB2_Util::get_connection(); // $list = MDB2_Util::query("select * from cat"); // $sql = "select * // from mondial.city // where country =? // and population >?"; // $obj_list = MDB2_Util::object_query($sql,'City', array('f', // 1000000)); // $new_schiff_id = MDB2_Util::create_id('Schiff'); // MDB2_Util::close(); // include_once('mdb2.php'); // PEAR::MDB2 class class MDB2_Util { private static $db_handle; static function connect($dsn) { $c = MDB2::connect($dsn); if (PEAR::isError($c)) die ("Fehler beim Verbindungsaufbau mit [$dsn] : ". $c->getmessage()); self::$db_handle = $c; static function get_connection() { if (empty(self::$db_handle)) die("es besteht keine offene Datenbankverbindung. Zuerst mit DB_Util::connect(\$dsn) eine Verbindung herstellen.". LINE ); return self::$db_handle; static function query($sql, $data=array()) { if (! array($data)) $data = array($data); $db = self::get_connection(); if (preg_match('/^\s*(update delete insert)\s+/i', $sql)) $mode = MDB2_PREPARE_MANIP; else $mode=null; $stmt = $db->prepare( $sql, null, $mode); if (PEAR::isError($stmt)) die(adapt_output($sql).":".$stmt->getmessage()); $res = $stmt->execute( $data); if (PEAR::isError($res)) {

$err_msg = $res->getmessage(); die("execute: ".adapt_output($sql)." [".join(",", $data)."]: $err_msg"); $results = array(); if (is_object($res)) { while($row = $res->fetchrow(mdb2_fetchmode_assoc)) $results[] = $row; return $results; else { // numbers of affected rows (not implemented in mysql) return $res; static function object_query($sql, $class, $data=array()) { $db = self::get_connection(); $stmt = $db->prepare( $sql ); if (PEAR::isError($stmt)) die(adapt_output($sql).":".$stmt->getmessage()); $res = $stmt->execute($data); if (PEAR::isError($res)) die("execute: ".adapt_output($sql).":".$res->getmessage()); $results = array(); if (is_object($res)) { while($row = $res->fetchrow(mdb2_fetchmode_assoc)) $results[] = new $class($row); return $results; else { return $res; function create_id($name='default_sequence') { $db = self::get_connection(); $id = $db->nextid($name, true); if (PEAR::isError($id)) die("nextid('$name'): ".$id->getmessage()); return $id; function rollback() { self::$db_handle->rollback(); function commit() { self::$db_handle->commit(); function close() { self::$db_handle->disconnect(); self::$db_handle = null; function adapt_output($str) {

global $_SERVER; if (array_key_exists('http_host', $_SERVER)) { $str = "<pre>".htmlentities($str)."</pre>"; return $str;?> Anhang B (Zugriff auf Oracle DB) <? include_once('db_util.php'); DB_Util::connect("oci8://wi2:wi2@widb1"); $sql = " select name, province from mondial.city where country =? order by name"; $list = DB_Util::query($sql, array('f')); foreach ($list as $city) { print $city['name']." (".$city['province'].")\n"; DB_Util::close();?>