• Keine Ergebnisse gefunden

Datenbankprogrammierung mit MariaDB/MySQL und PHP

N/A
N/A
Protected

Academic year: 2022

Aktie "Datenbankprogrammierung mit MariaDB/MySQL und PHP"

Copied!
98
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Seite 1 von 98

Datenbankprogrammierung mit MariaDB/MySQL und PHP

1 Voraussetzungen ... 6

2 Einführung in PHP ... 8

2.1 Syntax ... 9

2.2 Hochkommas und andere Sonderzeichen... 9

2.3 Kommentare ... 10

2.4 Konstanten ... 10

2.5 Variablen ... 10

2.5.1 Variablen werden in der Laufzeitumgebung des PHP-Skriptes angelegt ... 10

2.5.2 Der Typ einer Variablen wird erst zur Laufzeit festgelegt ... 11

2.5.3 Beispiele für das Anlegen von Variablen ... 11

2.5.4 Felder ... 11

2.6 Vergleichsoperatoren ... 14

2.7 Kontrollstrukturen. ... 16

2.8 Funktionen in PHP ... 17

2.9 Gültigkeit von Variablen ... 18

2.10 Sessions ... 19

3 Kurzbeschreibung von HTML-Anweisungen, die in diesem Kurs verwendet werden ... 20

3.1 Tabellen in HTML. ... 20

3.1.1 Übung ... 21

3.2 Formulare in HTML ... 22

3.2.1 Unterstützung von Formularen durch PHP ... 24

3.2.2 Übungen zu Formularen in HTML ... 26

4 Einführung in SQL für MySQL/MariaDB... 27

4.1 Gruppen von SQL-Befehlen ... 27

Kommentare in MySQL ... 28

4.2 Arbeiten mit phpMyAdmin ... 28

4.3 Eigenschaften von relationalen Tabellen ... 29

4.4 Datentypen ... 29

4.4.1 NULL-Werte ... 30

4.4.2 DEFAULT ... 30

4.4.3 AUTO_INCREMENT ... 30

(2)

Seite 2 von 98

4.4.4 PRIMARY KEY ... 31

4.4.5 FORGEIN KEYS ... 31

4.4.6 UNIQUE ... 31

4.4.7 CONTRAINTS ... 31

4.4.8 INDEX ... 31

4.5 DDL-Befehle (Data Definition Language) ... 32

4.5.1 CREATE TABLE ... 32

4.5.1.1 Übung: Mittels phpMyAdmin soll folgende Tabellen erzeugt werden ... 33

4.5.1.2 Temporäre Tabellen erzeugen ... 33

4.5.2 CREATE VIEW ... 34

4.5.3 ALTER TABLE ... 34

4.5.4 DROP TABLE ... 35

4.6 DML-Befehle (Data Manipulation Language) ... 36

4.6.1 INSERT ... 36

4.6.1.1 Übung: Mittels phpMyAdmin soll die vorher erzeugte Tabelle Mitarbeiter und später abteilung gefüllt werden ... 36

4.6.2 UPDATE ... 37

4.6.3 DELETE ... 38

4.6.4 SELECT ... 38

4.6.4.1 Konstanten und Funktionen in der Feldliste ... 39

4.6.4.2 Vom Benutzer definierte Variablen ... 39

4.6.4.3 Mehrere Tabellen und Aliase ... 39

4.6.4.4 Erweiterung von SELECT durch WHERE ... 40

4.6.4.4.1 Vergleichsoperatoren ... 40

4.6.4.4.2 Logische Operatoren ... 40

4.6.4.4.3 Der Operator LIKE ... 40

4.6.4.4.4 Der Operator REGEXP ... 41

4.6.4.4.5 Der NULL-Operator ... 42

4.6.4.5 Die GROUP BY-Klausel ... 42

4.6.4.6 Doppelte Einträge verhindern ... 42

4.6.4.7 Aggregatfunktionen ... 42

4.6.4.7.1 Die Funktionen MIN und MAX ... 43

4.6.4.7.2 Die Funktion SUM ... 43

4.6.4.7.3 Die Funktion COUNT ... 43

(3)

Seite 3 von 98

4.6.4.8 Die ORDER BY-Klausel ... 44

4.6.4.9 Die HAVING-Klausel ... 44

4.6.4.10 UNION ... 44

4.6.4.11 SELECTs mit mehreren Tabellen ... 45

4.6.4.11.1 Eine Tabelle mit sich selber verknüpfen ... 45

4.6.4.11.2 Das kartesische Produkt ... 45

4.6.4.11.3 Mittels WHERE (EQUI-JOIN) verknüpfen ... 45

4.6.4.11.4 INNER JOIN ... 46

4.6.4.11.5 LEFT JOIN (RIGHT JOIN) ... 47

4.6.4.11.6 EXISTS: Alternative zum LEFT JOIN ... 48

4.6.4.11.7 Unterabfragen ... 49

4.6.5 Funktionen ... 51

4.6.5.1 Numerische Funktionen ... 52

4.6.5.2 String Funktionen ... 52

4.6.5.3 Datum- und Zeit-Funktionen ... 54

4.6.5.4 Informations-Funktionen ... 54

4.6.6 Transaktionen ... 55

5 Aufruf von SQL-Statements in PHP ... 57

5.1 Einrichten von Benutzern in MySQL/MariaDB ... 57

5.2 Anlegen einer Datenbank ... 57

5.2.1 Zeichensatz ... 57

5.2.2 Kollation ... 58

5.3 SQL-Statements in PHP ausführen ... 58

5.3.1 Verbindung zur Datenbank herstellen ... 58

5.3.2 Eine Query ausführen und Ergebnisse abrufen ... 59

5.3.3 Anzahl der gefundenen Datensätze ausgeben ... 60

5.3.4 Den Lesezeiger positionieren. ... 60

5.3.5 Verbindung zur Datenbank beenden ... 60

5.3.6 Speicherzuweisung und Speicherverbrauch in PHP ... 60

5.3.7 Fehlerbehandlung... 61

5.3.7.1 Im Fehlerfall Skript beenden ... 61

5.3.7.2 Fehler behandeln ... 62

6 Beispiele und Übungen mit SQL und PHP ... 63

6.1 Erstellen einer Datenbank ... 63

(4)

Seite 4 von 98

6.2 Einfacher (Einzelhandels) Laden ... 63

6.2.1 Tabelle erzeugen und füllen ... 63

6.2.2 Ausgeben aller Werte ... 64

6.3 Template für weitere Tests erzeugen ... 66

6.3.1 Höchsten Preis für jeden Artikel finden ... 67

6.3.2 Niedrigsten Preis mit zugehörigem Händler ausgeben ... 67

6.3.3 Billigsten Artikel mit Subquery 1 finden ... 67

6.3.4 Billigsten Artikel mit Subquery 2 finden ... 68

6.3.5 Billigsten Artikel mit LEFT JOIN finden ... 68

6.3.6 Billigsten Artikel mit NOT EXIST finden ... 68

6.4 Übungen mit einer Tabelle der europäischen Länder ... 69

6.4.1 Alle Reihen der Tabelle ausgeben ... 69

6.4.2 Nur die Länder mit den Anfangsbuchstaben ‚A‘ bis ‚K‘ ausgeben... 69

6.4.3 Erstellen einer Query, die die Anzahl aller Reihen (Länder) ausgibt ... 69

6.4.4 Für jedes Land die BIP pro Kopf errechnen ... 69

6.4.5 Für jedes Land die Fläche mit Deutschland vergleichen ... 69

6.4.6 Für jedes Land die Fläche mit Deutschland vergleichen – und mehrfaches Aufrufen der Subquery durch Verwendung eines SQL-Parameters vermeiden ... 70

6.4.7 Erstellen einer Liste, in der nur die Länder enthalten sind, deren BIP pro Kopf größer oder gleich wie der von Deutschland ist ... 70

6.4.8 Erstellen einer Liste, in der nur die Länder enthalten sind, deren BIP pro Kopf über dem Durchschnitt der BIP pro Kopf aller EU-Länder liegt ... 70

6.5 Übungen mit einer Tabelle für die längsten Flüsse der Erde ... 71

6.5.1 Importieren einer Excel-Datei in MySQL ... 71

6.5.1.1 Verbindung mittels ODBC ... 71

6.5.1.2 Import mittels OpenDocument ... 73

6.5.2 Ausgeben der Liste geordnet nach Flusslänge ... 74

6.5.3 Ausgabe der Flussliste in der Reihenfolge der Ablussmenge ... 74

6.5.4 Ordnen nach Kontinent und Abflussmenge ... 74

6.5.5 Welcher Kontinent hat welche Abflussmenge ... 75

6.5.5.1 Welcher Fluss eines jeden Kontinents hat die größte Abflussmenge ... 75

6.5.5.2 Vergleich Wassermenge des Amazonas mit anderen Kontinenten ... 75

