=====Webdatenbanken=====
Damit in Datenbanken vorgehaltene Informationen für einen normalen Anwender zugänglich werden, benötigt man immer eine Anwendungslogik und eine Präsentationsschicht. Die Präsentationsschicht ist die Webseite, über die mit dem Anwender interagiert wird. In der Anwendungslogik werden Probleme gelöst und es wird entschieden, welche Daten gezeigt oder manipuliert werden.
===== Voraussetzungen =====
==== Datenbankserver ====
Zur Bereitstellung der Datenbanken kommen spezielle Datenbankserver zum Einsatz, die meist mehrere Benutzer und Datenbanken verwalten können. Für uns bedeutend ist der relationale Open-Source-Datenbankserver [[http://dev.mysql.com/ |MySQL]].
Unser Datenbankserver ist erreichbar über http://luo-darmstadt.de/phpMyAdmin.
Jede Projektgruppe erhält auf diesem Datenbankserver eine eigene Datenbank und ein
eigenes Konto.
Für den Zugriff auf den Server benutzen wir phpMyAdmin. Nach der Anmeldung
kann man in seiner Datenbank Tabellen anlegen und mit Daten füllen.
{{mysql.png}}
==== Anwendungslogik ====
Um eine Anwendungslogik bereitzustellen, benötigen wir eine Programmiersprache. Im Zusammenhang mit MySQL wird oft die Skriptsprache PHP verwendet, da sie einfach zu erlernen und weit verbreitet ist.
Einen Einstieg in PHP bietet das [[http://de2.php.net/manual/de/ |Handbuch auf PHP.net]].
Die PHP-Skripte werden auf dem Server ausgeführt und müssen deshalb auch dort vorhanden sein. Zum Übertragen der
Skripte setzen wir das [[http://de.wikipedia.org/wiki/SSH_File_Transfer_Protocol |SFTP-Protokoll]] ein, ein sicheres FTP-Protokoll. Mit dem Programm [[http://de.wikipedia.org/wiki/WinSCP| WinSCP]] kann man eine Verbindung zum Schulserver herstellen.
{{winscp.png}}
Nach erfolgreicher Anmeldung kann man seine PHP-Skripte in den Webbereich des Schulservers hochladen.
{{winscp2.png}}
==== Präsentationsschicht ====
Zur Präsentation kommt für das Web die Auszeichnungssprache HTML zum Einsatz. Damit die einzelnen Seiten auch dynamisch verändert werden können, wie wir dies bei Datenbanken benötigen, erweitert man die statischen HTML-Seiten um dynamische Passagen in PHP.
==== Webserver ====
Damit der Anwender über das Web auf unsere Präsentationsschicht zugreifen kann, benötigt man einen Webserver. Dieser Webserver sorgt speziell dafür, dass die PHP-Skripte, also Anwendungslogik und dynamischen HTML-Seiten abgearbeitet werden und das Ergebnis die Ausgabe wieder an den Anwender übertragen wird.
Der Zugriff auf die dynamischen Webseiten erfolgt über die Adresse
http://www.luo-darmstadt.de/users/~//.php
Im Beispiel haben wir die Adresse
http://www.luo-darmstadt.de/users/~inflk2009/loesung/eintrag_verfassen.php
{{webserver.png}}
==== XAMPP ====
Eine fertige Kombination aus Datenbankserver und Webserver mit einem bereits konfigurierten PHP-Modul bezeichnet man als LAMPP (Linux Apache MySQL PHP Perl) oder WAMPP (Windows Apache MySQL PHP Perl). Apache steht für den "Apache HTTPD", ein Webserver der [[http://www.apache.org| Apache Software Foundation]] und Perl für eine weitere verfügbare Skriptsprache, auf die an dieser Stelle nicht weiter eingegangen werden soll.
Diese Kombinationen bietet das [[http://www.apachefriends.org| XAMPP-Projekt]] zum Download an.
==== Editor ====
Zum Bearbeiten von PHP-Dateien empfiehlt sich ein Editor der Syntaxhighlighting unterstützt. Ein guter, kostenloser Editor ist bspw. [[http://notepad-plus.sourceforge.net/de/site.htm |Notepad++]]. Zur fortgeschrittenen Nutzung und besonders für große Projekte existieren auch die Eclipse-basierenden [[http://www.eclipse.org/pdt/ |PHP Development Tools]].
===== PHP =====
PHP ähnelt von seiner Syntax her der Programmiersprache C, an die sich auch Java anlehnt. PHP ist jedoch im Gegensatz zu Java noch sehr stark prozedural und weniger objektorientiert ausgelegt. Zum Konzept gehört außerdem eine schwache, dynamische und implizite Typisierung von Variablen.
Ein Vergleich zwischen der einfachen Ausgabe einer Multiplikation und der Länge eines Strings verdeutlicht diese beiden Aspekte.
==== Beispiel: Typisierung von Variablen ====
**PHP**
**Java **
public class Beispiel {
public static void main(String[] args) {
int a, c;
String b;
a = 2;
b = "2";
c = a * Integer.parseInt(b); // ein Vorgehen wie bei PHP würde zu einer Exception führen
String d;
d = "Hallo Welt";
System.out.println(d.length);
// gibt die Länge eines Strings aus, dazu wird auf die Eigenschaft
// length des String-Objekts zurückgegriffen
}
}
==== Funktionen in PHP ====
Funktionen in PHP und in Java sind sich sehr ähnlich. Anders als in Java müssen wir in PHP allerdings keinen Rückgabewert definieren. Zudem steht vor dem Funktionsnamen in PHP immer "function".
**Java**
int xy() {
return 1;
}
**PHP**
function xy(){
return 1;
}
==== Zugriff auf Variablen innerhalb von Funktionen ====
Wenn man in PHP eine neue Variable einführt und daraufhin in einer Funktion auf diese zugreifen möchte, so kann das häufig zu Problemen führen.
Schuld daran ist, dass die Funktion diese Variable nicht "kennt", man muss sie ihr erst bekannt machen indem man sie mit **global $meineVariable;** der Funktion bekannt macht. Ausgenommen davon sind "superglobale" Variablen wie zB. $_POST und $_GET.
$meinString = "hallo";
echoMeinString();
function echoMeinString() {
global $meinString;
echo "Das ist meinString: ".$meinString;
}
==== Zugriff auf GET/POST ====
Einer der wichtigsten Aspekte einer dynamischen Webseite ist die Interaktion mit dem Anwender. Die einzige Möglichkeit des Anwenders Informationen an das PHP-Skript zu übermitteln, besteht in den HTTP-Request-Methoden GET und POST. Bei beiden Methoden können mehrere Schlüssel-Wertpaare an den Webserver übertragen werden, die dann aus dem PHP-Skript abrufbar sind. Bei GET werden die Daten in der URL (http://www.luo-darmstadt.de?schlüssel=wert&schlüssel2=wert), bei POST in den Header-Informationen, also für den Anwender unsichtbar, transportiert. Die POST-Methode ist aus HTML-Dokumenten nur über Formulare nutzbar.
Der Zugriff in PHP erfolgt über die globalen Variablen $_GET und $_POST, welche ein assoziatives Array darstellen. Auf den Wert des Schlüssels "name" greifen wir beispielsweise über den Ausdruck $_GET["name"], wenn dieser per GET übermittelt wurde, zu.
==== Beispiel: Umgang mit einem GET-Parameter ====
Hier ein Beispiel, wie man per GET übertragene Daten auswerten kann:
";
echo "Ihr Name hat " . strlen($besucherName) . " Buchstaben.";
}
?>
==== $_POST ====
Das selbe Beispiel kann man auch für die POST Methode verwenden. Hierzu muss man nur die erste Zeile des obigen Codes folgendermaßen umändern:
$besucherName = $_POST["Name"];
...
====$_REQUEST ====
Weiß man nicht, ob die gesendeten Daten über GET oder POST verfügbar sind, so kann man auch $_REQUEST benutzen was die Daten aus beiden Methoden enthält.
$besucherName = $_REQUEST["Name"];
...
==== Fehlersuche ====
Für die Fehlersuche kann man die Ausgabeanweisung //echo// benutzen. Beispiele:
echo $Anzahl; // gibt den Wert der Variablen $Anzahl aus.
echo "Anzahl: " . $Anzahl; // beschriftet die Ausgabe der Anzahl
Detailliertere Informationen zu einer Variablen erhält man mit //var_dump()//.
var_dump($Anzahl);
Die Variablen $_GET, $_POST, $_REQUEST, usw. sind Felder (arrays), deren Inhalt man sich auch mit //print_r()// ausgeben lassen kann. Beispiel:
print_r($_GET);
==== Zugriff auf eine MySQL-Datenbank ====
PHP stellt derzeit drei Schnittstellen zum Zugriff auf MySQL/MariaDB-Datenbanken bereit:
- mysql - eine veraltete prozedurale Schnittstelle, nicht mehr in PHP 7 vorhanden
- mysqli - eine objektorientierte Schnittstelle ab PHP 5.0
- PDO_MySQL - eine streng objektorientierte Schnittstelle ab PHP 5.1
Der MySQL-Datenbankserver pflegt eine eigene Benutzer- und Rechteverwaltung. Wir müssen uns also zunächst verbinden und authentifizieren. Dazu erzeugen wir ein Objekt der mysqli-Klasse, dessen Konstruktor wir den Datenbankserver, den Benutzernamen, das Passwort und die Datenbank als Parameter übergeben:
$mysqli = @new mysqli($Datenbankserver, $Benutzer, $Passwort, $Datenbank);
Über das $mysqli-Objekt können wir jetzt SQL Abfragen durchführen.
$result = $mysqli->query("SELECT * FROM gaestebuch");
while ($entry = mysql_fetch_assoc($result)) {
echo "Eintrag von " . $entry["absendername"];
}
===== Aufgaben =====
Ziel der u.g. Aufgaben ist ein sehr einfaches Gästebuch auf PHP-Basis mit Nutzung einer MySQL-Datenbank zum Speichern der Einträge.
**Aufgabe 1**\\
Nachdem der Benutzer das Formular abgeschickt hat, soll überprüft werden, ob er alle Formularfelder auch ausgefüllt hat. Ist dies der Fall, werden ihm seine Eingaben zur Bestätigung ausgegeben. Andernfalls bekommt er eine Fehlermeldung angezeigt.
Folgende Informationen könnten hierfür nützlich sein:
* [[http://www.php.net/manual/de/reserved.variables.post.php |$_POST]]
* [[http://www.php.net/manual/de/language.basic-syntax.phpmode.php |Den HTML-Bereich der Datei verlassen]]
* [[http://de2.php.net/empty |empty()-Funktion]]
* [[http://www.php.net/manual/de/control-structures.if.php |if-Anweisung]]
**Aufgabe 2**\\
Bestehende Einträge anzuzeigen ist eine der Hauptaufgaben eines Gästebuchs. Die Einträge sollen nun auf der Startseite aufgelistet werden. Wir verzichten hierbei darauf, die Einträge auf mehrere Seiten zu verteilen, alle Einträge sollen auf einer einzelnen Seite gezeigt werden. (eintraege.php)