Webtechnologien. Teil 8: PDO/MySQL

Größe: px
Ab Seite anzeigen:

Download "Webtechnologien. Teil 8: PDO/MySQL"

Transkript

1 Webtechnologien Teil 8: PDO/MySQL Literatur [8-1] [8-2] [8-3] [8-4] [8-5] [8-6] [8-7] [8-8] [8-9] [8-10] [8-11] 2

2 Übersicht Arten der Kommunikation mit dem Datenbank-Server Grundsätzliche Operationen Weitere Routinen Tricks und Tipps 3 Einführung I PHP hat jeweils eine eigene API zum Zugriff auf die Datenbanken in Form eines Treibers. Bei MySQL ist es die MySQLi-Schnittstelle. Da sich die Schnittstellen zu verschiedenen Datenbanken unterscheiden, wurde eine einheitliche PDO-Schnittstelle geschaffen. 4

3 PHP-Schnittstellen zu Datenbanken (Auszug) Datenbank Datenbank Datenbank Adabas D Oracle MySQL dbase PostgreSQL MySQLi DB2 Sybase MariaDB Ingres Interbase FilePro Informix Und natürlich auch ODBC... Siehe dazu: 5 Schnittstellen zur MySQL-Datenbank Es gibt aus historischen Gründen drei Schnittstellen zu MySQL: mysql-schnittstelle (wird nicht mehr unterstützt) mysqli-schnittstelle (improved, möglichst nicht benutzen) PDO-Schnittstelle (Portable Data Object) Diese abstrahiert von den verschiedenen Schnittstellen zu den Datenbanken aber nur syntaktisch. Die speziellen Eigenschaften der SQL-Dialekte der jeweiligen Datenbanken bleiben jedoch erhalten! Diese PDO-Schnittstelle wird hier beschrieben. 6

4 Das PDO-Objekt Die Benutzung der Schnittstelle erfolgt nur Objekt-orientiert. Durch das Erzeugen des Objekts wird gleichzeitig eine Verbindung zur Datenbank aufgebaut, die beim Entfernen des Objekts geschlossen wird. Das allgemeine Schema des Zugriffs sieht daher so aus: Aufbau der Verbindung Zugriffe auf die Datenbank Abbau der Verbindung 7