6.5.5.3 Welche 5 Flüsse eines jeden Kontinents haben die größte Abflussmenge ... 75

6.5.5.4 Welchen 5 Flüsse eines jeden Kontinents haben die größte Abflussmenge – und Zusammenfassung in einer Zeile einer Tabelle ... 75

(5)

Seite 5 von 98

6.5.6 Übungen mit den Tabelle Person, Shirt und später Wardrope ... 79

6.5.6.1 Übungen zur Erzeugung eines Foreign-Keys in phpMyAdmin ... 80

6.5.6.2 Anzeigen aller Tabellen-Attribute ... 80

6.5.7 Erzeugung einer Kreuztabelle, wie aus MS-Access bekannt ... 83

6.6 Erzeugen eines PHP-Scripts zur Auflistung von Tabellen ... 84

6.7 Komplette einfache Anwendung mit einer n:m-Beziehung ... 84

6.7.1 Übersicht über den Ablauf im Skript ... 84

7 Performance ... 88

8 Sicherheit ... 90

8.1 SQL-Injektion ... 90

8.1.1 Übung zu SQL-Injektion ... 91

8.1.2 Keinen User root verwenden ... 91

8.1.3 Übung zu SQL-Injektion und Verwendung eines non-root-Users ... 92

8.1.4 Keine zu einfachen Konstruktionen verwenden ... 92

8.2 Prepared Statements ... 92

8.2.1 Übung zu Prepared Statements ... 95

9 Begriffe, auf die in diesem Kurs nicht tiefer eingegangen werden ... 96

9.1 Stored Procedures ... 96

9.2 Storage Engines ... 96

9.3 Partitionierung... 96

9.4 Trigger... 96

9.5 Große Datenbanken ... 97

10 Anhang... 98

10.1 Sicherheitsaspekte ... 98

10.2 Geschichte von HTML ... 98

10.3 Die Geschichte von PHP ... 98

10.4 Die Geschichte von MySQL ... 98

10.5 MariaDB ... 98

10.6 MariaDB vs. MySQL ... 98

10.7 Vergleich mehrerer DBMS-Systeme ... 98

(6)

Seite 6 von 98

1 Voraussetzungen

In diesem Skript werden Zugriffe auf eine MySQL-Datenbank (MariaDB) unter Verwendung der Programmiersprache PHP gezeigt und durch Übungsaufgaben gefestigt.

Es sind dazu folgende Kenntnisse notwendig: PHP (Version 5.6 oder höher), Grundkenntnisse von HTML. In PHP wird soweit eingeführt, dass die hier verwendeten Sprachkonstrukte und Prozeduren verstanden werden können.

Außerdem ist die Installation von XAMPP Voraussetzung (XAMPP: X-verschiedene Betriebssysteme, Apache, MariaDB/MySQL, Pearl, PHP).

Es wird in dieser Vorlesung zuerst auf PHP und auf Tabellen und Formulare in HTML eingegangen, weil diese in den Übungen verwendet werden.

Danach wird SQL für MySQL/MariaDB dargestellt. Schließlich wird die Datenbank- Programmierung durch SQL-Statements unter PHP erklärt und an Beispielen verschiedener Komplexitätsgrade gezeigt.

Alle Beispiele sind alle mittels des Editors notepad++ erstellt. Dieser, oder ein vergleichbarer Editor sollte ebenfalls zur Verfügung stehen.

Im Kurs wird werden MYSQLi Prozeduren (i steht für improved) in der objektorientierten Notation verwendet. Allerdings wird hier nicht auf die

Objektorientierung eingegangen, sondern es wird PHP nur als das Vehikel benutzt, mittels dem HTML-Anweisungen auf dem Client ausgegeben werden, ein Handling der Formulare ermöglicht wird und vor allem MySQL-Aufrufe durchgeführt werden können. Die Methoden und Prozeduren, die dabei verwendet werden, werden erklärt.

In dieser Beschreibung wird der Ausdruck  verwendet um die Ausgabe eines zuvor beschriebenen PHP-Skriptes zu kennzeichnen.

Installation von xampp: https://www.apachefriends.org/de/index.html

Nach der Installation von XAMPP wird das Control- Panel mittels

C:\xampp\xampp-

control.exe gestartet. Von dort kann dann wiederum Apache (Webserver) und MySQL/MariaDB gestartet werden.

(7)

Seite 7 von 98 Die Installation ist unter Windows und MAC X möglich. Es gibt auch eine portable Version.

Das Datenbankverwaltungsprogramm phpMyAdmin wird im Browser mittels localhost/phpmyadmin/

aufgerufen.

Hinweis: beim MAC müssen in Safari die beiden Ports 8080 und 8434 geöffnet, (enabelt) werden.

Eine umfangreiche Installationsanleitung – für Windows und Mac findet sich unter https://www.schreiners-buero.de/docs/sb-installation.pdf

Neuerdings wird durch das XAMPP-Paket keine MySQL-Datenbank mehr installiert, sondern eine MariaDB-Datenbank; trotzdem wird hier meistens weiter der Name MySQL verwendet. Siehe dazu https://de.wikipedia.org/wiki/MariaDB.

Die im Script verwendeten Funktionen werden im Skript auch kurz beschrieben.

Trotzdem kann es ratsam sein direkt in der zugehörigen Dokumentation nachzuschauen.

https://mariadb.com/kb/en/library/documentation/

Beispiele, die hier im Script angeführt sind, können unter http://www.breithaupt-s.de/DB-Programmierung/Beispiele/

gefunden werden.

PHP-Scripts, die in der Vorlesung verwendet werden, können unter http://www.breithaupt-s.de/DB-Programmierung/Uebungen/PHP oder

http://www.breithaupt-s.de/DB-Programmierung/Uebungen/SQL gefunden werden.

Dieses Skript ist unter Moodle zu finden: Breithaupt_DB-Programmierung.

(8)

Seite 8 von 98

2 Einführung in PHP

Hier wird eine kurze Einführung in PHP gegeben, die die Teile abdeckt, die in diesem Skript verwendet werden.

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8" />

<title>Erstes PHP-Programm (WieSpaetIstEs.php)</title>

</head>

<body>

<?php

/* hier ist der PHP-Anteil */

$aktuelleZeit = date('H') ; if ($aktuelleZeit < 12)

echo 'Guten Morgen';

elseif ($aktuelleZeit < 20) echo 'Guten Tag';

else

echo 'Gute Nacht‘;

echo '!<br>Es ist jetzt ',date('G:i');

?>

<!- hier ist nun HTML-Anteil ->

&nbsp;(Stunden:Minuten)

</p>

</body>

</html>

Die PHP-Anweisungen werden umklammert von den Ausdrücken <?php und ?>.

Alle anderen Anweisungen – die nicht von diesem Zeichen umklammert werden - werden als HTML interpretiert! Die oben gezeigte Datei kann in im Verzeichnis C:\xampp\htdocs\Uebungen\PHP mit dem Namen WieSpaetIstEs und der Endung php gefunden werden.

Die Datei benötigt die Endung php, damit der Webserver – Apache, der über das XAMPP-Control-Panel gestartet worden ist - die Datei erkennt und die Verarbeitung dementsprechend durchführen kann. Der Aufruf selber erfolgt dann in einem Browser über Anweisung

http://localhost/Beispiele/PHP/WieSpaetIstEs.php

Guten Morgen

Es ist jetzt 10:33 (Stunden:Minuten)

(9)

Seite 9 von 98 2.1 Syntax

Die Syntax in PHP ist ähnlich wie C oder Java. Der wesentliche Unterschied ist

dadurch bedingt, dass PHP eine Skript-Sprache ist. Das heißt, der PHP-Code wird zur Laufzeit interpretiert und sofort ausgeführt und es findet keine Kompilierung,

Verlinkung oder ähnliches statt. Damit wird auch der Platz für die verwendeten Variablen zur Laufzeit angelegt und diese Variablen werden nicht vorher deklariert.

Außerdem findet die gesamte Verarbeitung serverseitig statt, im Unterschied zu z.B.

Javaskript, wo die Verarbeitung clientseitig durchgeführt wird.

Außerdem existieren die Variablen nur so lange wie das Script ausgeführt wird. Eine Ausnahme wird in 2.10 gezeigt.

Der Datei von WieSpaetIstEs.php Ist hier in zwei Teile aufgesplittert, um zu zeigen, wie PHP in HTML integriert ist. Innerhalb des PHP-Bereiches wird echo zur Ausgabe verwendet, welches den als Argument angefügten String ausgibt. echo ist keine wirkliche Funktion, sondern Teil der Sprache PHP, so dass keine Klammern angegeben werden müssen.

void echo ( string $arg1 [, string $... ] );

Ein String kann mittels des Verbindungsoperators "." (Punkt) aus Teilstrings

zusammengesetzt werden. Sind Teilstrings durch "," (Komma) getrennt, so werden sie nacheinander ausgegeben.

