faecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:dbklasse:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
faecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:dbklasse:start [09.06.2021 09:28] – [Modellierung - fällt aus] sbelfaecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:dbklasse:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1
Zeile 1: Zeile 1:
-====== Verbindung zur Datenbank: Eine Datenbankklasse ====== 
  
-===== Objektorientiertes PHP ===== 
- 
-Anders als Java erzwingt PHP nicht, dass der Anwender objekorientiert programmiert, PHP stellt dennoch alle Werkzeuge objektorientierter Programmierung zur Verfügung. Auch Dokuwiki selbst ist objektorientiert implementiert, so ist beispielsweise die ''syntax.php'' unseres Plugins eine von der Klasse ''DokuWiki_Syntax_Plugin'' abgeleitete Klasse:  
- 
-<code php> 
-class syntax_plugin_projekt extends DokuWiki_Syntax_Plugin 
-{ 
-[...] 
-} 
-</code> 
- 
-===== Datenbank-Klasse ===== 
- 
-Wir lagern nun den Zugriff auf die mysql-Datenbank in eine eigene Klasse aus.  
- 
----- 
-{{:aufgabe.png?nolink  |}} 
-=== (A1) === 
- 
-Erstelle eine Datei ''mysqldb.php'' in deinem Plugin-Verzeichnis mit folgendem Inhalt: 
- 
-<code php mysqldb.php> 
-<?php 
- 
-class mysqldb { 
- 
-    /** 
-     * Constructor: Connect to db, return handle 
-     * 
-     * @param string        $dbusername   DB username 
-     * @param string        $dbpassword   DB password 
-     * @param string        $dbname       Database to connect to 
-     * @param string        $host         Database host to connect to (optional) 
-     * 
-     * @return object       DB-Handle  
-     */ 
-    function mysqldb($dbusername, $dbpassword, $dbname, $host="localhost" ) { 
- 
-    try { 
-        $pdo = new PDO("mysql:host=$host;dbname=$dbname", "$dbusername", "$dbpassword"); 
-        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
- 
-    } catch ( PDOException $e ) { 
-        echo 'Verbindung zur Datenbank fehlgeschlagen: ' . $e->getMessage(); 
-        return FALSE; 
-    } 
- 
-    return $pdo; 
- 
-    } 
-} 
- 
-?> 
- 
-</code> 
- 
-Wenn man ein neues ''mysqldb'' Objekt erzeugt, benötigt der Konstruktor als Argumente den Datenbankbenutzer, dessen Passwort, den Namen der Datenbank und optional einen Datenbank-Host. 
- 
-Damit wir mysqldb-Objekte (und später vielleicht weitere Objekte) nutzen können müssen uns klar machen, wer in unserem Plugin die Rolle der "Steuerklasse" übernimmt. Am einfachtsen ist es, diese Funktion an die render-Methode in der Datei ''syntax.php'' zu delegieren. Zunächst werden dort alle Operationen ausgeführt, die nötig sind, um alle Informationen zu sammeln, dann wird -- möglicherweise unter Verwendung weiterer Methoden und/oder Objekten -- die HTML Ausgabe erzeugt, die dann im Wiki ausgegeben wird.  
- 
-{{ :faecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:dbklasse:render_as_control_class.png |}} 
- 
----- 
-{{:aufgabe.png?nolink  |}} 
-=== (A2) === 
- 
-Binde im Kopf der Datei ''syntax.php'' die ''mysqldb.php''-Datei ein. Informiere dich, was die Einbindung mit dem Befehl ''require'' bewirkt. Warum sollte man hier nicht ''include'' verwenden? 
- 
-<code php> 
-[...] 
-// must be run within Dokuwiki 
-if (!defined('DOKU_INC')) { 
-    die(); 
-} 
- 
-// Klassendateien einbinden 
-require("mysqldb.php"); 
- 
-class syntax_plugin_projekt extends DokuWiki_Syntax_Plugin 
-{ 
-[...] 
-</code> 
- 
-  * Ergänze innerhalb der ''render''-Methode Code, der eine Datenbanlk Verbindung erzeugt.  
-  * Mache dir klar, welche Funktion das dabei erzeugte Objekt ''$dbhandle'' im weiteren Verlauf des Programms hat. 
-  * Teste, was passiert, wenn du eine falsches Benutzer/Passwort-Kombination, eine nicht existente Datenbank oder einen anderen Host als localhost angibst. 
- 
-<code> 
-$dbhandle = new mysqldb("DBUSER", "dbuserPASS", "DBNAME"); 
-</code> 
- 
-==== Modellierung - fällt aus ==== 
- 
-Eigentlich sollte man sich an dieser Stelle überlegen, wie man seine Problemstellung (objektorientiert) modellieren möchte, das fällt uns etwas schwer, weil wir noch keine Problemstellung haben. Ein paar Überlegungen kann man an dieser Stelle dennoch anstellen. 
- 
-Eine grundlegende Frage könnte z.B. sein, wie man die ''mysqldb''-Klasse weiter entwickelt: Man kann weitere Methoden in der mysqldb-Klasse implementieren, die Abfragen oder Manipulationen an der Datenbank ermöglichen. Man könnte solche Programmfunktionen jedoch auch (wie im {{ :faecher:informatik:oberstufe:datenbanken:projekt:dokuwiki_plugin:dbklasse:render_as_control_class.png?linkonly|Schema}} oben angedeutet) nach Objektkategorien zusammengefasst auf weitere Klassen verteilen. Das Schema demonstriert ein solches Vorgehen für ein Micro-Blog mit Benutzern, die Posts verfassen können. In diesem Setting liefert die mysqldb-Klasse lediglich das DB-Handle, das seinerseits dann an die Methoden in den user- und posts-Klassen weitergegeben wird, so dass diese die entsprechenden Funktionen - auch auf der Datenbank - erfüllen können. 
- 
-Wir entwickeln zunächst weitere Methoden innerhalb unserer mysqldb-Klasse - wenn sich unsere Problemstellung konkretisisert können wir im Zuge eines Code-Refactoring weitere Aufteilungen und Modellierungsschritte vornehmen. 
- 
----- 
-{{:aufgabe.png?nolink  |}} 
-=== (A3) === 
- 
-Implemeniere eine Klassenliste 
  • faecher/informatik/oberstufe/datenbanken/projekt/dokuwiki_plugin/dbklasse/start.1623223705.txt.gz
  • Zuletzt geändert: 09.06.2021 09:28
  • von sbel