5 Verbindung zur Datenbank I object PDO(DSN [,Nutzer [,Passwort[,Optionen]]]); DSN heißt Data Source Name: die Definition des Zugriffs auf die Datenbank. Dies ist ein String mit dem Aufbau: Datenbanktyp: Keyword=Wert; Keyword=Wert; Datenbanktyp ist hier mysql Für Keyword können hier eingesetzt werden: Host: Angabe der IP/DNS-Adresse der Datenbank dbname: Name der ausgewählten Datenbank Nutzer und Passwort sind Strings Der letzte Parameter definiert Optionen, die für die Kommunikation mit der Datenbank wichtig sind (ein PHP-Hash mit definierten Keys) 9 Verbindung zur Datenbank II - Beispiel (1) $DSN= 'mysql:host=localhost;dbname=accounts'; (2) $DB_USER= 'nobody'; (3) $DB_PW= 'blabla426'; (4) $DB_options = array( (5) PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' (6) ); (7) try { (8) $db= new PDO($DSN,$DB_USER,$DB_PW,$DB_options); (9) $db->setattribute(pdo::attr_errmode, PDO::ERRMODE_WARNING); (10)} catch(pdoexception $err) { (11) echo 'DB ERROR: '.$err->getmessage().php_eol; (12)} Die Datenbank liegt auf der eigenen Maschine und heißt "accounts": (1). Der User ist "nobody" mit dem Passwort "blabla426" (2) und (3). Mit den Optionen wird der Zeichensatz auf UTF-8 gesetzt: (4) bis (6). Es wird der Warn-Modus eingeschaltet: (9). 10

6 Bemerkungen zu PHP/Optionen PDO::MYSQL_ATTR_INIT_COMMAND Klassenname Name der Konstante PDO::MYSQL_ATTR_INIT_COMMAND ist in PHP eine static-konstante. Derartige Konstanten haben nie ein $ zum Beginn. Sie werden per Konvention in Großbuchstaben geschrieben (wie in Java). 11 Verbindung zur Datenbank III - Erläuterungen (4) $DB_options = array( (5) PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' (6) ); MySQL-spezifische Konstante Es sind noch andere Optionen für MySQL möglich, z.b.: PDO::MYSQL_ATTR_LOCAL_INFILE (alternative Konfigurationsdatei) um z.b. zum Testen eine andere Konfiguration als bei normalen Betrieb zu benutzen. PDO::MYSQL_ATTR_COMPRESS Daten der Verbindung werden komprimiert 12

7 Verbindung zur Datenbank IV - Erläuterungen (7) try { (8) $db= new PDO($DSN,$DB_USER,$DB_PW,$DB_options); (10)} catch(pdoexception $err) { (11) echo 'DB ERROR: '.$err->getmessage().php_eol; (12)} Im Fehlerfalle wirft das PDO-Objekt eine Exception, die mit der obigen Konstruktion gefangen werden kann. Die Methode getmessage() erzeugt einen String mit der Fehlermeldung. PHP_EOL ist die Konstante mit der Bedeutung End-of-Line. Die try-catch-konstruktion ist in PHP genauso wie in Java: Im catch-teil wird ein Objekt deklariert, das weiter gehende Informationen enthält, hier von der Klasse PDOException (Zeile 10). 13 Verbindung zur Datenbank V - Erläuterungen (7) try { (8) $db= new PDO($DSN,$DB_USER,$DB_PW,$DB_options); (9) $db->setattribute(pdo::attr_errmode,pdo::errmode_warning); (10)} catch(pdoexception $err) { Nachdem das Objekt generiert wurde, können dem Objekt Eigenschaften zugewiesen werden, die aber nur das PDO-Objekt betreffen, nicht die Benutzung von MySQL. Es gibt drei Modi: PDO::ERRMODE_SILENT Es wird lediglich ein Errorcode geliefert, der explizit nach jedem PDO- Methodenaufruf abgefragt werden muss. Default! PDO::ERRMODE_WARNING Es wird eine Warn-Meldung ausgegeben sowie der Errorcode geliefert. PDO::ERRMODE_EXCEPTION Es wird eine Exception geworfen. 14

8 Hinweise Ob mit Exceptions oder mit einem der anderen Modi gearbeitet wird, hängt von der Programmierkonvention im betreffenden Projekt ab. Die Benutzung von Exceptions führt zu einem umständlichen Code; dafür entfallen die vielen Fehlerabfragen. Wer sowieso immer den Erfolg einer Routine in einer Fehlerabfrage abfragt, der sollte während der Entwicklung im Warn-Modus während der Produktion im Silent-Modus arbeiten. 15 Unser Beispiel weiter Der MySQL-Server muss natürlich laufen. Auch muss die Datenbank mit dem User "nobody" und dem Passwort "blabla426" eingerichtet sein. 16

9 Einrichten einer Datenbank I 17

10 Einrichten einer Datenbank III Es wird ein neues Benutzerkonto eingerichtet. Dies hier wird über den Menue-Punkt "Rechte" erreicht. 19

11 Einrichten einer Datenbank V So sieht es schon einmal ganz gut aus... 22

12 Einrichten einer Datenbank VI Dann werden die beiden "Jeder"-Konten gelöscht. Es fehlt dann noch das Setzen des Passworts für die drei root- Bereiche. 23 Unser Beispiel weiter II Create Table Nun bauen wir eine Tabelle in SQL: (1) CREATE TABLE account ( (2) id int(11) NOT NULL PRIMARY KEY, (3) name varchar(45) NOT NULL, (4) pw varchar(64) NOT NULL, (5) groupid int(11) NOT NULL (6) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; id ist der Schlüsselwert in der Tabelle (2). Der Login-Name und das Passwort dürfen nicht leer sein (3,4). Dann bereiten wir noch Gruppen vor, indem eine Gruppen-ID als Integer zugelassen wird (5). Da wir Transaktionen haben wollen, muss die InnoDB-Version von MySQL benutzt werden (6). In den letzten Versionen von MySQL ist dies der Defaultwert und braucht daher nicht angegeben zu werden. Und natürlich UTF-8 als Zeichensatz (6). 24

13 Unser Beispiel weiter III Create Table (1) $create_table = "CREATE TABLE account ("; (2) $create_table.= "id int(11) NOT NULL PRIMARY KEY,"; (3) $create_table.= "name varchar(45) NOT NULL,"; (4) $create_table.= "pw varchar(64) NOT NULL,"; (5) $create_table.= "groupid int(11) NOT NULL"; (6) $create_table.= ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"; (7) $rtn= $db->exec($create_table); (8) if($rtn===false) { (9) $err= $db->errorinfo(); (10) echo 'DB ERROR: #'.$err[1]." ".$err[2].php_eol; (11)} Die Tabelle wird mit exec() angelegt (7). Der String für $create_table wird stückweise mit der verkürzten Punkt-Notation zusammengesetzt (Zeilen 1 bis 6). In Zeile (8) muss die Fehlerabfrage mit === realisiert werden. 25 Create Table I - Erläuterungen (7) $rtn= $db->exec($create_table); (8) if($rtn===false) { exec("sql-string") führt eine SQL-Operation aus, bei der keine Werte anschließend abgefragt werden, d.h. exec() kann nicht für Abfragen von Tabelleninhalten benutzt werden. In der Variablen $rtn wird der Return-Code abgespeichert, der im Fehlerfall den boole'schen Wert false hat, ansonsten die Anzahl der betroffenen Zeilen in der Tabelle enthält. Daher muss mit === abgefragt werden (weil die Anzahl ja auch 0 sein kann, was im Falle von == fehlerhafter Weise als false interpretiert wird). 26

14 Create Table II - Erläuterungen (8) if($rtn===false) { (9) $err= $db->errorinfo(); (10) echo 'DB ERROR: #'.$err[1]." ".$err[2].php_eol; (11)} Die Methode errorinfo() liefert ein Array zurück (9): Index[0] enthält den SQL-Error-Code Index[1] enthält den Error-Code des Treibers Index[2] enthält die Fehlermeldung Siehe: Dann gibt es noch die Methode errorcode(), die lediglich den SQL-Error- Code liefert. 27 Unser Beispiel weiter IV - Drop Table (1) $create_table = "CREATE TABLE account (";... (6) $create_table.= ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"; (7) $rtn= $db->exec($create_table); (8) if($rtn===false) { (9) $err= $db->errorinfo(); (10) echo 'DB ERROR: #'.$err[1]." ".$err[2].php_eol; (11)} (12)$delete_table= "DROP TABLE account;"; (13)$rtn= $db->exec($delete_table); (14)if($rtn===false) { (15) $err= $db->errorinfo();...} Die Tabelle account wird hier gelöscht (12, 13). Das machen wir hier nur für unser Beispiel, damit wir in mehreren Durchläufen etwas ausprobieren können. Für ein Login-Modul ist das natürlich unsinnig. 28

15 Unser Beispiel weiter V Einfügen von Daten (1) $insert = "INSERT INTO account(id,name,pw,groupid)" (2) $insert.= "VALUES(0,'root','bitte!',0)"; (3) $rtn= $db->exec($insert); (4) if($rtn===false) { (5) $err= $db->errorinfo(); (6) echo 'DB ERROR: #'.$err[1]." ".$err[2].php_eol; (7) } In die Tabelle account wird ein einziger Record (3) eingefügt. Bitte beachten Sie, dass in SQL andere String-Begrenzer als in PHP benutzt werden (2). 29 Wir glauben ja nichts sehen wir nach Das ist die Ausgabe der Tabelle in phpmyadmin. 30

16 Unser Beispiel weiter VI Einfügen von Daten $val[]=array('id'=>0,'name'=>'root', 'pw'=>'bitte!','groupid'=>0); $val[]=array('id'=>1,'name'=>'user', 'pw'=>'danke!','groupid'=>0); $val[]=array('id'=>2,'name'=>'helmut','pw'=>'sdgafg','groupid'=>0); $val[]=array('id'=>3,'name'=>'evelyn','pw'=>'tztrff','groupid'=>0); (1) foreach($val as $v) { (2) $insert = "INSERT INTO account(id,name,pw,groupid) "; (3) $insert.= "VALUES(${v['id']},'${v['name']}','${v['pw']}'"; (4) $insert.= ",${v['groupid']})"; (5) $rtn= $db->exec($insert); (6) if($rtn===false) { (7) $err= $db->errorinfo(); (8) echo 'DB ERROR: #'.$err[1]." ".$err[2].php_eol; (9) } (10)} Es wird nun eine Tabelle zum Füllen der Datenbank-Tabelle verwendet. 31 Einfügen von Daten - Erläuterungen (1) foreach($val as $v) { (2) $insert = "INSERT INTO account(id,name,pw,groupid) "; (3) $insert.= "VALUES(${v['id']},'${v['name']}','${v['pw']}'"; (4) $insert.= ",${v['groupid']})"; Die Konstruktion ${v['id']} ist erforderlich, weil ein Ausdruck zur Auswertung innerhalb des "-Strings benutzt wird, daher die {}. Die einzelnen Elemente des Hashs sind ja benannt, so dass relativ schnell klar wird, was wann in das Insert-SQL-Statement eingefügt wird. Es wird dringend empfohlen, die Namen der Spalten in derselben Reihenfolge wie bei der Tabellendefinition sowie die Benennung der Werte in dem Hash ($val) genauso wie in der Tabellendefinition zu benutzen. 32

17 Wir glauben ja nichts sehen wir nach Das ist die Ausgabe der Tabelle in phpmyadmin. 33 Unser Beispiel weiter VII Auslesen von Daten (1) $db= new PDO($DSN,$DB_USER,$DB_PW,$DB_options); (2) $db->setattribute(pdo::attr_errmode, PDO::ERRMODE_WARNING); (3) $db->setattribute(pdo::attr_default_fetch_mode,pdo::fetch_assoc); Es wird in (3) das Attribut PDO::ATTR_DEFAULT_FETCH_MODE beim Erzeugen des PDO-Objekts gesetzt, das die Art des Objekts beim Auslesen von Informationen mit der Methode query() bestimmt. Mögliche Werte sind sind: PDO::FETCH_ASSOC: Es wird ein Hash mit den Namen der Spalten geliefert (das ist zu empfehlen). PDO::FETCH_BOTH: Ein Hash mit Array-Indices wird geliefert. PDO::FETCH_OBJ: Ein Objekt wird generiert. Das Durchführen der SQL-Instruktion mit Lesen von Daten erfolgt mit der Query-Operation. Das Lesen der generierten Daten aus der Datenbank in PHP-Variablen erfolgt mit der Fetch-Operation. 34

18 Auslesen von Daten nach query() $data= $db->query($sql-query); Absetzen des SQL-Befehls $row= $data->fetch(); alternativ $table= $data->fetchall(); Auslesen de Daten aufgrund des SQL-Befehls. Ein query() liefert den Deskriptor einer (temporären) Tabelle in der Datenbank als ein Objekt vom Typ PDOStatement. Mit fetch() wird jeweils die nächste Zeile aus dem Objekt vom Typ PDOStatement des letzten Querys gelesen. fetch() liefert Daten entsprechend ATTR_DEFAULT_FETCH_MODE oder ein Boolean-False, falls keine Daten (mehr) vorhanden sind. fetchall() liest analog die ganze (temporäre) Tabelle in ein Array ein. fetchall() ist natürlich nur bei kleinen Tabellen sinnvoll. 35 Auslesen von Daten Variante I (4) $query= "SELECT * FROM account"; (5) $data= $db->query($query); (6) while(($row= $data->fetch())!==false) { (7) var_export($row); echo PHP_EOL; (8) } array ( 'id' => '0', 'name' => 'root', 'pw' => 'bitte!', 'groupid' => '0', ) array ( 'id' => '1', 'name' => 'user', 'pw' => 'danke!', 'groupid' => '0', ) array ( 'id' => '2', 'name' => 'helmut', 'pw' => 'sdgafg', 'groupid' => '0', ) array ( 'id' => '3', 'name' => 'evelyn', 'pw' => 'tztrff', 'groupid' => '0', ) Mit jedem Schleifendurchlauf wird eine Zeile aus der Tabelle gelesen und als Hash geliefert. 36

19 Auslesen von Daten Variante II (4) $query= "SELECT * FROM account"; (5) $data= $db->query($query); (6) while(($row= $data->fetch())!==false) { (7) printf('%10s ',$row['id']); (8) printf('%10s ',$row['name']); (9) printf('%10s ',$row['pw']); (10) printf('%10s ',$row['groupid']); (11) echo PHP_EOL; (12)} Zugriff entsprechend PDO::FETCH_ASSOC 0 root bitte! 0 1 user danke! 0 2 helmut sdgafg 0 3 evelyn tztrff 0 Output 37 Auslesen von Daten Variante III (4) $query= "SELECT * FROM account"; (5) $data= $db->query($query); (6) while(($row= $data->fetch())!==false) { (7) printf('%10s ',$row->id); (8) printf('%10s ',$row->name); (9) printf('%10s ',$row->pw); (10) printf('%10s ',$row->groupid); (11) echo PHP_EOL; (12)} Zugriff entsprechend PDO::FETCH_OBJ 0 root bitte! 0 1 user danke! 0 2 helmut sdgafg 0 3 evelyn tztrff 0 Output 38

20 Auslesen von Daten Variante IV (4) $query= "SELECT * FROM account"; (5) $data= $db->query($query); (6) while(($row= $data->fetch())!==false) { (7) foreach($row as $val) { (8) printf('%10s ',$val); (9) } (10) echo PHP_EOL; (11)} Durchlaufen einer Zeile 0 root bitte! 0 1 user danke! 0 2 helmut sdgafg 0 3 evelyn tztrff 0 Output 39 Nun endlich zum Login I (1) $LoginName= 'root'; // Simulation des Formulars (2) $LoginPW= 'bitte!'; (3) $query= "SELECT * FROM account WHERE name='$loginname'"; (4) $data= $db->query($query); (5) $rows= $data->fetchall(); (6) var_export($rows); echo PHP_EOL; (7) if((count($rows)==1)&&($loginpw==$rows[0]['pw'])) { (8) echo "loggt in".php_eol; (9) } else { (10) echo "NOT loggt in".php_eol; (11)} $LoginName und $LoginPW kommen aus dem Formular, was hier durch die Zuweisungen simuliert wird. Beachten Sie die Abfrage in (7): es muss ein einziger Eintrag da sein (count()) und das PW muss stimmen. array ( 0 => array ( 'id' => '0', 'name' => 'root', 'pw' => 'bitte!', 'groupid' => '0', ), ) loggt in 40

21 Nun endlich zum Login II (1) $LoginName= 'root'; (2) $LoginPW= 'bitte!'; (3) $query= "SELECT * FROM account WHERE name='$loginname'"; (4) $data= $db->query($query); (5) $rows= $data->fetch(); (6) var_export($rows); echo PHP_EOL; (7) if(($rows!==false)&&($loginpw==$rows['pw'])) { (8) echo "loggt in".php_eol; (9) } else { (10) echo "NOT loggt in".php_eol; (11)} Das ganze geht auch mit einem fetch(), nur dass der Datentyp des Ergebnisses anders ist. Das zeigt sich in der Abfrage. var_export($rows) gibt die Struktur und den Typ des Ergebnisses aus. array ( 'id' => '0', 'name' => 'root', 'pw' => 'bitte!', 'groupid' => '0', ) loggt in 41 Alternative zum Füllen der Tabelle I (1) $insert = "INSERT INTO account(id,name,pw,groupid)"; (2) $insert.= "VALUES(?,?,?,?)"; (3) $stmt= $db->prepare($insert); (4) $id= 0; $name= 'root'; $pw= 'bitte!'; $groupid= 0; (5) $stmt->bindvalue(1,$id, PDO::PARAM_INT); (6) $stmt->bindvalue(2,$name, PDO::PARAM_STR); (7) $stmt->bindvalue(3,$pw, PDO::PARAM_STR); (8) $stmt->bindvalue(4,$groupid,pdo::param_int); (9) $stmt->execute(); id name pw groupid 0 root bitte! 0 Bei den gebundenen Parametern wird eine Schablone (1-2) erstellt, die dann dem Datenbank-Server mitgeteilt wird (3). In der Schablone wird an die Parameter-Positionen ein? gesetzt. In der Reihenfolge der? werden die Parameter per bindvalue(), als Wertekopie, den? mit einer Typangabe (z.b. PDO::PARAM_INT) zugeordnet. Beim execute() werden diese Werte zum Datenbank-Server geschickt, das SQL- Statement dort ausgefüllt und dann ausgeführt. 42

22 Alternative zum Füllen der Tabelle II Schablone erzeugen Parameter zuordnen Ausführen bindvalue() bindparam() Integer: PDO::PARAM_INT String: PDO::PARAM_STR Bool: PDO::PARAM_BOOL Das ist das allgemeine Schema bei der Benutzung von gebundenen Parametern. Neben dem schon eingeführten bindvalue() gibt es noch das bindparam(), das die Bindung über eine Referenz realisiert. Neben den beiden Typen für String und Integer gibt es noch den Typ Boolean. 43 Alternative zum Füllen der Tabelle III (1) $insert = "INSERT INTO account(id,name,pw,groupid)"; (2) $insert.= "VALUES(?,?,?,?)"; (3) $stmt= $db->prepare($insert); (4) $stmt->bindparam(1,$id, PDO::PARAM_INT); (5) $stmt->bindparam(2,$name, PDO::PARAM_STR); (6) $stmt->bindparam(3,$pw, PDO::PARAM_STR); (7) $stmt->bindparam(4,$groupid,pdo::param_int); (8) foreach($val as $row) { (9) $id= $row['id']; (10) $name= $row['name']; (11) $pw= $row['pw']; (12) $groupid= $row['groupid']; (13) $stmt->execute(); (14)} Das Hash $val ist wie oben gesetzt. id name pw groupid 0 root bitte! 0 1 user danke! 0 2 helmut sdgafg 0 3 evelyn tztrff 0 44

23 Alternative zum Füllen der Tabelle IV - Bemerkungen (3) $stmt= $db->prepare($insert); (4) $stmt->bindparam(1,$id, PDO::PARAM_INT);... (8) foreach($val as $row) { (9) $id= $row['id']; (10) $name= $row['name']; (11) $pw= $row['pw']; (12) $groupid= $row['groupid']; (13) $stmt->execute(); (14)} In der Schleife wird immer wieder auf die gebundenen Variablen zugegriffen. Bei bindvalue() wird der Wert zum Zeitpunkt des Bindens fest dem? zugeordnet. Bei bindparam() wird der aktuelle Wert zum Zeitpunkt des execute() benutzt. $val[]=array('id'=>0,'name'=>'root', 'pw'=>'bitte!','groupid'=>0); $val[]=array('id'=>1,'name'=>'user', 'pw'=>'danke!','groupid'=>0); 45 Alternative zum Füllen der Tabelle V (1) $insert = "INSERT INTO account(id,name,pw,groupid)"; (2) $insert.= "VALUES(:id,:name,:pw,:groupID)"; (3) $stmt= $db->prepare($insert); (4) $stmt->bindparam(':id', $id, PDO::PARAM_INT); (5) $stmt->bindparam(':name', $name, PDO::PARAM_STR); (6) $stmt->bindparam(':pw', $pw, PDO::PARAM_STR); (7) $stmt->bindparam(':groupid',$groupid,pdo::param_int); (8) foreach($val as $row) { (9) $id= $row['id']; (10) $name= $row['name']; (11) $pw= $row['pw']; (12) $groupid= $row['groupid']; (13) $stmt->execute(); (14)} Mit einem Doppelpunkt eingeleitet lassen sich die? wie Variablen adressieren. 46

24 SQL Injection I - Vorbereitung (1) $LoginName= 'root'; $LoginPW= 'bitte!'; (2) $update= "UPDATE account SET pw = '*balla*' WHERE id = 0"; (3) $data= $db->exec($update); id name pw groupid 0 root *balla* 0 1 user danke! 0 2 helmut sdgafg 0 3 evelyn tztrff 0 Zur Vorbereitung einer kleinen Demo für SQL-Injection wird ein Update ausprobiert. SQL-Updates werden ganz analog zum Insert also auch mit gebundenen Parametern - ausgeführt. 47 SQL Injection II (1) $LoginPW= 'bitte!'; (2) $update= "UPDATE account SET pw = '*balla*' WHERE id = 0"; (3) $LoginName= "a';$update"; (4) $query= "SELECT * FROM account WHERE name='$loginname'"; (5) echo $query.php_eol; (6) $data= $db->query($query); (7) $rows= $data->fetch(); Quotes (8) if(($rows!==false)&&($loginpw==$rows['pw'])) { (9) echo "loggt in".php_eol; (10)} else { (11) echo "NOT loggt in".php_eol; (12)} Ausgabe(5): SELECT * FROM account WHERE name='a'; UPDATE account SET pw = '*balla*' WHERE id = 0' Statt eines vernünftigen Loginnamens wird wie in (3) simuliert ein Mischung aus einem Namen und einer SQL-Anweisung hier ein Update eingegeben. Die Zusammensetzung ist unten in 2 Zeilen dargestellt. 48

25 SQL Injection IV Beste Abwehr (1) $LoginPW= 'bitte!'; (2) $update= "UPDATE account SET pw = '*balla*' WHERE id = 0"; (3) $LoginName= "a';$update"; (4) $query= "SELECT name, pw FROM account WHERE name=:loginname"; (5) $stmt= $db->prepare($query); (6) $stmt->bindvalue(':loginname',$loginname,pdo::param_str); (7) $stmt->execute(); (8) $stmt->bindcolumn('name',$realname,pdo::param_str); (9) $stmt->bindcolumn('pw',$realpw, PDO::PARAM_STR); (10)$rows= $stmt->fetch(); (11)echo $RealName." ".$RealPW.PHP_EOL; (12)if($LoginPW==$RealPW) { (13) echo "loggt in".php_eol; (14)... Die Benutzung von Prepared Statements ist am Besten, da die Formulardaten immer als Daten behandelt werden. 50

26 Transaktionen I (1) $db->begintransaction(); (2) $update= "UPDATE account SET pw = '*balla*' WHERE id = 0"; (3) $data= $db->exec($update); (4) $update= "UPDATE account SET pw = '*' WHERE id = 3"; (5) $data= $db->exec($update); (6) var_dump($data); (7) $update= "UPDATE account SET pw = '??' WHERE id = 4"; (8) $data= $db->exec($update); (9) var_dump($data); (10)$db->commit(); (11)//$db->rollBack(); Fehlerhaftes UPDATE Mit begintransaction() wird eine Transaktion eingeleitet und mit commit() positiv abgeschlossen; erst dann sind die Daten geändert sichtbar. Mit rollback() werden alle Änderungen verworfen. Der Rückgabewert von UPDATE ist die Anzahl der betroffenen Zeilen. 52

27 Transaktionen II int(1) int(0) id name pw groupid 0 root *balla* 0 1 user danke! 0 2 helmut sdgafg 0 3 evelyn * 0 Fehlerhaftes UPDATE commit() int(1) int(0) id name pw groupid 0 root bitte! 0 1 user danke! 0 2 helmut sdgafg 0 3 evelyn tztrff 0 rollback() 53 Tipps I Globales Definieren <?php $Param['host']= 'localhost'; $Param['uid'] = 'nobody'; $Param['pass']= 'bitte!'; $Param['db'] = 'account';?> $Param['dsn'] = "mysql:host=${param['host']}"; $Param['dsn'].= ";dbname=${param['db']}"; Globale Parameterwerte sollten in eine Include-Datei mit der Endung ".inc.php" ausgelagert und dann als "Kopf" eingebunden werden. Aus Sicherheitsgründen sollte die Endung immer ".php" sein (was für ".inc.php" ja gilt), da der Server diese Datei nie(?) uninterpretiert zum Browser sendet. 54

28 Tipps II Benutzung der globalen Definitionen (1) (2) (3) (4) (5) (6) (7) require('myparameter.inc.php'); $DB_options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ); try { $db= new PDO($Param['dsn'],$Param['uid'], $Param['pass'],$DB_options); Durch die Auslagerung der Parameter in eine externe Datei wird der Code noch allgemeingültiger und dadurch leichter zu warten. Die Optionen könnten in einem weiteren Schritt auch ausgelagert werden. 55 Nach dieser Anstrengung etwas Entspannung... 56

Webtechnologien. Teil 8: PDO/MySQL

Webtechnologien. Teil 8: PDO/MySQL Webtechnologien Teil 8: PDO/MySQL 23.11.18 1 Literatur [8-1] https://dev.mysql.com/doc/refman/8.0/en/ [8-2] http://php.net/manual/en/book.mysqli.php [8-3] https://www.tutorialspoint.com/mariadb/mariadb_tutorial.pdf

Mehr

Webtechnologien. Teil 8: PDO/MySQL

Webtechnologien. Teil 8: PDO/MySQL Webtechnologien Teil 8: PDO/MySQL 24.10.17 1 Übersicht Arten der Kommunikation mit dem Datenbank-Server Grundsätzliche Operationen Weitere Routinen Tricks und Tipps Siehe: http://dev.mysql.com/doc/refman/5.5/en/apis-php.html

Mehr

Webtechnologien. Teil 8: PDO/MySQL

Webtechnologien. Teil 8: PDO/MySQL Webtechnologien Teil 8: PDO/MySQL 17.05.18 1 Übersicht Arten der Kommunikation mit dem Datenbank-Server Grundsätzliche Operationen Weitere Routinen Tricks und Tipps Siehe: http://dev.mysql.com/doc/refman/5.5/en/apis-php.html

Mehr

Webtechnologien. Teil 8: PDO/MySQL

Webtechnologien. Teil 8: PDO/MySQL Webtechnologien Teil 8: PDO/MySQL 24.10.17 1 Übersicht Arten der Kommunikation mit dem Datenbank-Server Grundsätzliche Operationen Weitere Routinen Tricks und Tipps Siehe: http://dev.mysql.com/doc/refman/5.5/en/apis-php.html

Mehr

Webtechnologien Teil 12: PHP 5 mit PDO/MySQL

Webtechnologien Teil 12: PHP 5 mit PDO/MySQL Webtechnologien Teil 12: PHP 5 mit PDO/MySQL 01.05.15 1 Übersicht Arten der Kommunikation mit dem Datenbank-Server Grundsätzliche Operationen Weitere Routinen Tricks und Tipps Siehe: http://dev.mysql.com/doc/refman/5.5/en/apis-php.html

Mehr

Multimedia im Netz Wintersemester 2013/14. Übung 02 (Hauptfach)

Multimedia im Netz Wintersemester 2013/14. Übung 02 (Hauptfach) Multimedia im Netz Wintersemester 2013/14 Übung 02 (Hauptfach) Ludwig-Maximilians-Universität München Multimedia im Netz WS 2013/14 - Übung 2-1 PHP und MySQL Es werden mehrere APIs von PHP angeboten um

Mehr

Willkommen. Datenbanken und Anbindung

Willkommen. Datenbanken und Anbindung Willkommen Datenbanken und Anbindung Welche stehen zur Wahl? MySQL Sehr weit verbreitetes DBS (YT, FB, Twitter) Open-Source und Enterprise-Version Libs in C/C++ und Java verfügbar Grundsätzlich ist ein

Mehr

1a) SQL Stored Procedure via IDs

1a) SQL Stored Procedure via IDs 1a) SQL Stored Procedure via IDs Erstellen Sie analog zu Aufgabe 2d) des ersten Übungsblatts eine SQL Stored Procedure, welche den Freundschaftsgrad zweier Benutzer eines sozialen Netzwerks aktualisiert.dazu

Mehr

Die Datenbank und der Strukturentwurf wurden vorher mit phpmyadmin erzeugt.

Die Datenbank und der Strukturentwurf wurden vorher mit phpmyadmin erzeugt. PHP und MySQLi Der Benutzer kann mit Hilfe von PHP eine komfortable Schnittstelle zu den MySQL-Datenbanken herstellen, um Daten anzuzeigen, einzufügen, zu verändern und zu löschen. Die Datenbank und der

Mehr

PHP- Umgang mit Datenbanken (1)

PHP- Umgang mit Datenbanken (1) PHP- Umgang mit Datenbanken (1) Weitere Funktionen zum Umgang mit Datenbanken (Erzeugen, Löschen) und Tabellen (Erzeugen, Löschen) Zum Beispiel für das Erzeugen einer neuen Datenbank $dbname= blumendb

Mehr

Grundlagen der Informatik 2

Grundlagen der Informatik 2 Grundlagen der Informatik 2 Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm Hochschule Harz FB Automatisierung und Informatik mwilhelm@hs-harz.de Raum 2.202 Tel. 03943 / 659 338 1 Gliederung 1. Einführung

Mehr

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin PhpMyAdmin = grafsches Tool zur Verwaltung von MySQL-Datenbanken Datenbanken erzeugen und löschen Tabellen und Spalten einfügen,

Mehr

Datenbank und Tabelle mit SQL erstellen

Datenbank und Tabelle mit SQL erstellen Datenbank und Tabelle mit SQL erstellen 1) Übung stat Mit dem folgenden Befehlen legt man die Datenbank stat an und in dieser die Tabelle data1 : CREATE DATABASE stat; USE stat; CREATE TABLE data1 ( `id`

Mehr

MySQL, phpmyadmin & SQL. Kurzübersicht

MySQL, phpmyadmin & SQL. Kurzübersicht MySQL, phpmyadmin & SQL Kurzübersicht Referenzen MySQL Documentation: http://dev.mysql.com/doc PHP 5 / MySQL5. Studienausgabe. Praxisbuch und Referenz (Kannengießer & Kannengießer) 2 Datenbank anlegen

Mehr

Java: MySQL-Anbindung mit JDBC.

Java: MySQL-Anbindung mit JDBC. Java: MySQL-Anbindung mit JDBC Vorarbeiten Wir brauchen: - MySQL-Server - JDBC-Treiber - (Import java.sql.*) Vorarbeiten MySQL-Server in unserem Falle: WAMP (= Apache) (runterladen, installieren, starten)

Mehr

Entwicklung einer Webseite zur Verwaltung von Prüfungsterminen

Entwicklung einer Webseite zur Verwaltung von Prüfungsterminen Staatliche Fachschule für Mechatronik- und Elektrotechnik Entwicklung einer Webseite zur Verwaltung von Prüfungsterminen von Wagemann Andreas 3. Januar 2018 Entwicklungsarbeit Staatliche Fachschule für

Mehr

Oracle & Java HOW TO

Oracle & Java HOW TO Oracle & Java HOW TO Helge Janicke, Niels-Peter de Witt, Karsten Wolke 21. Januar 2002 Inhaltsverzeichnis 1 Java-Anbindung an Oracle-DB 2 2 Benötigte Programme und Daten 2 3 Einbinden der Klassen 2 4 Aufbau

Mehr

Universität Augsburg, Institut für Informatik WS 2011/2012 Prof. Dr. W. Kießling 09. Dez Dr. M. Endres, Dr. S. Mandl, F. Wenzel Lösungsblatt 6

Universität Augsburg, Institut für Informatik WS 2011/2012 Prof. Dr. W. Kießling 09. Dez Dr. M. Endres, Dr. S. Mandl, F. Wenzel Lösungsblatt 6 Universität Augsburg, Institut für Informatik WS 2011/2012 Prof. Dr. W. Kießling 09. Dez. 2011 Dr. M. Endres, Dr. S. Mandl, F. Wenzel Lösungsblatt 6 Datenbanksysteme I Aufgabe 1: Deklarative Änderungsoperationen

Mehr

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 11. Dez M. Endres, A. Huhn, T. Preisinger Lösungsblatt 7

Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 11. Dez M. Endres, A. Huhn, T. Preisinger Lösungsblatt 7 Universität Augsburg, Institut für Informatik WS 2006/2007 Dr. W.-T. Balke 11. Dez. 2006 M. Endres, A. Huhn, T. Preisinger Lösungsblatt 7 Aufgabe 2 + 3: Datenbanksysteme I import java.sql.*; import oracle.jdbc.driver.*;

Mehr

Kapitel 9. Embedded SQL. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Kapitel 9. Embedded SQL. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1 Kapitel 9 Embedded SQL Vorlesung Datenbanken 1 Embedded SQL (siehe auch [Date00]) Arbeitsweise ähnlich PL/SQL, allerdings: Normale Programmiersprache mit eingestreuten SQL-Befehlen und anderen Befehlen

Mehr

PHP und MySQL. Integration von MySQL in PHP. Zellescher Weg 12 Willers-Bau A109 Tel. +49 351-463 - 32424. Michael Kluge (michael.kluge@tu-dresden.

PHP und MySQL. Integration von MySQL in PHP. Zellescher Weg 12 Willers-Bau A109 Tel. +49 351-463 - 32424. Michael Kluge (michael.kluge@tu-dresden. Zentrum für Informationsdienste und Hochleistungsrechnen (ZIH) PHP und MySQL Integration von MySQL in PHP Zellescher Weg 12 Willers-Bau A109 Tel. +49 351-463 - 32424 (michael.kluge@tu-dresden.de) MySQL

Mehr

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2 5 Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn 7 7. Datenbank-Zugriff Zum Beispiel aus PHP-Skripten: Client 7-2 Struktur einer Datenbank 7-3 Erzeugen von Datenbanken

Mehr

Fakultät IWI DB & IS II - SS PHP Teil 2. Zugriff auf Datenbanken. Objektorientierung in PHP5. Andreas Schmidt PHP - Teil 2 1/27

Fakultät IWI DB & IS II - SS PHP Teil 2. Zugriff auf Datenbanken. Objektorientierung in PHP5. Andreas Schmidt PHP - Teil 2 1/27 PHP Teil 2 Zugriff auf Datenbanken Objektorientierung in PHP5 Andreas Schmidt PHP - Teil 2 1/27 Datenbankzugriff mit PHP verschiedene Varianten native Schnittstelle (mysql_, ora_,...) ODBC Funktionen

Mehr

Entwicklung einer Webseite zur Verwaltung von Prüfungsterminen

Entwicklung einer Webseite zur Verwaltung von Prüfungsterminen Staatliche Fachschule für Mechatronik- und Elektrotechnik Entwicklung einer Webseite zur Verwaltung von Prüfungsterminen von Voit Alexander 3. Januar 2018 Entwicklungsarbeit Staatliche Fachschule für Mechatronik-

Mehr

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2

7. Datenbank-Zugriff. Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn. Zum Beispiel aus PHP-Skripten: Client 7-2 5 Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn 7 7. Datenbank-Zugriff Zum Beispiel aus PHP-Skripten: Client 7-2 Struktur einer Datenbank 7-3 Erzeugen von Datenbanken

Mehr

Kapitel 10. JDBC und SQLJ. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1

Kapitel 10. JDBC und SQLJ. Prof. Dr. Wolfgang Weber Vorlesung Datenbanken 1 Kapitel 10 JDBC und SQLJ 1 JDBC und SQLJ Bisher: Einbettung von SQL (statisch bzw. dynamisch) in C, C++, COBOL, ADA (embedded SQL) bzw. prozedurale Erweiterungen für SQL in Oracle (PL/SQL) Was ist mit

Mehr

5.8 Bibliotheken für PostgreSQL

5.8 Bibliotheken für PostgreSQL 5.8 Bibliotheken für PostgreSQL Haskell/WASH: Modul Dbconnect PHP: pqsql-funktionen Java/JSP: JDBC Perl: DBI database interface modul Vorläufige Version 80 c 2004 Peter Thiemann, Matthias Neubauer 5.9

Mehr

Grundlagen der Informatik 2

Grundlagen der Informatik 2 Grundlagen der Informatik 2 Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm Hochschule Harz FB Automatisierung und Informatik mwilhelm@hs-harz.de Raum 2.202 Tel. 03943 / 659 338 1 Gliederung 1. Einführung

Mehr

Der Einsatz von SELECT from INSERT auf dem System i

Der Einsatz von SELECT from INSERT auf dem System i Zwei Operationen werden zu einer neuen Funktion von Jinmei Shen und Karl Hanson INSERT und SELECT waren vor V6R1 in DB2 für i5/os zwei getrennte Operationen. Um eingefügte Spaltenwerte abzufragen, konnte

Mehr

Fakultät IWI DB & IS II - SS PHP Teil 2. Zugriff auf Datenbanken. Objektorientierung in PHP5. Andreas Schmidt PHP - Teil 2 1/24

Fakultät IWI DB & IS II - SS PHP Teil 2. Zugriff auf Datenbanken. Objektorientierung in PHP5. Andreas Schmidt PHP - Teil 2 1/24 PHP Teil 2 Zugriff auf Datenbanken Objektorientierung in PHP5 Andreas Schmidt PHP - Teil 2 1/24 Datenbankzugriff mit PHP verschiedene Varianten native Schnittstelle (mysql_, ora_,...) ODBC Funktionen

Mehr

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion Überblick über Stored Functions Funktionen Eine Funktion ist ein benannter PL/SQL- Block, der einen Wert zurückgibt. Eine Funktion kann in der Datenbank als Objekt zur wiederholbaren Ausführung gespeichert

Mehr

Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn

Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn Grundlagen von Datenbanken SS 2010 Kapitel 8: Datenbank-Einbettung in Programmiersprachen Prof. Dr. Stefan Böttcher Universität Paderborn Grundlagen von Datenbanken - SS 2010 - Prof. Dr. Stefan Böttcher

Mehr

Grundkurs MySQL und PHP

Grundkurs MySQL und PHP Martin Pollakowski Grundkurs MySQL und PHP So entwickeln Sie Datenbanken mit Open Source Software 2., verbesserte und erweiterte Auflage Anwendung und Nutzen von Datenbanken 1 Was ist eine Datenbank? 1

Mehr

Es geht also im die SQL Data Manipulation Language.

Es geht also im die SQL Data Manipulation Language. 1 In diesem Abschnitt wollen wir uns mit den SQL Befehlen beschäftigen, mit denen wir Inhalte in Tabellen ( Zeilen) einfügen nach Tabelleninhalten suchen die Inhalte ändern und ggf. auch löschen können.

Mehr

Dynamische Webseiten mit PHP. Oder: LAMP - The open way

Dynamische Webseiten mit PHP. Oder: LAMP - The open way Dynamische Webseiten mit PHP Oder: LAMP - The open way Verbreitung Neben ASP verbreitetste Web-Scripting-Umgebung LAMP (Linux, Apache, mysql, PHP): freie Alternative zu M$ Überblick Dynamische Webseiten

Mehr

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

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe... php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe...7 3.Zugriff auf mysql Daten...11 Verteilte Systeme: php.sxw Prof.

Mehr

SQL (Structured Query Language) Schemata Datentypen

SQL (Structured Query Language) Schemata Datentypen 2 SQL Sprachelemente Grundlegende Sprachelemente von SQL. 2.1 Übersicht Themen des Kapitels SQL Sprachelemente Themen des Kapitels SQL (Structured Query Language) Schemata Datentypen Im Kapitel SQL Sprachelemente

Mehr

Übersicht der wichtigsten MySQL-Befehle

Übersicht der wichtigsten MySQL-Befehle Übersicht der wichtigsten MySQL-Befehle 1. Arbeiten mit Datenbanken 1.1 Datenbank anlegen Eine Datenbank kann man wie folgt erstellen. CREATE DATABASE db_namen; 1.2 Existierende Datenbanken anzeigen Mit

Mehr

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben.

MySQL-Befehle. In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben. MySQL-Befehle 1. Einleitung In diesem Tutorial möchte ich eine kurze Übersicht der wichtigsten Befehle von MySQL geben. 2. Arbeiten mit Datenbanken 2.1 Datenbank anlegen Eine Datenbank kann man wie folgt

Mehr

Java Database Connectivity-API (JDBC)

Java Database Connectivity-API (JDBC) Java Database Connectivity-API (JDBC) Motivation Design Grundlagen Typen Metadaten Transaktionen Pratikum SWE 2 M. Löberbauer, T. Kotzmann, H. Prähofer 1 Motivation Problem: Zugriff auf ein DBMS ist Herstellerabhängig

Mehr

Die Anweisung create table

Die Anweisung create table SQL-Datendefinition Die Anweisung create table create table basisrelationenname ( spaltenname 1 wertebereich 1 [not null],... spaltenname k wertebereich k [not null]) Wirkung dieses Kommandos ist sowohl

Mehr

Oracle: Abstrakte Datentypen:

Oracle: Abstrakte Datentypen: Oracle: Abstrakte Datentypen: Oracle bietet zwei mögliche Arten um abstrakte Datentypen zu implementieren: Varying Array Nested Table Varying Array (kunde) kdnr kdname gekaufteart 1 Mustermann 1 4 5 8

Mehr

4. Objektrelationales Typsystem Kollektionstypen. Nested Table

4. Objektrelationales Typsystem Kollektionstypen. Nested Table Nested Table Bei einer Nested Table handelt es sich um eine Tabelle als Attributwert. Im Gegensatz zu Varray gibt es keine Beschränkung bei der Größe. Definition erfolgt auf einem Basistyp, als Basistypen

Mehr

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II SS Transaktionen & ACID. Dr. Christian Senger Transaktionen & ACID 1

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II SS Transaktionen & ACID. Dr. Christian Senger Transaktionen & ACID 1 Transaktionen & ACID Dr. Christian Senger Transaktionen & ACID 1 PC Architekturen Kein Mehrbenuzterbetrieb Recovery? Benutzerabbrüche? PC Lokale Datenbank PC PC PC PC PC PC-System DBMS PC PC PC PC Internet

Mehr

Java Database Connectivity-API (JDBC)

Java Database Connectivity-API (JDBC) Java Database Connectivity-API (JDBC) Motivation Design Grundlagen Typen Metadaten Transaktionen Pratikum SWE 2 M. Löberbauer, T. Kotzmann, H. Prähofer 1 Motivation Problem: Zugriff auf ein DBMS ist herstellerabhängig

Mehr

Abbildung 6-8: Abfolge beim doppelten Abschicken von Formularen

Abbildung 6-8: Abfolge beim doppelten Abschicken von Formularen HACK #55 Hack Doppeltes Abschicken von Formularen verhindern Durch die Verwendung einer Transaktionstabelle in Ihrer Datenbank können Sie das klassische Problem der doppelt abgeschickten Formulare verhindern.

Mehr

Internet Praktikum im Grunstudium Formularwerte und Datenbanken Speichern, Lesen und Aufbereiten. Dr. Guido Rößling Dipl.-Ing.

Internet Praktikum im Grunstudium Formularwerte und Datenbanken Speichern, Lesen und Aufbereiten. Dr. Guido Rößling Dipl.-Ing. Internet Praktikum im Grunstudium Formularwerte und Datenbanken Speichern, Lesen und Aufbereiten Dr. Guido Rößling Dipl.-Ing. Andreas Hartl Aktueller Zustand Sie sollten schon in der Lage sein Formulare

Mehr

Praktische SQL-Befehle

Praktische SQL-Befehle Praktische SQL-Befehle Datenbanksysteme I WiSe 2018/2019 Todor Ivanov DB1 WS2018 1 Praktische SQL-Befehle Nested Selects Inserts Updates Views Triggers Constraints Functions Voraussetzung: Laptop + MySQL/

Mehr

PHP und Datenbanken. Verbindung zum Datenbankserver

PHP und Datenbanken. Verbindung zum Datenbankserver PHP und Datenbanken Verbindung zum Datenbankserver Um PHP mit einer MySQL-Datenbank zu verbinden, braucht man zuerst eine Verbindung zum Datenbankserver. Diese Verbindung ist Vorraussetzung, um eine bestimmte

Mehr

Kontrollstrukturen MySQL Funktionen. MySQL 4, 5. Kapitel 20a: PHP Teil 2. Marcel Noe

Kontrollstrukturen MySQL Funktionen. MySQL 4, 5. Kapitel 20a: PHP Teil 2. Marcel Noe MySQL 4, 5 Kapitel 20a: PHP Teil 2 Gliederung 1 2 Gliederung 1 2 Die ermöglicht ein Bedingtes Ausführen von Code-Abschnitten. Nur wenn die Bedingung erfüllt ist wird der Block hinter if ausgeführt. Ist

Mehr

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3

Arrays. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 3. 1 Modulübersicht 3 Programmieren mit Java Modul 3 Arrays Theorieteil Inhaltsverzeichnis 1 Modulübersicht 3 2 Eindimensionale Arrays 3 2.1 Arrays deklarieren.............................. 3 2.2 Arrays erzeugen................................

Mehr

PHP MySQL - myphpadmin Formulardaten in eine Datenbank speichern

PHP MySQL - myphpadmin Formulardaten in eine Datenbank speichern PHP MySQL - myphpadmin Formulardaten in eine Datenbank speichern Datenbanken werden durch ein spezielles Programm verwaltet, einen sogenannten Datenbankserver, in unserem Fall den MySQL-Datenbankserver.

Mehr

CADSTAR MRP-Link. MRP-Link ist erstellt von:

CADSTAR MRP-Link. MRP-Link ist erstellt von: CADSTAR MRP-Link MRP-Link ist erstellt von: CSK CAD Systeme Kluwetasch Zip: 2161 Town: Altenholz Street: Struckbrook 9 Tel: +9-31-32917-0 Fax: +9-31-32917-26 Web: http://www.cskl.de E-Mail: Kluwetasch@cskl.de

Mehr

Web-basierte Anwendungssysteme PHP Teil 3

Web-basierte Anwendungssysteme PHP Teil 3 Web-basierte Anwendungssysteme PHP Teil 3 Prof. Dr. Armin Lehmann (lehmann@e-technik.org) Fachbereich 2 Informatik und Ingenieurwissenschaften Wissen durch Praxis stärkt Seite 1 Prof. Dr. Armin Lehmann

Mehr

Übungen. DI (FH) Levent Öztürk

Übungen. DI (FH) Levent Öztürk Übungen DI (FH) Levent Öztürk Übersicht Entwicklungsumgebung PHPMYADMIN Datenbank anlegen User anlegen Tabellen Anlegen Datenbankzugriffe über PHP 01.04.2014 DI (FH) Levent Öztürk 2 Entwicklungsumgebung

Mehr

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; phpmyadmin SQL Dump version 3.2.4 http://www.phpmyadmin.net Host: localhost Erstellungszeit: 13. April 2011 um 18:44 Server Version: 5.1.41 PHP-Version: 5.3.1 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101

Mehr

Java Application 1 Java Application 2. JDBC DriverManager. JDBC-ODBC Br idge. ODBC Driver Manager. Dr iver C. Dr iver D.

Java Application 1 Java Application 2. JDBC DriverManager. JDBC-ODBC Br idge. ODBC Driver Manager. Dr iver C. Dr iver D. 1 Copyright 1996-1997 by Axel T. Schreiner. All Rights Reserved. 7 Datenbankzugriff Prinzip Dieser Abschnitt beschäftigt sich mit dem Paket java.sql, das eine SQL-Schnittstelle für Java verkapselt. Java-Programme

Mehr

Multimedia im Netz Wintersemester 2013/14. Übung 03 (Nebenfach)

Multimedia im Netz Wintersemester 2013/14. Übung 03 (Nebenfach) Multimedia im Netz Wintersemester 2013/14 Übung 03 (Nebenfach) Ludwig-Maximilians-Universität München Multimedia im Netz WS 2013/14 - Übung 3-1 Datenbanken und SQL Mit Hilfe von Datenbanken kann man Daten

Mehr

Datenschutz: Zugriffsrechte in SQL

Datenschutz: Zugriffsrechte in SQL 12. Datenschutz: Zugriffsrechte in SQL 12-1 12. Datenschutz: Zugriffsrechte in SQL 12-2 Inhalt Datenschutz: Zugriffsrechte in SQL 1. Anforderungen, Allgemeines 2. Die SQL-Befehle GRANT und REVOKE 3. Sichten

Mehr

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER INHALTSVERZEICHNIS 1. Datenbanken 2. SQL 1.1 Sinn und Zweck 1.2 Definition 1.3 Modelle 1.4 Relationales Datenbankmodell 2.1 Definition 2.2 Befehle 3.

Mehr

C++ Anwendungskurs Tag 4: Datenbanken Daniela Horn Institut für Neuroinformatik Real-time Computer Vision

C++ Anwendungskurs Tag 4: Datenbanken Daniela Horn Institut für Neuroinformatik Real-time Computer Vision C++ Anwendungskurs Tag 4: Datenbanken Daniela Horn Institut für Neuroinformatik Real-time Computer Vision 15. März 2018 C++ Anwendungskurs 15. März 2018 Daniela Horn 1 Übersicht 1 Motivation 2 Relationale

Mehr

Oracle Datenbankprogrammierung mit PL/SQL Grundlagen

Oracle Datenbankprogrammierung mit PL/SQL Grundlagen Oracle Datenbankprogrammierung mit PL/SQL Grundlagen Seminarunterlage Version: 12.05 Version 12.05 vom 29. Januar 2015 Dieses Dokument wird durch die veröffentlicht.. Alle Rechte vorbehalten. Alle Produkt-

Mehr

ids-system GmbH Tipp #3 Leer-Strings in SQL oder die Frage nach CHAR oder VARCHAR

ids-system GmbH Tipp #3 Leer-Strings in SQL oder die Frage nach CHAR oder VARCHAR ids-system GmbH Tipp #3 Leer-Strings in SQL oder die Frage Zusammenfassung Dieses Dokument beschreibt die Unterschiede zwischen CHAR und VARCHAR Datentyp sowie die Behandlung im SQL Michael Tiefenbacher

Mehr

MySql und PHP. Apache2: Konfigurieren für php4. ...\apache2\conf\httpd.conf aufrufen. Folgende Zeilen einfügen:

MySql und PHP. Apache2: Konfigurieren für php4. ...\apache2\conf\httpd.conf aufrufen. Folgende Zeilen einfügen: MySql und PHP Apache2: Konfigurieren für php4...\apache2\conf\httpd.conf aufrufen Folgende Zeilen einfügen: LoadModule php4_module "c:/php/php4apache2.dll" AddType application/x-httpd-php.php Wichtig!!

Mehr

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3 Programmieren mit Java Modul 5 Objekte Theorieteil Inhaltsverzeichnis 1 Modulübersicht 3 2 Klassen und Objekte 3 2.1 Klassen.................................... 4 2.2 Objektvariablen und Methoden.......................

Mehr

12. Datenschutz: Zugriffsrechte in SQL Datenschutz: Zugriffsrechte in SQL

12. Datenschutz: Zugriffsrechte in SQL Datenschutz: Zugriffsrechte in SQL 12. Datenschutz: Zugriffsrechte in SQL 12-1 Datenschutz: Zugriffsrechte in SQL 12. Datenschutz: Zugriffsrechte in SQL 12-2 Inhalt 1. Anforderungen, Allgemeines 2. Die SQL-Befehle GRANT und REVOKE 3. Sichten

Mehr

Datenbanken SQL JDBC. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 21

Datenbanken SQL JDBC. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 21 Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester 2010 1 / 21 Datenbanken SQL JDBC 2 / 21 Relationale Datenbanken Ein Datenbanksystem ist ein System zur Speicherung von (großen) Datenmengen:

Mehr

Datenbanken für Online Untersuchungen

Datenbanken für Online Untersuchungen Datenbanken für Online Untersuchungen Im vorliegenden Text wird die Verwendung einer MySQL Datenbank für Online Untersuchungen beschrieben. Es wird davon ausgegangen, dass die Untersuchung aus mehreren

Mehr

Isolationsstufen für Transaktionen. Dr. Karsten Tolle

Isolationsstufen für Transaktionen. Dr. Karsten Tolle Isolationsstufen für Transaktionen Dr. Karsten Tolle Probleme bei Transaktionen Gewährleistung der Isolation Sperren kein Lost Update Read 1 (Accounts[13]) Read 2 (Accounts[13]) Write 2 (Accounts[13],101.000)

Mehr

MySQL, Java und einiges mehr

MySQL, Java und einiges mehr MySQL, Java und einiges mehr Client Der Browser Firefox Chrome Safari Internet Explorer URL http://localhost:8080/html/index.html Internet Die darzustellende Webseite HTML Server Apache Tomcat Jetty

Mehr

3. Stud.IP-Entwickler-Workshop 2. Juni 2006 Workshop 1a: Gib mir 5: Lohnt sich der Umstieg auf PHP5 und MySQL5? André Noack

3. Stud.IP-Entwickler-Workshop 2. Juni 2006 Workshop 1a: Gib mir 5: Lohnt sich der Umstieg auf PHP5 und MySQL5? André Noack 3. Stud.IP-Entwickler-Workshop 2. Juni 2006 Workshop 1a: Gib mir 5: Lohnt sich der Umstieg auf PHP5 und MySQL5? André Noack Gliederung (nicht mehr so) Neues in PHP 5 Neues in MySQL 4.1 / 5 Probleme mit

Mehr

Folien php/mysql Kurs der Informatikdienste

Folien php/mysql Kurs der Informatikdienste Folien php/mysql Kurs der Informatikdienste 1. Einführung in die Datenbank MySQL Kursbeispiel und Kursziele 1.1 Das Kursbeispiel: eine kleine Personalverwaltung 1.2 Was brauchen wir? 1.3 Ziele Kurs AEMS1,

Mehr

Erstellen und Verwalten von Tabellen

Erstellen und Verwalten von Tabellen Erstellen und Verwalten von Tabellen Als nächstes müssen die Tabellen der Datenbank Personalwesen erzeugt werden. Die Syntax dazu lautet: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(TABELLENDEFINITION,

Mehr

SQL,Teil 1: CREATE, INSERT, UPDATE, DELETE, DROP

SQL,Teil 1: CREATE, INSERT, UPDATE, DELETE, DROP SQL,Teil 1: CREATE, INSERT, UPDATE, DELETE, DROP W. Spiegel Übersicht DDL & DML Relationen definieren: CREATE Primärschlüssel setzen mit primary key Tabellen löschen: DROP Daten speichern: INSERT Daten

Mehr

Datenbanken SQL. Insert, Update, Delete, Drop. Krebs

Datenbanken SQL. Insert, Update, Delete, Drop. Krebs Datenbanken SQL Insert, Update, Delete, Drop Krebs Inhalt 1. Datensätze einfügen: INSERT 2. Datensätze verändern: UPDATE 3. Datensätze löschen: DROP vs. DELETE Beispiel Datenbank Schule Klasse P_Klasse

Mehr

Implementieren von Klassen

Implementieren von Klassen Implementieren von Klassen Felder, Methoden, Konstanten Dr. Beatrice Amrhein Überblick Felder/Mitglieder (Field, Member, Member-Variable) o Modifizierer Konstanten Methoden o Modifizierer 2 Felder und

Mehr

Korrekturen und Ergänzungen zur ABAP-Referenz

Korrekturen und Ergänzungen zur ABAP-Referenz Korrekturen und Ergänzungen zur ABAP-Referenz S. 41, zweiter Absatz In den Kapiteln 9 bis 41 beschreiben wir die... S. 147, 6.3.3.1 Neue Überschrift: Typen für Datenreferenzvariablen S. 148, 6.3.3.2 Neue

Mehr

PostgreSQL auf Debian System

PostgreSQL auf Debian System PostgreSQL auf Debian System Inhaltsverzeichnis 1. Installation 1.1 Installation 1.2 Mit postgres anmelden 2. Benutzer anlegen 3. Datenbank anlegen 3.1 Optionen 3.2 Datenbank mydatabase anlegen 4. Datenbank

Mehr

Im Folgenden möchten wir Ihnen einige Beispiele aufzeigen, wie ALTER TABLE gemäß SQL92 verwendet wird:

Im Folgenden möchten wir Ihnen einige Beispiele aufzeigen, wie ALTER TABLE gemäß SQL92 verwendet wird: ALTER TABLE BEFEHLE Im Folgenden möchten wir Ihnen einige Beispiele aufzeigen, wie ALTER TABLE gemäß SQL92 verwendet wird: Fügt die Spalte Adresse zur Tabelle Kunden hinzu: ALTER TABLE Kunden ADD COLUMN

Mehr

PHP Programmierung. Seminarunterlage. Version 1.07 vom

PHP Programmierung. Seminarunterlage. Version 1.07 vom Seminarunterlage Version: 1.07 Version 1.07 vom 19. Dezember 2018 Dieses Dokument wird durch die veröffentlicht.. Alle Rechte vorbehalten. Alle Produkt- und Dienstleistungs-Bezeichnungen sind Warenzeichen

Mehr

Transaktionen in Praxis. Dr. Karsten Tolle Vorl

Transaktionen in Praxis. Dr. Karsten Tolle Vorl Transaktionen in Praxis Dr. Karsten Tolle Vorl. 13.06.2017 Probleme bei Transaktionen Lost Update und Inconsistent Retrieval Sichtweise vom Benutzer Auszug aus SQL 92 1) P1 ("Dirty read"): SQL-transaction

Mehr

Tag 2 Inhaltsverzeichnis

Tag 2 Inhaltsverzeichnis Tag 2 Inhaltsverzeichnis Relationales Modell Relation und Schema Umsetzung ER-Modell --> relationales Schema DB Schema: Empfehlungen Typen von Abfragesprachen SQL Teil 1 Ziel und Geschichte Daten- und

Mehr

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML. JavaScript JavaScript wird direkt in HTML-Dokumente eingebunden. Gib folgende Zeilen mit einem Texteditor (Notepad) ein: (Falls der Editor nicht gefunden wird, öffne im Browser eine Datei mit der Endung

Mehr

Datenbank - Teil 3. Ziele dieser Übung: Eine Datenbank anlegen mit SQL. Daten eingeben mit SQL. Abfragen stellen mit SQL und PHP

Datenbank - Teil 3. Ziele dieser Übung: Eine Datenbank anlegen mit SQL. Daten eingeben mit SQL. Abfragen stellen mit SQL und PHP Datenbank - Teil 3 Ziele dieser Übung: Eine Datenbank anlegen mit SQL Daten eingeben mit SQL Abfragen stellen mit SQL und PHP 1 Datenbank - Teil 3 Datenbankserver Entwickelt von der schwedischen Aktiengesellschaft

Mehr

Interaktive Webseiten mit PHP und MySQL

Interaktive Webseiten mit PHP und MySQL Interaktive Webseiten mit PHP und Vorlesung 4: PHP & Sommersemester 2003 Martin Ellermann Heiko Holtkamp Sommersemester 2001 Hier noch ein wenig zu (My)SQL: SHOW INSERT SELECT ORDER BY GROUP BY LIKE /

Mehr

Tutorium zum Aufbau einer objektrelationalen Abbildungsschicht in PHP (Version 2.8 vom )

Tutorium zum Aufbau einer objektrelationalen Abbildungsschicht in PHP (Version 2.8 vom ) Tutorium zum Aufbau einer objektrelationalen Abbildungsschicht in PHP (Version 2.8 vom 18.11.2016) Einleitung Im folgenden wird die Erstellung einer Klasse zur Realisierung einer OR-Schicht erläutert.

Mehr

MySQL: Einfache Subqueries.

MySQL: Einfache Subqueries. MySQL: Einfache Subqueries datenbank "Kunden" kunden (kunde_id, name, ñort_postleitzahl, kontostand_giro, kredit) orte (postleitzahl, name, einwohnerzahl, anzahl_telefonleitungen) datenbank "Kunden" kunden

Mehr

PHP Schulung Beginner. Newthinking Store GmbH Manuel Blechschmidt

PHP Schulung Beginner. Newthinking Store GmbH Manuel Blechschmidt PHP Schulung Beginner Newthinking Store GmbH Manuel Blechschmidt Begrüßung Es gibt keine dummen Fragen nur dumme Antworten. Übersicht Sprung ins Kalte Wasser 'Hallo Welt' Theorie Requests Grundlagen Kommentare

Mehr

SQL. SQL: Structured Query Language. Früherer Name: SEQUEL. Standardisierte Anfragesprache für relationale DBMS: SQL-89, SQL-92, SQL-99

SQL. SQL: Structured Query Language. Früherer Name: SEQUEL. Standardisierte Anfragesprache für relationale DBMS: SQL-89, SQL-92, SQL-99 SQL Früherer Name: SEQUEL SQL: Structured Query Language Standardisierte Anfragesprache für relationale DBMS: SQL-89, SQL-92, SQL-99 SQL ist eine deklarative Anfragesprache Teile von SQL Vier große Teile:

Mehr

Erste Java-Programme (Arrays und Schleifen)

Erste Java-Programme (Arrays und Schleifen) Lehrstuhl Bioinformatik Konstantin Pelz Erste Java-Programme (Arrays und Schleifen) Tutorium Bioinformatik (WS 18/19) Konstantin: Konstantin.pelz@campus.lmu.de Homepage: https://bioinformatik-muenchen.com/studium/propaedeutikumprogrammierung-in-der-bioinformatik/

Mehr

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar Qt-Seminar Dienstag, 10.2.2009 SQL ist......die Abkürzung für Structured Query Language (früher sequel für Structured English Query Language )...ein ISO und ANSI Standard (aktuell SQL:2008)...eine Befehls-

Mehr

3.3. Implementierung in SQL DDL-Grundlagen Constraint-Verzögerung Implementierungs-Strategien

3.3. Implementierung in SQL DDL-Grundlagen Constraint-Verzögerung Implementierungs-Strategien CREATE TABLE SPEND_STAT ( S_STATUS VARCHAR2(1), STAT_TXT VARCHAR2(15), PRIMARY KEY (S_STATUS) ENABLE ) ; 3.3. Implementierung in SQL DDL-Grundlagen Constraint-Verzögerung Implementierungs-Strategien DDL:

Mehr

PHP + MySQL. Die MySQL-Datenbank. Hochschule Karlsruhe Technik & Wirtschaft Internet-Technologien T3B250 SS2014 Prof. Dipl.-Ing.

PHP + MySQL. Die MySQL-Datenbank. Hochschule Karlsruhe Technik & Wirtschaft Internet-Technologien T3B250 SS2014 Prof. Dipl.-Ing. PHP + MySQL Die MySQL-Datenbank Zusammenspiel Apache, PHP, PHPMyAdmin und MySQL PHPMyAdmin Verwaltungstool Nutzer Datei.php oder Datei.pl Apache HTTP-Server PHP Scriptsprache Perl Scriptsprache MySQL Datenbank

Mehr

Bibliografische Informationen digitalisiert durch http://d-nb.info/995021198

Bibliografische Informationen digitalisiert durch http://d-nb.info/995021198 Auf einen Blick 1 Einleitung 15 2 Datenbankentwurf 23 3 Datenbankdefinition 43 4 Datensätze einfügen (INSERT INTO) 95 5 Daten abfragen (SELECT) 99 6 Daten aus mehreren Tabellen abfragen (JOIN) 143 7 Unterabfragen

Mehr

Datenbanksysteme I. Aufgabe 1: Erstellen einer Multimedia-Datenbank. Grundlage sind wiederum bereits implementierte Methoden aus Übungsblatt 6:

Datenbanksysteme I. Aufgabe 1: Erstellen einer Multimedia-Datenbank. Grundlage sind wiederum bereits implementierte Methoden aus Übungsblatt 6: Universität Augsburg, Institut für Informatik Wintersemester 2010/2011 Prof. Dr. W. Kießling 17. Dez. 2010 Dr. A. Huhn, F. Wenzel, M. Endres Lösungsblatt 7 Aufgabe 1: Erstellen einer Multimedia-Datenbank

Mehr

Einführung in die Programmierung I. 2.4 Felder. Thomas R. Gross. Department Informatik ETH Zürich

Einführung in die Programmierung I. 2.4 Felder. Thomas R. Gross. Department Informatik ETH Zürich 252-0027 Einführung in die Programmierung I 2.4 Felder Thomas R. Gross Department Informatik ETH Zürich Uebersicht 2.4 Felder (Vektoren, "array"s) 2.5 Verschachtelte Schleifen 2.6 "if" Anweisungen 2.7

Mehr

In diesem Abschnitt wollen wir uns mit der Architektur von Datenbank Managements Systemen beschäftigen.

In diesem Abschnitt wollen wir uns mit der Architektur von Datenbank Managements Systemen beschäftigen. 1 In diesem Abschnitt wollen wir uns mit der Architektur von Datenbank Managements Systemen beschäftigen. Zunächst stellt sich die Frage: Warum soll ich mich mit der Architektur eines DBMS beschäftigen?

Mehr

Universität Augsburg, Institut für Informatik WS 2009/2010 Prof. Dr. W. Kießling 18. Dez Dr. A. Huhn, F. Wenzel, M. Endres Lösungsblatt 8

Universität Augsburg, Institut für Informatik WS 2009/2010 Prof. Dr. W. Kießling 18. Dez Dr. A. Huhn, F. Wenzel, M. Endres Lösungsblatt 8 Universität Augsburg, Institut für Informatik WS 2009/2010 Prof. Dr. W. Kießling 18. Dez. 2009 Dr. A. Huhn, F. Wenzel, M. Endres Lösungsblatt 8 Aufgabe 1: JDBC 2.0 und Scrollable Result Sets Datenbanksysteme

Mehr

Datenbanken im WI-Unterricht mit

Datenbanken im WI-Unterricht mit Datenbanken im WI-Unterricht mit Inhaltsverzeichnis 1 ER-Modell - Entity Relationship Modell 1 1.1 Entitäten................................................. 2 1.2 Relationen................................................

Mehr