Bei der Ausgabe ist kein Unterschied zu erkennen.

Anweisungen, die nicht in <?php und ?> stehen, sind und bleiben HTML- Anweisungen und werden als solche Verstanden und ausgeführt.

2.2 Hochkommas und andere Sonderzeichen

Unterscheidung von einfachem und doppeltem Hochkomma: Bei Verwendung von Text der in " (doppelte Hochkommata) eingefasst ist, ist eine String-Ersetzung möglich, so wie sie von printf und sprintf aus der Sprache C bekannt ist. Ebenso werden in einem Text, die Variablen – also etwas mit einem $ am Anfang, die die Syntaxbedingen, wie in 2.5 beschrieben erfüllt - durch ihren Wert ersetzt - falls das möglich ist! Soll dies vermieden werden, so muss ein \ vor das $-Zeichen gesetzt werden.

In dem kleinen Beispiel-Skript hochkommas.php ist dies praktisch gezeigt.

Verwendung von Sonderzeichen in Strings mit doppeltem Hochkomma:

(10)

Seite 10 von 98 Ausdruck Bedeutung

\n Zeilenumbruch

\r Wagenrücklauf

\t horizontaler Tabulator

\v vertikaler Tabulator

\f Seitenvorschub

\\ Backslash

\$ Dollar-Zeichen

\‘ einfache Anführungszeichen

\" doppelte Anführungszeichen

\[0-7]{1,3} Ein Ausdruck aus dem Bereich der Regular Expressions in oktaler Notation

\x[0-9A-Fa- f]{1,2}

Ein Ausdruck aus dem Bereich der Regular Expressions in hexadezimaler Notation

Bei Verwendung von Text, der mit ' (einfaches Hochkomma) eingefasst ist, ist die oben beschriebene String-Ersetzung nicht möglich.

Die Länge von Strings ist auf 2.147.483.647 Bytes begrenzt.

2.3 Kommentare

Kommentare sind zeilenweise durch // oder mehrzeilig durch /* … */ möglich.

2.4 Konstanten

Konstanten werden mittels der Anweisung const angelegt werden. Dies ist erst seit PHP 5.3 möglich. Vorher musste die Funktion define verwendet werden.

const Name_der_Konstanten Wert_der_Konstanten;

Bei Konstanten wird kein "$" vor den Namen gesetzt!

2.5 Variablen

2.5.1 Variablen werden in der Laufzeitumgebung des PHP-Skriptes angelegt

Variablen müssen immer mit einem "$" (Dollar-Zeichen) anfangen. Danach kann ein Buchstabe oder ein Unterstrich kommen. Groß- und Kleinbuchstaben werden

unterschieden. Variablenamen können auch Zahlen, wenn sie nicht an erster Stelle nach dem $ stehen, enthalten. Umlaute und Sonderzeichen, wie ß, sind nicht erlaubt.

(11)

Seite 11 von 98 2.5.2 Der Typ einer Variablen wird erst zur Laufzeit festgelegt

Werden bei der Initialisierung oder bei einer Zuweisung nur Zahlen ohne Punkt (Punkt steht hier für das Zeichen, das die Dezimalstellen abtrennt) verwendet, so wird von einem ganzzahligem Wert, einem Integer ausgegangen. Dementsprechend wird ein Float angenommen, wenn Zahlen und ein Punkt erkannt wird. Wird eine beliebige Kombination von Buchstaben, Sonderzeichen und Zahlen erkannt, so wird eine Variable vom Typ String angelegt.

Ist eine Variable bereits mit einem anderen Typ angelegt, so wird sie mit dem neuen Typ überschrieben. Das Ganze kann man sich so vorstellen, dass in der

Laufzeitumgebung alle Variablen während der Ausführung eines Skripts im Speicher, unter Erzeugung von Hashwerten, angelegt werden. Der Zugriff erfolgt dann mittels dieses Hashwerts.

2.5.3 Beispiele für das Anlegen von Variablen Int:

$i1 = 5;

Float:

$f1 = 1.234;

$f2 = 1.2e3;

$f3 = 7E-10

String:

$s1 = 'Dies ist ein String';

$s2 = 'Ein einfaches Hochkomma wird durch ein \‘ (Backslash) eingefügt.';

$s3 = 'Ein Backslash wird durch ein \\ eingefügt.';

$s4 = "Dies ist ebenfalls ein String.";

2.5.4 Felder

Variablen können auch Felder enthalten.

Felder sind Variablen, die weitere Dimensionen enthalten, die in der Form [ Index ] angegeben werden.

Es kann Felder mit beliebigen Dimensionen geben und es gibt numerische und assoziative Felder. Numerische Felder haben einen numerischen Index und

assoziative Felder haben einen String als Index. Die Typen der Indizes und der Typ des Feldes können pro Dimension und pro Index-Wert unterschiedlich sein.

(12)

Seite 12 von 98 Felder können auch angelegt werden, indem die Dimensionsangabe in den eckigen Klammern "[]" ohne Index erfolgt oder indem die Funktion array() bei der Zuweisung verwendet oder indem der tatsächliche Wert des Indexes angegeben wird.

Felder können erzeugt werden, indem sie wie oben beschrieben, beim Anlegen initialisiert werden. Ihnen können später Werte zugewiesen wird, sie können indexweise beschrieben werden oder automatisch beschrieben werden, indem kein Index sondern ein leeres "[]" angegeben wird; wird diese letzte Form, der

dimensionslose Ausdruck verwendet, so wird angenommen, dass es sich um ein Feld mit numerischem Index handelt, der in diesem Fall immer mit 0 anfängt.

Weiterhin ist es möglich ein Key-Value-Paar anzugeben. Dabei werden Key und Value durch ein => getrennt. Der Key ist als Index zu verstehen und Value ist der Wert, auf den der Index zeigt. Der Typ von Key und Value kann ein Integer und/oder ein String sein.

Felder können per Index oder unter Verwendung der foreach-Schleife ausgelesen werden. Bei foreach können nur die Werte oder auch Wertepaare ausgelesen werden.

Nur Ausgabe der Werte:

foreach ($wochentage as $value) echo '<br> '.$value;

Ausgabe der Indexe und der Werte:

foreach ($wochentage as $key => $value) echo '<br>'.$key.' -> '.$value;

Beispiel und Übung zu Feldern (die for-Schleife wird als bekannt vorausgesetzt)

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8" />

<title>wochentage</title>

</head>

<body>

<h2>PHP: Wochentage</h2>

<?php

$WT[0] = "montag";

$WT[1] = "dienstag";

echo '<br>'.$WT[1];

echo '<br>',$WT[0];

?>

<br>---

<?php

$wochentage[] = "Montag";

$wochentage[] = "Dienstag";

(13)

Seite 13 von 98

for ($i=0;$i<2;$i++)

echo '<br>'.$wochentage[$i];

?>

<br>---

<?php

$wochentage = array(

1 => "Montag",

"2" => "Dienstag", 'drei' => "Mittwoch");

foreach ($wochentage as $key => $value) echo '<br>'.$key.' -> '.$value;

?>

</p>

</body>

</html>

 dienstag

 montag

 ---

 Montag

 Dienstag

 ---

 1 -> Montag

 2 -> Dienstag

 drei -> Mittwoch

Siehe wochentage.php

In der Datei Felder_Uebung_1.php sind ein paar Felder deklariert und gefüllt worden. Bitte versuchen Sie mit einer for-Schleife folgende Ausgabe zu erreichen:

 fuenftes, viertes, drittes, 2tes, erstes, anfang, Lösung: Felder_Uebung_1_Loesung.php

Zum Debuggen können Variablen mit der Built-in-Funktion print_r ausgegeben werden. Dies gilt auch für Felder. Durch die Verwendung des HTML-Tags "<pre>"

(vorformatierter Text) wird die Ausgabe entsprechend eingerückt.

Siehe print_r.php

Die Ermittlung der Größe eines Feldes kann durch die Anweisung sizeof(<$feld>) erfolgen. Da es verschiedene Dimensionen geben kann, muss ggf. die entsprechende Dimension angegeben werden.

(14)

Seite 14 von 98

<?php

const MAX = 5;

for ($v=array(),$i=0;$i<MAX;$i++) {

$v[] = $i;

for ($v[$i]=array(),$j=0;$j<(MAX*10);$j++) {

$v[$i][] = $j;

for ($v[$i][$j]=array(),$k=0;$k<(MAX*100);$k++)

$v[$i][$j][] = $k;

} }

echo '<br>sizeof $v:'.sizeof($v);

echo '<br>sizeof $v[0]:'.sizeof($v[0]);

echo '<br>sizeof $v[0][0]:'.sizeof ($v[0][0]);

?>

 sizeof $v:5

 sizeof $v[0]:50

 sizeof $v[0][0]:500 Siehe sizeof_print.php 2.6 Vergleichsoperatoren

Es gibt Vergleichsoperatoren wie in C und zusätzlich "===" und "!==". Diese Operatoren stehen für Identisch bzw. Nicht Identisch. Dabei wird auf Bitebene und damit auf Inhalt und auf Typ abgeprüft. Schließlich gibt es zwei Vergleichsoperatoren für Ungleich: neben "!=" auch "<>", weil dieser Ausdruck in SQL verwendet wird.

Name Bedeutung Erklärung

$a == $b Gleich Gibt TRUE zurück, wenn $a gleich $b ist.

$a != $b Ungleich Gibt TRUE zurück, wenn $a nicht gleich $b ist.

$a <> $b

$a === $b Identisch (gleich auf Bitebene)

Gibt TRUE zurück wenn $a gleich $b ist und beide vom gleichen Typ sind (eingeführt in PHP 4).

$a !== $b Nicht Identisch (ungleich auf Bitebene)

Gibt TRUE zurück, wenn $a nicht gleich $b ist, oder wenn beide nicht vom gleichen Typ sind (eingeführt in PHP 4).

$a < $b Kleiner als Gibt TRUE zurück, wenn $a kleiner als $b ist.

$a > $b Größer als Gibt TRUE zurück, wenn $a größer als $b ist.

$a <= $b Kleiner gleich Gibt TRUE zurück, wenn $a kleiner oder gleich $b ist.

$a >= $b Größer gleich Gibt TRUE zurück, wenn $a größer oder gleich $b ist.

$a && $b Und Gibt TRUE zurück, wenn $a und $b wahr, also ungleich 0 sind.

$a and $b

$a || $b Oder Gibt TRUE zurück, wenn $a oder $b wahr, also ungleich 0 sind.

$a or $b

(15)

Seite 15 von 98 Diese Vergleichsoperatoren können auch im ternären Operator verwendet werden.

Dies ist ein If-Else in Kurzform, die auch in einer Zuweisung verwendet werden kann:

(vergleich) ? <positives Vergleichsergebnis> : <negatives Vergleichsergebnis>;

Beispiel

<?php

$x = 0;

$y = '';

echo "<p>Es wird im Folgenden \$x: ($x) (integer 0) mit \$y ($y) (Leerstring) verglichen.";

printf ("<br>Vergleich \$x == \$y: %d ",($x == $y));

printf ("<br>Vergleich \$x != \$y: %d ",($x != $y));

printf ("<br>Vergleich \$x <> \$y: %d ",($x <> $y));

printf ("<br>Vergleich \$x === \$y: %d ",($x === $y));

echo '<p>Nun wird der ternäre Operator verwendet:<br>';

echo ($x !== $y) ? 'Die beiden Variablen sind nicht Identisch' : 'Die beiden Variablen sind nun Identisch';

$y = 0;

echo '<br>Nun ist $y auch 0, genau wie $x<br>';

echo ($x !== $y) ? 'Die beiden Variablen sind nicht Identisch' : 'Die beiden Variablen sind nun Identisch';

?>

 Es wird im Folgenden $x: (0) (integer 0) mit $y () (Leerstring) verglichen.

 Vergleich $x == $y: 1

 Vergleich $x != $y: 0

 Vergleich $x <> $y: 0

 Vergleich $x === $y: 0

 Nun wird der ternäre Operator verwendet:

 Die beiden Variablen sind nicht Identisch

 Nun ist $y auch 0, genau wie $x

 Die beiden Variablen sind nun Identisch Siehe vergleichsoperatoren.php

(16)

Seite 16 von 98 2.7 Kontrollstrukturen.

Es gibt in PHP Kontrollstrukturen wie in C oder Java: if, else, elseif, while, for, do while, break, continue, switch, aber auch zusätzliche Erweiterungen.

Ausdruck Bedeutung if (bedingung).. elseif

else

Bedingte Ausführung von Code - elseif und else können weggelassen werden.

while (bedingung ) Schleife, bei der die Bedingung vor Ausführung geprüft wird

for ( ; bedingung ; ) Schleife, bei der die Bedingung vor Ausführung geprüft wird, zusätzlich können im linken Teil Code-Sequenzen vor jedem Durchlauf und im rechten Teil nach jedem Schleifendurchlauf ausgeführt werden. In der Mitte befindet sich die Abfrage, wie bei der while-Schleife.

Wenn es mehrere Statements im linken oder rechten Teil gibt, so werden diese durch ein Komma getrennt do … while

(bedingung )

Schleife, bei der die Bedingung nach der Ausführung geprüft wird

switch (variable) {

case A:

… case B:

… default:

… }

Der Wert einer Variable oder eines Ausdrucks wird ausgewertet.

Die Verarbeitung kann jederzeit durch ein break beendet werden.

Die Verarbeitung erfolgt ab dem Wert der Variablen, die dem case-Wert entspricht. D.h. wenn kein break

auftaucht, wird bis zum Ende alles ausgeführt.

Der optionale Fall "default" kommt in Frage wenn keiner der vorherigen Fälle vorliegt.

break In einer Schleife wird mit dem break der Code nicht mehr durchlaufen und die Schleife wird endgültig verlassen.

Im switch wird die weitere Verarbeitung nicht mehr durchgeführt und der switch wird verlassen.

continue In einer Schleife wird sofort der nächste

Schleifendurchlauf erzwungen und der auf das continue folgende Code innerhalb einer Schleife wird nicht mehr durchlaufen.

return( number ) Rückgabe der Kontrolle an ein aufrufendes Programm.

Dabei kann ein Wert zurückgegeben werden.

(17)

Seite 17 von 98 Ausdruck Bedeutung

die ( text ) Beendigung des Skripts mit Textausgabe.

exit ( number ) Beendigung des Skripts. Number kann 0 bis 254 sein. 0 steht für erfolgreiches Beenden.

<?php if (…): ?>

<?php endif; ?>

PHP bietet eine alternative Syntax für einige seiner Kontrollstrukturen an, namentlich für if, while, for, foreach und switch. In jedem Fall ist die Grundform der alternativen Syntax ein Austausch der öffnenden

Klammer "{" gegen einen Doppelpunkt ":" und der schließenden Klammer "}" in endif, endwhile, endfor;

endforeach; respektive endswitch. Durch diese Angaben können HTML-Blöcke gebildet und diese durch das

Ergebnis eines Vergleichs gesteuert, ausgegeben werden.

inlcude "datei" include bindet eine angegebene Datei ein und führt sie aus.

require "datei" require entspricht im Wesentlichen include, beendet im Fehlerfall aber das Skript, während beim inlcude eine weitere Programmausführung möglich ist.

2.8 Funktionen in PHP function name(parameter) {

….

}

Die Parameter werden nur mit ihrem Namen deklariert. Eine Typangabe braucht nicht zu erfolgen. So wie das in PHP üblich ist.

 Die Parameter können per call-by-value übergeben werden. Dann wird eine Kopie der Variablen zum Funktionsaufruf übergeben. Änderung der Parame- terwerte wirken sich nicht außerhalb der Funktion aus.

 Die Parameter können per call-by-reference übergeben werden indem ein &- Zeichen vor die Variable gesetzt wird. Dann wird eine Referenz auf die origina- le Variable und keine Kopie der Variablen zum Funktionsaufruf übergeben.

(18)

Seite 18 von 98 Änderung der Parameterwerte innerhalb der Funktion wirken sich außerhalb der Funktion aus.

2.9 Gültigkeit von Variablen

 Es gibt globale Variablen, die nur außerhalb von Funktionen gültig sind. Dies ist ein Unterschied zu anderen Programmiersprachen.

 Es gibt lokale Variablen, die nur in der Funktion gelten.

 Mittels der Anweisung global vor der Definition einer Variablen innerhalb einer Funktion wird diese auch außerhalb einer Funktion sichtbar.

 Es gibt superglobale Systemvariablen wie das Eingabefeld $_POST, aber auch

$GLOBALS das auf ein assoziatives Array zeigt, deren Werte außerhalb und innerhalb von Funktionen gelten.

(19)

Seite 19 von 98 2.10 Sessions

In PHP ist es möglich einen Speicherbereich anzulegen, in dem Daten über den Aufruf eines Skriptes hinweg existieren können. Damit gibt es eine gewisse Ähnlichkeit in der Funktionalität mit den später vorgestellten Formularen.

Dieser Speicherbereich muss am Anfang eines Skriptes erzeugt werden. Er kann am Ende auch wieder vernichtet werden. Eine Session-ID existiert für einen Browser und wird oft mit Cookies implementiert, dabei sind der Speicherorte die Session-Daten eines Servers.

session_start(); Legt diese Speichermöglichkeit an. session_destroy(); Beseitigt diese wieder.

Einzelne Session-Werte können über das superglobale Array $_SESSION abgefragt werden.

Z.B. kann der Wert für eine Reiseziel mit $_SESSION[' Reiseziel '] = 'Island‘; gesetzt werden. Es kann abgefragt werden ob er ein Session-Wert für Reiseziel existiert;

If (isset($_SESSION[' Reiseziel ']) ….

Der Wert selber kann auch abgefragt werden:

$reiseziel = ($_SESSION[' Reiseziel '];

Da Formulare (siehe 3.2) Benutzereingaben verwalten, können Sessions Formulare nicht vollständig ersetzen. Die Speicherung der aus einem Formular gewonnen Daten kann aber in Sessions erfolgen, damit sie nicht verloren gehen. In den Beispielen aus diesem Skript, werden keine Session-Variablen verwendet, die Daten werden in den Formularen gespeichert.

(20)

Seite 20 von 98

3 Kurzbeschreibung von HTML-Anweisungen, die in diesem Kurs verwendet werden

3.1 Tabellen in HTML.

<table> Anlegen einer Tabelle </table>

Dabei können weitere Parameter angegeben werden:

<table border="10" cellpadding="10" cellspacing="10" bgcolor="grey">

Standardangabe erfolgt in Pixel, es ist aber auch die Angabe in Prozent (%) möglich.

border: die Dicke des äußeren Rands

cellpadding: der Abstand des inneren Textes zur Außengrenze einer Zelle cellspacing: die Dicke der Zellzwischenränder

bgcolor: Hintergrundfarbe (betrifft nicht den Rand). Siehe dazu z.B.

http://raschedv.net/tem/webcolor.html

<tr> Zeile erzeugen </tr>

<th> Kopf-Spalte und damit Kopf-Zelle erzeugen </th>

<td> Spalte und damit eine Zelle erzeugen </td>

Spalten und Zeilen können auch zusammengefasst werden. Wenn mehrere Spalten in einer Zeilen zusammengefasst werden, so wird rowspan="<Anzahl Zeilen>"

verwendet. Für die Zusammenfassung von Spalten steht colspan="<Anzahl Spalten"> zur Verfügung.

Beide werden in der Anweisung th oder td verwendet und können auch kombiniert werden.

Wenn Zeilen oder Spalten zusammengefasst werden, so bedeutet dass, das Zeilen oder Spalten an anderer Stelle entfallen. Auch kann jede Zelle eine eigene

Hintergrundfarbe bekommen. Es gibt noch weitere Attribute, die verwendet werden können. Zusätzlich können Tabellen durch eine Vielzahl von CSS-Anweisungen in ihrer Gestaltung angepasst werden. Jeder Browser lässt eine Tabelle etwas anderes erscheinen!

(21)

Seite 21 von 98

Siehe Beispiel tabellen.php

3.1.1 Übung

Mit Hilfe von Schleifen aus PHP und Tabellen aus HTML, soll in PHP folgendes dynamisches Ergebnis erzeugt werden

Hilfe: Ausschnitte aus der Lösung

<td colspan="3" bgcolor=“green" width="40" height="40">&nbsp;</td>

<td bgcolor=“red" width="40" height="40">&nbsp;</td>

Siehe Tabellen_Uebung_Loesung.php

(22)

Seite 22 von 98 3.2 Formulare in HTML

In den hier beschriebenen Beispielen sendet ein Client, z.B. ein Browser auf einem PC, eine Anforderung an den Server. Dies geschieht aus einem HTML-Formular heraus, in dem Daten – z.B. ausgefüllte oder angekreuzte Formularfelder - gesendet werden. Der Server ruft das PHP-Skript auf, das im Formular angegeben war (siehe unten). Der Server arbeitet das Skript ab und schickt die Antwort an den Client und vergisst das Ganze anschließend 1i da HTML ein sogenanntes zustandsloses

(stateless) Protokoll ist (PHP dient hier nur dazu, HTML zu erzeugen).

Dies kann bei komplexen Kommunikationen schwierig sein. Ein Ausweg, um die Daten des Formulars nicht zu verlieren, dass sie zum Neu-Ausfüllen des Formulars beim Aufbau der HTML-Website benutzt werden. Dies geschieht indem das PHP- Skript die empfangenen Formulardaten, nach der Abarbeitung, an den Client zurückschickt und diese benutzt werden, um die Seite aufzubauen (die andere Möglichkeit, dass die mittels Sessions (siehe 2.10) gespeichert werden, wird hier nicht verwendet).

In HTML ermöglichen Formulare die Datenübergabe an eine andere HTML- oder Skript-Datei

Beispiel

<form action="..path/ZielDatei.php'" name="MyForm" method="POST">

<input type=”text” name=”1_parameter” value=”Wert” size=10>

<input type=”hidden” name=”2_parameter” value=”noch’n Wert” >

<input type=”submit” name=”Hier_gehts_ab” value=”los-gehts” >

<button type=”submit” name=”ich-komme-an” value=”da-bin-ich” >Knopf</button>

</form>

1 Es gibt das Konzept von AJAX (Asynchronous JavaScript and Xml) in dem einzelne Teile einer Webseite

verändert und damit der Kommunikationsaufwand zwischen dem Sebserver und dem Client und damit auch die Reaktionszeiten deutlich verringert werden können. Auf dieses Konzept wird in dieser Vorlesung nicht

eingegangen.

(23)

Seite 23 von 98 Es sind die Methoden (im Tag form) POST und GET möglich. GET überträgt die

Daten in der URL, POST im Datenstream selber. Die Datenmenge, die beim Aufruf übertragen wird liegt bei GET bei ca. 2 kB und ist bei POST praktisch nicht limitiert.

GET ist einfacher zu debuggen, aber deutlich sicherheitsproblematischer.

POST und GET-Daten werden automatisch von PHP in den superglobalen Variablen

$_POST und $_GET zur Verfügung gestellt.

Früher konnten alle Variablen aus PHP direkt vom aufrufenden Programm

ausgewertet werden. Dies ist inzwischen in der Standard-Konfiguration von PHP aus Sicherheitsgründen nicht mehr möglich.

Hier werden einige Elemente aufgelistet, die in Formularen Eingaben und Auswahlen erlauben.

Es gibt das Element input type="<text>". Dieses Feld ist ein einzeiliges Eingabefeld.

Es gibt auch mehrzeilige Textfelder, außerdem gibt es Felder für Zahlen, für

Passwörter, für Zeit und Datumsangaben und einiges mehr, auf die hier aber nicht eingegangen werden. Damit kann die Eingabe in eine Datenbank bereits im Vorfeld unterstützt werden. Beim Passwort ist aber zu bedenken, dass es im Klartext

übertragen wird, auch wenn es bei der Eingabe nicht angezeigt wird. Dies ist

besonders bei der GET-Methode äußerst problematisch. Siehe dazu weiter unten. Es gibt auch verborgene Felder und Felder die beim Anklicken eine Aktion auslösen können.

Mit “select“ kann eine Auswahlliste mit vordefinierten Auswahlen erzeugt werden.

<select size="1" name="Reiseziele "/>';

<option>Seychellen</option>

<option>Barrier Reef</option>

<option selected>Rotes Meer</option>

</select>

Eine Vorbelegung kann durch Eintrag von selected in das Option-Tag für eine Auswahlliste erreicht werden.

Die Mehrfachauswahl einer Auswahlliste kann durch das zusätzliche Attribut multiple im einleitenden <select>-Tag ermöglicht werden. Aus Konformitätsgründen zu XML wird multiple="multiple" verwendet.

Eine Mehrfachauswahl ist für Anwender nicht unmittelbar erkennbar. Deshalb sollte expliziet darauf hingeweisen werden, wenn mehrere Einträge ausgewählt werden können. Auch ist nicht allen Anwendern klar, wie sie mehrere Einträge selektieren können. Auf modernen PC-Tastaturen geschieht das normalerweise durch Halten der [Strg]-Taste bei gleichzeitigem Anklicken der gewünschten Listeneinträge. Wird

(24)

Seite 24 von 98 stattdessen die Shift-Taste verwendet so wird ein durchgehender Bereich

ausgewählt. Macintosh-Benutzer verwenden dafür die Befehlstaste.

Mit input type="checkbox" können Auswahlen angelegt werden, aus denen ein oder mehrere durch Anklicken ausgewählt werden können.

<input Type="checkbox” name="Reiseziele_1" value="Seychellen" />Seychellen

<input Type="checkbox" name=" Reiseziele_1" value="Bali" />Bali

<input Type="checkbox" name=" Reiseziele_1” value="Rotes Meer" />Rotes Meer

Mit input type=“radio“ können Auswahlen angelegt werden, aus denen genau eine durch Anklicken ausgewählt werden kann.

<input Type="radio” name="Reiseziele_2" value="Seychellen" />Seychellen

<input Type="radio" name=" Reiseziele_2" value="Bali" />Bali

<input Type="radio" name=" Reiseziele_2” value="Rotes Meer" checked/>Rotes Meer

Die Vorbelegung bei radio- und checkboxen wird durch den Eintrag checked in den jeweiligen input-Tags erreicht.

Mit input type=“hidden“ kann eine nicht sichtbare Information übertragen werden.

<input Type="hidden" name=" Reiseziele_Alternativ” value="Zu Hause" />

Form-Elemente, die den gleichen Namen haben, werden gleich behandelt. Eine Gruppe von radio-Boxen wird gemeinsam behandelt, da nur eine Auswahl aus allen Elementen dieser Gruppe von radio-Boxen möglich ist. Genauso wird die Eingabe einer Gruppe von Checkboxen gleich behandelt, wenn sie den gleichen Namen haben. Der zeitlich letzte Ausdruck überschreibt den Wert eines vorherigen Ausdrucks.

3.2.1 Unterstützung von Formularen durch PHP

Formulare werden durch PHP sehr elegant unterstützt. Um ein Formular nach dem Ausfüllen abzusenden (und durch die vorher eingetragene Action verarbeiten zu lassen) gibt es zwei Möglichkeiten. Zuerst gab es nur den input-Tag mit dem Attribut submit. Seit HTML 4.0 gibt es auch das button-Tag mit seinem Default-Attribut submit.

Die Datei, beim Abschicken aufgerufen werden soll, wird in das form-Tag eingetragen. In diesem Skript wird folgende Form dafür gewählt:

<?php

echo '<form action="'.basename(__file__).'" name="MyForm" method="POST">

?>

(25)

Seite 25 von 98 Der Ausdruck __file__ ist eine automatische Konstante, die in PHP immer auf den Filename zeigt, in dem sich der Ausdruck befindet. In diesem Filename ist der Pfad enthalten. Z.B. C:\xampp\htdocs\Form-1.php. Dies ist eine Notation aus der

Windows-Welt und nicht dazu geeignet, um in einer URL für einen Webserver verwendet zu werden. Die Funktion basename entfernt nun den Pfad-Teil, so dass nur noch der Dateiname übrig bleibt. Falls das aufzurufende Skript in einem anderen Verzeichnis liegt, muss dies hier in geeigneter Form angegeben werden.

Eine der besonderen Stärken von PHP ist die Unterstützung von Formulardaten, insbesondere bei Mehrfachauswahlen bei Formularen. Wie oben beschrieben, ist es möglich bei Checkboxen, Radio-Boxen und bei Auswahllisten mehrere Möglichkeiten zuzulassen. Wird dem Namen eines solchen Elementes ein "[]" (leere

Dimensionsangabe bei Feldern – siehe 2.5.4) angehängt, so wird in PHP das Element als Feld interpretiert und es wird automatisch ein Array mit numerischem

Unterelementen erzeugt. Damit kann beim Empfang eines ausgefüllten Formulars jedes selektierte (!) Unterelement durch einen Index adressiert werden. Wird z.B.

eine Auswahlliste, mit Mehrfachauswahl und einem "[]" im Namen mittels einem foreach durchlaufen, so werden alle ausgewählten Unterelemente in dieser Schleife zur Verfügung gestellt.

<select size="3" name="Lesestoff[]"multiple="multiple"/>

<option> Krimis</option>

<option>Fachbücher</option>

<option>Reisefuehrer</option>

<option>Belletristik</option>

</select>

Sind hier nun Krimis und Reisefuehrer ausgewählt,

so würde beim Empfang des Formulars der der Ausdruck

<?php

foreach ($_POST[Lesestoff] AS $R) {

echo ‘<br>’.$R }

?>

alle ausgewählten Unterelemente von Lesestoff auflisten.

(26)

Seite 26 von 98

 Krimis

 Reisefuehrer

3.2.2 Übungen zu Formularen in HTML

Es wird ein Skript zur Verfügung gestellt, dass ein Formular enthält, einschließlich eines Textfelds zu Eingabe. Das Formular kann per input mit dem Parameter submit und/oder Button abgeschickt werden. Die Übergabe der Daten kann per GET oder POST erfolgen. Die Wahlmöglichkeit ist per Konstante eingebaut.

Skript: Forms_Uebung_1.php

Fügen Sie Wahlmöglichkeiten ein, in Form einer Liste, in Form Radio-Buttons und in Form einer Checkbox.

Lösung Forms_Uebung_2.php gezeigt.

Fügen Sie Vorbelegungen für die Liste, die Radio-Buttons und die Checkbox ein und ermöglichen die Mehrfacheingabe für diese Felder.

Lösung Forms_Uebung_3.php

Nun übertragen Sie die eingegebenen Werte in das Formaler und überschreiben damit die Vorbelegung.

Lösung forms_Uebung_4.php.

Nun reduzieren Sie die Felder auf ein Select und eine Reihe von Checkboxen mit gleichem Inhalt. Über eine zusätzliche Radio-Box sollte gewählt werden können, ob die Checkboxen durch die Auswahlen des Selects oder umgekehrt synchronisiert werden. Dies geschieht genau dann, wenn das Skript mit Parameterübergabe aufgerufen wird. In der Anfangseinstellung synchronisiert das Auswahlfeld die Checkboxen.

Lösung forms_Uebung_5.php.

(27)

Seite 27 von 98

4 Einführung in SQL für MySQL/MariaDB

SQL steht für Structured Query Language, es ist eine Datenbanksprache zur

Definition von Datenstrukturen in relationalen Datenbanken, sowie zum Bearbeiten (Einfügen, Verändern, Löschen) und Abfragen von darauf basierenden

Datenbeständen.

SQL ist keine prozedurale Programmiersprache. Die Ergebnisse sind mengenorientiert.

MariaDB ist eine Abspaltung von MySQL, die durchgeführt wurde, da SUN die

Markenrechte von MYSQL hält und SUN wiederum von ORACLE übernommen wurde, welches schon lange ein eigenes relationales Datenbanksystem (das Erste!) hat.

Inzwischen wird in XAMPP nun MariaDB verwendet.

Es gibt leichte Unterschiede in verschiedenen SQL-Dialekten.

Wenn bei numerischen Typen wie INT in Klammern eine Zahl angegeben ist, so beeinflusst dies nicht Wertebereich, sondern gibt an, wie viel Stellen mindestens angezeigt werden sollen.

Bei CHAR und VARCHAR gibt der Wert in Klammern den maximalen Speicherbereich an. Sollen längere Strings gespeichert werden, so werden sie abgeschnitten. Dabei bieten dynamische Datentypen wie VARCHAR einen besseren Umgang mit dem Speicherplatz um, wie ein statischer Datentyp wie CHAR. Allerdings haben dynmische Datentypen möglicherweise Performamce-Probleme.

4.1 Gruppen von SQL-Befehlen

Hier werden drei Gruppen von SQL-Befehlen erwähnt, davon werden nur zwei näher angesehen, nämlich DDL und DML :

Gruppe Befehle Bedeutung

DDL

Data Definition Language

CREATE TABLE Erzeugen einer Tabelle, eines Indizes etc.

ALTER TABLE Verändern einer Tabelle oder deren Eigenschaften

DROP TABLE Löschen einer Tabelle (oder Datenbank) DML

Data Manipulation Language

INSERT INTO Einfügen in eine Tabelle UPDATE … SET Verändern in einer Tabelle DELETE FROM Löschen aus einer Tabelle SELECT FROM Abfragen aus einer Tabelle START

TRANSACTION

Transaktionen – Sperren von Tabellen DCL

Data Control Language

GRANT REVOKE

Ändern von Zugriffsrechten

(28)

Seite 28 von 98 Manchmal tauchen noch andere Kategorien auf, wie DQL Data Query Language oder TCL Transaction Control Language. In diesem Skript geht es nur um Befehle aus den Gruppen DDL und DML. Transaktionen werden hier unter DML behandelt.

Zuerst werden übersichtsartig die Befehle der DDL beschrieben. Es wird gezeigt, wie Tabellen mittels phpMyAdmin Tabellen angelegt und verändert werden können. Dies wird übrigens beim Entwurf einer Datenbank oft genauso gemacht. Die DDL-Befehle diesen dazu, zur Laufzeit Tabellen anzulegen zu verwalten usw.

Anschließend werden DML-Befehle beschrieben, in den die Daten in den Tabellen verändert oder abgefragt werden können, dabei liegt das Hauptaugenmerk auf dem SELECT-Kommando.

SQL-Kommandos sind nicht case sensitive, d.h. sie können groß oder klein geschrieben werden. Sie sind weitgehend format-frei und so sind Leerzeichen, Zeilenvorschübe und ähnliches innerhalb eines SQL-Kommandos erlaubt.

Kommentare in MySQL

Es gibt drei verschiedene Formen

# bis zum Zeilenende

-- bis zum Zeilenende (es muss nach dem -- ein Leerzeichen vorhanden sein) /* ein und mehrzeilig mit Beginn- und Ende-Sequenz */

4.2 Arbeiten mit phpMyAdmin

In PHP wird eine Webanwendung zur Verfgung gestellt, welche mit einer Datenbank verbunden werden kann (http://localhost/phpmyadmin/). Es ist möglich die hier beschriebenen Kommandos in phpMyAdmin auszuführen und dabei zu kopieren und wie weiter unten beschrieben in einem PHP-Kommando auszuführen oder sogar den PHP-Code direkt aus phpMyAdmin generieren zu lassen. Ebenso lassen sich alle existierenden Tabellen in Dateien mit einer SQL-Endung exportieren (und können damit an andere Stelle neu erzeugt oder importiert werden).

Ebenso werden in phpMyAdmin alle beauftragten Änderungen an Tabellen durch ALTER-Statements durchgeführt, die ebenso kopierbar sind. Selbst die Änderung des Wertes eines Datenfeldes wird anschließend als UPDATE-Kommando gezeigt und kann übernommen werden

Allerdings kann es Unterschiede geben, zwischen Queries, die in dem SQL-Fenster von phpMyAdmin und der tatsächlichen Ausführung im Rahmen einer PHP-Datei auftreten. Das was bei der Übergabe durch einen Aufruf aus einer PHP-Datei

(29)

Seite 29 von 98 gemeldet wird, ist das Richtige! Z.B. funktionieren in phpMyAdmin manche komplexe Unterabfragen nicht und es gibt Fehlermeldungen, aber sie funktionieren problemlos im Kontext eines PHP-Aufrufs.

4.3 Eigenschaften von relationalen Tabellen

Eine Tabelle besteht aus Datensätzen. Diese Datensätze bestehen wiederum aus Feldern. Manchmal wird statt Feld auch der Begriff Spalte verwendet. Ein jedes Feld braucht einen Namen, der für diese Tabelle eindeutig ist. Außerdem braucht jedes Feld einen Typen. Diese sind hier nun aufgelistet.

4.4 Datentypen

Datentyp Speicher- platz

Beschreibung

TINYINT 1 Byte Ganzzahlen von 0 bis 255 oder von -128 bis 127 – je nachdem ob unsigned angegeben ist oder nicht.

SMALLINT 2 Bytes Ganzzahlen von 0 bis 65.535 oder von -32.768 bis 32.767.

MEDIUMINT 3 Bytes Ganzzahlen von 0 bis 16.777.215 oder von -8.388.608 bis 8.388.607.

INT 4 Bytes Ganzzahlen von 0 bis ~4,3 Mill. oder von -2.147.483.648 bis 2.147.483.647.

INTEGER 4 Bytes Alias für INT.

BIGINT 8 Bytes Ganzzahlen von 0 bis 264-1 oder von -(263) bis (263)-1.

FLOAT 4 Bytes Fließkommazahl mit Vorzeichen. Wertebereich von -

(3,402823466×1038) bis -(1,175494351×10-38), 0 und 1,175494351×10-

38 bis 3,402823466×1038

DOUBLE 8 Bytes Fließkommazahl mit Vorzeichen. Wertebereich von -(1,79769×10308) bis -(2.22507×10308), 0 und 2.22507×10-308 bis 1,79769×10308

REAL 8 Bytes Alias für DOUBLE

DECIMAL M+x Bytes Fließkommazahl mit Vorzeichen. Speicherbedarf: x=1 wenn D=0, sonst x=2. Ab MySQL 5.1 binär gespeichert, zuvor als String.

NUMERIC M+x Bytes Alias für DECIMAL

DATE 3 Bytes Datum im Format 'YYYY-MM-DD'. Wertebereich von 01.01.1000 bis 31.12.9999.

DATETIME 8 Bytes Datumsangabe im Format 'YYYY-MM-DD hh:mm:ss'. Wertebereich entspricht DATE.

TIME 3 Bytes Zeit zwischen -838:59:59 und 839:59:59. Ausgabe: hh:mm:ss.

CHAR M Byte(s) Zeichenkette fester Länge M. Wertebereich für M: 0 bis 255.

VARCHAR L+1 Bytes Zeichenkette variabler Länge, Maximum ist M. Wertebereich für M: 0 bis 255.

BINARY M Bytes Zum Speichern binärer Strings, unabhängig vom Zeichensatz.

Wertebereich für M: 0 bis 255. Weiterer Typ: VARBINARY BLOB L+2 Bytes Binäres Objekt mit variablen Daten. Weitere Typen: TINYBLOB,

MEDIUMBLOB und LONGBLOB. M ist ab Version 4.1 definierbar.

TEXT L+2 Bytes Wie BLOB. Ignoriert beim Sortieren & Vergleichen Groß- und

(30)

Seite 30 von 98 Datentyp Speicher-

platz

Beschreibung

Kleinschreibung. Weitere Typen: TINYTEXT, MEDIUMTEXT, LONGTEXT. M ist ab Version 4.1 definierbar.

ENUM 1 oder 2 Bytes Liste von Werten (val1, val2, ...). 65.535 eineindeutige Elemente sind maximal möglich.

Speichert nichts oder nur einen der definierten Werte

Beim Speichern werden ungültige Werte als leere Zeichenfolge gespeichert.

Beispiel: enum ('Herr', 'Frau', 'Familie'). Es werden Integer als Index auf die Werte gespeichert, die erlaubt sind.

SET x Bytes String-Objekt mit verschiedenen Variablen. 64 sind maximal möglich.

Es können mehrere Werte aus der definierten Liste gespeichert werden.

Beispiel: set('Herr', 'Frau', 'Familie'), hier sind auch Kombinationen aus den erlaubten Wer-ten möglich.

Zusätzlich kann es Contraints, Bedingungen geben z.B. für Inhalt eines Datenfeldes.

4.4.1 NULL-Werte

Ein NULL-Wert bedeutet, dass kein Wert in das Feld eingetragen ist (oder dass bei einer Abfrage kein Ergebnis gefunden worden ist – siehe LEFT JOIN 4.6.4.11.5 ). Null Werte können angefragt werden (siehe 4.6.4.4.5). Der Wert 0 ist kein NULL-Wert, sondern einfach ein Wert, der den numerischen Wert 0 hat.

Für jedes Feld einer Tabelle kann festgelegt werden, ob NULL-Werte erlaubt sind oder nicht. Damit wird bei der Tabellendefinition NULL oder NOT NULL angegeben.

4.4.2 DEFAULT

Für jedes Feld einer Tabelle kann festgelegt werden, ob ein Default verwendet werden soll, wenn kein Wert eingetragen worden ist.

4.4.3 AUTO_INCREMENT

Ein wichtiger Punkt bei der Erzeugung einer Tabelle ist, dass ein Feld ein Attribut vom Typ AUTO_INKREMENT besitzen kann. Dies bedeutet, dass der Wert dieses Feldes automatisch errechnet wird, indem bei jedem Neuanlegen eines

Tabelleneintrags dieser Wert um 1 inkrementiert wird. Dadurch ist gesichert, dass jeder Datensatz über eine einmalige Identifizierung verfügt.

Ein Autoinkrement-Wert enthält keine Information über den Inhalt eines Datensatzes.

(31)

Seite 31 von 98 4.4.4 PRIMARY KEY

Es ist günstig, wenn Tabelle über einen PRIMARY KEY verfügt, der dann möglicherweise auch eine Auto-Inkrement-Eigenschaft hat. Allerdings können

PRIMARY KEYS sich auch über mehrere Spalten erstrecken. Mit einem PRIMARY KEY kann jeder Datensatz individuell adressiert werden.

Ein PRIMARY KEY muss immer eindeutig sein. Es ist nur ein PRIMARY KEY pro Tabelle möglich.

4.4.5 FORGEIN KEYS

Ein FOREIGN KEY regelt die logischen Verbindungen zwischen zwei Tabellen: Ein Datensatz in einer Tabelle darf in einer bestimmten Spalte nur solche Werte annehmen, die in einer anderen Tabelle bereits angelegt sind. Hier wird auch von Eltern- und Kind-Einträgen gesprochen.

Beispiel:

In der Tabelle Mitarbeiter (Kind) darf als Abteilungs-ID nur eine gültige ID aus der Tabelle Abteilung (Eltern) stehen.

4.4.6 UNIQUE

Wenn der Wert eines Feldes oder einer Feld-Kombination einmalig innerhalb einer Tabelle sein muss, handelt es sich um einen UNIQUE-Wert. Auch eine Kombination von mehreren Feldern kann diese Eigenschaft haben.

4.4.7 CONTRAINTS

Die bereits aufgezählten Eigenschaften wie PRIMARY KEY, FORGEIGN KEY und UNIQUE bilden CONTRAINTS. Dies sind bestimmte Bedingungen, die erfüllt werden müssen. Werden diese verletzt, indem z.B. ein mehrfacher Wert in ein UNIQUE-Feld eingetragen oder bei einem FOREIGN KEY ein Eltern-Eintrag gelöscht wird, obwohl noch ein Kind-Eintrag dazu existiert, oder wenn eine UNIQUE-Bedingung verletzt wird, so wird ein Fehler ausgelöst und das Kommando wird nicht ausgeführt.

4.4.8 INDEX

In einer Tabelle kann ein Index auf ein oder mehrere Felder definiert werden. Die Contraints werden im Wesentlichen durch Indexe realisiert.

Außerdem kann ein Index das Suchen in einer großen Tabelle sehr beschleunigen.

Außerdem werden die Contraints durch Indexe realisiert. Allerdings fällt damit auch ein nicht unerheblicher Aufwand beim Einfügen, Ändern und Löschen von

(32)

Seite 32 von 98 Datensätzen an. Daher werden bei großen Tabellen teilweise die Indexe gelöscht, wenn solche Operationen durchgeführt werden, die dann auf verkehrsarme Zeiten gelegt werden müssen.

Indexe werden meist im Speicher gehalten, während die Datensätze selber eher auf Hintergrundspeichern gehalten werden. Damit kann die Zugriffshäufigkeit zum Hintergrundspeicher dramatisch reduziert werden. Ein Index kann z.B. als B*-Baum oder auch als Hash-Baum realisiert sein.

4.5 DDL-Befehle (Data Definition Language)

In DDL-Kommandos werden Tabellen und Felder definiert, verändert oder gelöscht.

4.5.1 CREATE TABLE

Tabellen können dediziert definiert oder eine Definition einfach kopiert werden.

Beispiel

CREATE TABLE person (

id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL DEFAULT “LEER” UNIQUE, PRIMARY KEY (id)

)

Ein jedes Feld braucht einen Namen, der für diese Tabelle eindeutig ist.

Ein jedes Feld braucht einen Typen. Diese sind weiter oben unter den Datentypen (siehe 4.4) aufgelistet.

Die Einträge der einzelnen Felder werden durch Kommas getrennt. Contraints (siehe 4.4.7) werden ebenfalls von den vorher erfolgten Felddefinitionen durch Komma abgetrennt.

CREATE TABLE new_table LIKE original_table. Hier wird eine neue Tabelle new_table mit den Attributen der existierenden Tabelle new_table erzeugt.

CREATE TABLE new_tbl SELECT * FROM original_tbl kopiert eine existierende Tabelle namens new_table. Allerdings werden nicht alle Attribute übernommen.

CREATE [IF NOT EXISTS] <table-Name> (….)

Hier kann abgefragt werden, ob die Tabelle schon existiert und sie wird nur dann kreiert, wenn dies nicht der Fall ist.

(33)

Seite 33 von 98 Alle Eigenschaften eines einzelnen Feldes werden durch Leerzeichen getrennt. Es beginnt mit dem Namen und dem Typ des Feldes. Zusätzlich können noch weitere Optionen angeben werden, weiter unten ist eine Auswahl aufgelistet. Diese

Eigenschaften können beim Kreieren, aber auch beim Modifizieren angelegt oder verändert werden.

4.5.1.1 Übung: Mittels phpMyAdmin soll folgende Tabellen erzeugt werden Tabelle Mitarbeiter

Name PersID Müller 1

Schmitz 2 Meier 3 Schulze 4 Schmitt 5 Bauer 6 Küfer 7 Schmied 8 Meyer 9

Dazu wird eine Datenbank mit dem Namen erstedatenbank angelegt und in dieser soll dann die Tabelle Mitarbeiter erzeugt werden.

Name soll vom Typ VarChar(20) und PersID vom Typ Int sein und die Eigenschaft Auto_Increment und Primary besitzen.

4.5.1.2 Temporäre Tabellen erzeugen

Eine Anwendung eines DDL-Befehls könnte sein, dass eine temporäre Tabelle erzeugt wird. Temporäre Tabellen können immer nur von der aktuellen Sitzung gesehen werden. Sie werden im Speicher gehalten und sind sehr schnell. Nachteile sind ihre Flüchtigkeit bei einem Rechner-Absturz und dass sie in einer Query nur einmal referenziert werden können. Dies bedeutet, dass damit keine komplexen Abfragen unterstützen werden. Es ist nicht notwendig eine temporäre Tabelle zu löschen, da sie bei Beendigung des Skripts automatisch gelöscht wird, es kann aber sinnvoll sein, falls bei einem großen Skript Speicherplatz gespart werden muss.

(34)

Seite 34 von 98 Ein Beispiel zeigt die Erzeugung einer Tabelle um Informationen über Tabellen und deren Spalten zu speichern:

CREATE TABLE [TEMORARY] TABLE [IF NOT EXISTS] table-Name (…..)

4.5.2 CREATE VIEW

Eine View kann als virtuelle Tabelle betrachtet werden. Diese kann aus einer bestimmten Anzahl von Feldern von einer oder mehrere Tabellen bestehen, die wiederum durch SELECT-Statements verbunden sind.

Beispiel:

CREATE VIEW qrySachbearbeiter AS SELECT select m_nr, pr_nr, einst_dat FROM arbeiten WHERE aufgabe = 'Sachbearbeiter‘

Views können nützlich sein, um eine einmal erstelle Abfrage für eine spätere Verwendung zu sichern.

Mit Views können auch komplexe Abfragen für nicht so erfahrene Benutzer zur Verfügung gestellt werden.

Mit Views kann es einen Zugriff auf Tabellen oder Abfragen geben, der auf bestimmte Bereiche beschränkt ist.

Views können gleich bleiben, auch wenn die zugrunde liegenden Tabellen geändert werden.

4.5.3 ALTER TABLE

Mit ALTER TABLE kann jede Eigenschaft einer Tabelle und ihrer Spalten geändert werden.

ALTER TABLE table-name <Änderung-1>, <Änderung-2>,….

ALTER TABLE table-name Alter COLUMN <Änderung-1>, <Änderung- 2>,….

Mit dem Alter Table Befehl können auch Indexe, Contraints und andere Tabelleneigenschaften verändert, eingefügt und gelöscht werden.

In der Tabelle Mitarbeiter soll ein weiteres Feld eingefügt werden: AbtID, welches vom Typ Int sein soll.

ALTER TABLE `mitarbeiter` ADD `AbtID` INT(4) NOT NULL AFTER `PersID`;

(35)

Seite 35 von 98 In einem späteren Abschnitt wird diesem Feld eine Foregin-Key-Eingeschaft gegeben.

Das wäre aber bereits mit diesem Befehl schon möglich gewesen.

4.5.4 DROP TABLE

Eine Tabelle kann mittels des Befehls DROP TABLE <table-name> gelöscht werden.

(36)

Seite 36 von 98 4.6 DML-Befehle (Data Manipulation Language)

In DML-Befehlen werden Datensätze eingefügt, verändert, gelöscht oder selektiert.

4.6.1 INSERT

Damit der Inhalt von Tabellen abgefragt werden können, müssen sie erst einmal in eine Tabelle eingefügt werden. Es gibt zwei Formen dieses Befehls.

INSERT INTO table-name (column-name 1, column -name 2, ..) VALUES (Wert 1, Wert 2,…)

In diesem Fall sind die Werte explizit im Befehl vorhanden.

Beispiel ist DB_land-fill.sql

In der anderen Form können Daten eingefügt werden, die mittels eines SELECTs gewonnen wurden. Dann entfällt das Key-Wort VALUES.

INSERT INTO table-name-desc (column-name 1, column -name 2, ..) SELECT column-name 1, column -name 2, .. FROM table-name-source …..

Wenn ein Datensatz durch das INSERT INTO Kommando eingefügt werden soll und das Feld in der Feldliste auftaucht, aber kein Wert angegeben werden soll, so muss der Ausdruck NULL bei den Values erfolgen (siehe 4.6.4.4.5).

4.6.1.1 Übung: Mittels phpMyAdmin soll die vorher erzeugte Tabelle Mitarbeiter und später abteilung gefüllt werden

Name PersID Müller 1

Schmitz 2 Meier 3 Schulze 4 Schmitt 5 Bauer 6 Küfer 7 Schmied 8 Meyer 9

Hier werden die ersten beiden Einträge eingegeben:

Referenzen

ÄHNLICHE DOKUMENTE

Genauso wie f¨ ur eine Fl¨ ache kann man auch die Schwerpunktskoordinaten eines K¨ orpers berechnen. Wir tun das f¨ ur einen Drehk¨ orper, der durch Rotation des Fl¨ achenst¨

- Bei einer Berechnung (rechte Seite der Zuweisung) mit verschiedenen Datentypen findet eine automatische Typumwandlung an den stärkeren Typen statt.. - Dabei gilt folgende

[r]

[r]

UE zu Übersetzerbau Codeerzeugung - Item 1. MicroJava

MicroJava VM:

2. Hier sollte man sich ¨ uberlegen, wann zwei Funktionen als gleich angesehen werden k¨onnen. Es ist jedoch oft zweckm¨aßig, als Argumente auch Teilmengen des

mit dem auf einen bestimmten Speicherbereich zugegriffen werden kann (primitive Datentypen: Speicher wird reserviert, z.B. Der Datentyp