Wir werden hier zusammen ein kleines Bewertungssystem schreiben.
 | Was Du brauchst: |
Um das hier wirklich zu verstehen, solltet ihr grundsätzlich schon mal mit Datenbanken gearbeitet haben, sprich wissen, wie man Daten in eine Datenbank speichert, sie ausliest u.s.w. Schaut euch dazu einfach mal bei den Tutorials zu MySQL um. Außerdem solltet ihr zumindest die Syntax und das Grundprinzip von PHP verstanden haben und die Grundbefehle kennen! Dieses Tutorial ist also nicht für Anfänger geeignet!
Wichtig ist, dass ihr natürlich erstmal etwas braucht, was ihr bewerten lassen wollt! Das können Grafiken, Texte oder sonst was sein, sucht euch einfach etwas aus. Vorteilhaft dabei ist natürlich, wenn der Inhalt, den ihr bewerten lassen wollt schon aus einer Datenbank kommt. Ich werde hier beispielhaft zeigen, wie man Texte, die aus einer Datenbank kommen bewerten lassen kann. Das Beispiel dient nur als Platzhalter und kann beliebig ausgetauscht werden. Wichtig ist nur, dass jedes eurer zu bewertenden Dinge eine eindeutige ID hat (eindeutig bedeutet, dass jede ID auch nur EINMAL verwendet wird).
Ein weiterer wichtiger Punkt ist Spam. Schließlich wollen wir nicht, dass jemand 10000 mal dasselbe bewertet. Wir brauchen also etwas, was den User daran hindert mehrfach zu bewerten. Hier gibt es verschiedene Möglichkeiten. Unser Script muss den User irgendwie identifizieren, die drei bekanntesten Mittel, die einem PHP dazu zur Verfügung stellt sind Sessions, Cookies und die Speicherung der IP-Adresse.
Mit Sessions können wir nur verhindern, dass der User bei
einem Besuch nicht mehrmals bewerten kann. Schließt er den Browser und geht wieder auf die Seite, ist seine Session verloren, also können wir nicht mehr überprüfen, ob er schon bewertet hat.
Cookies werden auf dem PC des Users gespeichert und dadurch haben wir auch Zugriff auf die Information, ob er schon bewertet hat, nachdem er den Browser geschlossen und die Website dann nochmal besucht hat. Allerdings kann man mit einem kurzen Klick Cookies und damit auch unsere Information löschen.
Da Sessions von PHP auch mithilfe von Cookies erzeugt werden, kann man Sessions und Cookies sehr leicht umgehen, indem man Cookies einfach im Browser deaktiviert.
Die letzte Möglichkeit ist nun, die IP-Adresse des Users zu speichern. Auch hier gibt es das Problem, dass die IP-Adresse wechseln kann, je nach Internetanschluss etc. Trotzdem ist die Speicherung der IP-Adresse immernoch die sinnvollste Methode für uns.
Außerdem müssen wir uns darüber Gedanken machen, wie wir die Punktzahl berechnen! Die einfachste Methode ist, alle vergebenen Punkte zu addieren und sie anschließend durch die abgegebenen Stimmen zu teilen. Das würde die durchschnittlich vergebene Punktzahl ergeben. Zum reinen Texte bewerten reicht das auf jeden Fall aus. Deswegen verwenden wir auch diese Methode.
Diese Rechnung berücksichtigt aber nicht, dass ein Text, der einmal mit 5 Punkten bewertet wurde "besser" erscheint, als ein Text der vielleicht nur 4 Punkte im Durchschnitt hat, aber schon sehr viel öfter bewertet wurde! Um das zu berücksichtigen müsste man nun berechnen wieviele Stimmen durchschnittlich abgegeben wurden und wieviel dann im Verhältnis diese 5 Punkte wert sind. Darauf will ich aber gar nicht näher eingehen, wer das genau wissen will, darf sich hier informieren:
Bayes'sche Bewertung und anschließend dieses Script ein wenig umschreiben ;).
Nun müssen wir uns überlegen, was wir alles für unser Bewertungssystem speichern müssen: Da wären natürlich die Punktzahl und die Stimmen, außerdem die IP-Adresse für unseren Spamschutz und wir brauchen noch eine Verbindung zu den Texten, also welche Bewertung gehört zu welchem Text? Wir ordnen also jeder unserer Bewertungen noch eine ID zu. Unsere MySQL-Tabelle hat nun also 4 Spalten: id, punkte, stimmen, ip.
Unsere Spalte IP erzeugt hier allerdings einen kleinen Konflikt: Wir müssen in einer Spalte mehrere Informationen speichern, laut den Normalformen (
Normalisierung) sollte dies nicht passieren, uns bleibt aber nichts anderes übrig, wir müssen aber später daran denken, dass wir die einzelnen IPs irgendwie auseinanderhalten müssen.
Wir fangen am besten damit an schon mal unsere Tabelle anzulegen. Geht also in euer PHPMyAdmin und erstellt eine neue Tabelle (falls ihr noch keine Datenbank angelegt hattet müsst ihr das natürlich vorher machen). Ich nenne meine Tabelle bewertung.
Wir legen nun unsere 4 Felder an. Das erste ist id; ihr könntet als ids Namen, oder Zahlen verwenden ich verwende Zahlen, deshalb stelle ich als Typ INT ein. Auto-Increment (automatisch fortlaufend nummerieren) benutzen wir in diesem Fall nicht, da die ids identisch mit den ids der Texte sein sollen und die Datensätze erst erzeugt werden, falls ein Text bewertet wird. Allerdings verwenden wir die id als Primärschlüssel.
Auch die Felder punkte und bewertung sollen vom Datentyp INT sein. Bei dem Feld ip legen wir als Datentyp Longtext fest, damit auch schön viele IP's gespeichert werden können.
Wer nun ein kleines Fragezeichen in seinem Kopf hat, weil er noch nie eine Tabelle in PHPMyAdmin eingestellt hat, sollte sich dieses Tutorial durchlesen:
Eine Tabelle erstellen.
Wir starten mit dem PHP-Code. Zunächst brauchen wir eine Funktion, die die Daten aus der Datenbank ausliest und grafisch darstellt und natürlich deren Aufruf. Wir fangen mit dem Aufruf an. In meinem Beispiel werden Texte aus einer Datenbank gelesen. Jeder Text hat eine eindeutige id.
<?PHP
/* MySQL-Abfrage: Wähle alle Texte aus der Datenbank aus */
$abf = "SELECT * FROM texte";
$empf = mysql_query($abf) or die(mysql_error());
/* Ausgabe der Datensätze aus der Datenbank, der Wert jeden Feldes ist
in dem Array $row gespeichert. */
while ($row = mysql_fetch_assoc($empf)) {
/* Gibt den gespeicherten Text aus, diese Ausgabe ist natürlich nur
beispielhaft und muss von euch individuell angepasst werden! */
echo $row['text']."<br/><br/>";
/* Aufruf der Funktion bewertung, die die bisherige Bewertung aus
der Datenbank liest und ausgibt, als Parameter wird die id des Textes
übergeben, damit später die Bewertung des jeweiligen Textes angezeigt
wird */
echo bewertung($row['id']);
}
?>
Dieser Code ist nur beispielhaft um zu zeigen, wie die Funktion bewertung aufgerufen werden soll! Ihr müsst den Code an euer Projekt natürlich anpassen. Wichtig ist, dass an der Stelle, an der die Bewertungsfunktion ausgegeben wird, die Funktion bewertung aufgerufen wird und dass die id des zu bewertenden mit übergeben wird!
Nun folgt die Funktion bewertung. Sie holt die Informationen der Bewertung zu dem Text aus der Datenbank und stellt sie grafisch dar.
<?php
function bewertung($id) {
/* hier legt ihr die Breite eures einzelnen Bewertungssternchens
fest (in px) */
$sternenbreite = 14;
/* hier wird die Bewertung des im Parameter $id übergebenen Textes
geholt */
$abf = "SELECT * FROM bewertung WHERE id='".$id."'";
$empf = mysql_query($abf);
/* im Array $row stehen uns nun die Daten der einzelnen Spalten zur
Verfügung */
$row = mysql_fetch_assoc($empf);
/* die Funktion mysql_affected_rows zählt die Zeilen aus der Tabelle
bewertung, die unserer Abfrage entsprechen, also die Zeile, die als id
die Zahl enthält, die im Parameter $id übergeben wurde, da dies
höchstens 1 sein darf, steht in der Variable $num nun 0 oder 1 */
$num = mysql_affected_rows();
/* Falls zu unserem Text also eine Bewertung gefunden wurde, wird in
der Variable $rechnung die Bewertung gespeichert (Punkte durch Stimmen
= durchschnittliche Punktzahl). Diese Zahl wird mit der Breite unserer
Grafik multipliziert, um zu berechnen wie breit die Div-Box mit den
erhaltenen Sternchen sein muss */
if ($num > 0) {
$rechnung = $row['punkte']/$row['stimmen']*$sternenbreite;
}
/* Falls es noch keine Bewertung gab, ist $rechnung = 0, keine
Bewertung = 0 Punkte */
else {
$rechnung = 0;
}
/* Nun wird in der Variablen $bewertung die Ausgabe der Bewertung in
Sternchen-Form ausgegeben. */
$bewertung = "<div class=\"bewertung\">\n
<div class=\"bewertet\"
style=\"width:".$rechnung."px;\">\n
<div class=\"bewerten\">\n";
/* Falls der aktuelle User den Text noch nicht bewertet hat, werden
Links zur Bewertung erzeugt */
if(!ereg($_SERVER['REMOTE_ADDR'],$row['ip'])) {
/* Da es fünf Punkte als maximale Punktzahl gibt, werden 5 Links
generiert, soll es 10 punkte geben, muss die 6 in 11 geändert werden
u.s.w. */
for($i=1;$i<6;$i++) {
/* Darstellung des Links wird erstellt. Linkadresse zur
Bewertung wird erstellt */
$bewertung.= "<a href=\"index.php?";
$bewertung.= "rating=".$i."&rid=".$id."\" target=\"_self\"
class=\"vote".$i."\"></a>";
}
}
/* Darstellung der Bewertung beenden */
$bewertung .= "</div>\n
</div>\n
</div>\n";
/* Die Bewertung zurückgeben an Funktionsaufruf */
return $bewertung;
}
?>
Wir machen also eine SQL-Abfrage mit der wir die Bewertungsdaten des Textes herausfinden.
Damit wir keinen Fehler angezeigt bekommen, müssen wir, bevor die durchschnittliche Punktzahl berechnet wird, schauen, ob es überhaupt schon eine Bewertung des Textes gab. Wenn nicht hätte das zufolge, dass wir 0 durch 0 teilen und das erzeugt einen Fehler, deshalb müssen wir hier diese Überprüfung machen.
Mit der Funktion ereg("Zeichen nach denen gesucht wird", "Text in dem danach gesucht werden soll") durchsuchen wir die bisher eingetragenen IPs, die den Text schon bewertet haben, nach der IP des aktuellen Users ($_SERVER['REMOTE_ADDR']). Falls diese nicht gefunden wird, werden Links zur Bewertung erzeugt.
Wozu jetzt genau die Divs sind, die hier erstellt werden, erkläre ich später nochmal genau, dabei geht es nur ums Aussehen unseres Bewertungssystems. Wichtiger ist die Generierung der Links. In diesem Fall 5 Stück. Für jede Punktzahl, die vergeben werden kann, einen. Wenn wir auf einen dieser Links klicken, soll die Bewertung des Textes nämlich gespeichert werden. Statt index.php tragt ihr hier also eure Datei ein, in der der Text ausgegeben und eure Funktion aufgerufen wurde!
In den Links übergeben wir auch noch zwei andere Informationen, die id des Textes bzw. der Bewertung und die Punktzahl, die der User vergeben möchte. Die id wird durch die GET-Variable rid und die Punktzahl durch rating übertragen. (GET-Variablen werden als Parameter über die URL übergeben).´
Was jetzt noch benötigt wird, ist der PHP-Code mit dem die Bewertung gespeichert wird.
<?PHP
/* Falls auf einen Bewertungslink geklickt wurde */
if(isset($_GET['rating']) AND $_GET['rid'] == $row['id']) {
$rid = $_GET['rid'];
/* GET-Variablen überprüfen */
/* Überprüfen, ob übergebene punktzahl auch wirklich Zahl ist */
if(is_numeric($_GET['rating'])) {
$rating = $_GET['rating'];
}
/* übergebene Punktzahl überprüfen, falls mehr als 5 Punkte
übergeben wurden, wird die Punktzahl auf 5 gesetzt, falls weniger als
1 übergeben wurde, wird die Punktzahl auf 1 gesetzt */
if($rating > 5) {
$rating = 5;
}
if($rating < 1) {
$rating = 1;
}
/* Überprüfung der bisherigen Bewertungsdaten */
/* Bewertungsdaten des entsprechenden Textes holen */
$abfpruef = "SELECT * FROM bewertung WHERE id='".$rid."'";
$empfpruef = mysql_query($abfpruef) or die(mysql_error());
$info = mysql_fetch_assoc($empfpruef);
$num = mysql_affected_rows();
/* Falls Text schon geratet */
if ($num > 0) {
/* Falls User Text noch nicht bewertet hat */
if(!ereg($_SERVER['REMOTE_ADDR'],$info['ip'])) {
/* Stimmen um eins erhöhen */
$stimmen = $info['stimmen']+1;
/* Punkte zu bisherigen Punkten addieren */
$punkte = $info['punkte']+$rating;
/* Neue Daten und ip des Users in DB eintragen */
$abfupdate = "UPDATE bewertung SET stimmen='".$stimmen."',
punkte='".$punkte."', ip='".$info['ip']."|".$_SERVER['REMOTE_ADDR']."'
WHERE id ='".$rid."'";
$empfupdate = mysql_query($abfupdate) or die(mysql_error());
}
}
/* Falls Text noch nie geratet */
else {
/* neuen Eintarg in DB erstellen. Mit der id des Textes als id, 1
Stimme, Punktzahl als Punkte und IP-Adresse des Users. */
$abfinsert = "INSERT INTO bewertung (id, punkte, stimmen, ip)
VALUES ('".$rid."','".$rating."','1','".$_SERVER['REMOTE_ADDR']."')";
$empfinsert = mysql_query($abfinsert) or die(mysql_error());
}
}
?>
Als erstes werten wir die übergebenen GET-Variablen aus. Es ist wichtig, zu überprüfen, ob das übergebene auch tatsächlich ein Zahl ist, ansonsten könnte jemand unerwünschten Code einschleusen. Anschließend überprüfen wir, ob die Punktzahl zwischen 1 und 5 liegt. Ansonsten könnte jemand einem Text 100000000 Punkte, oder eben -1000000000 Punkte geben und das wollen wir schließlich verhindern!
Anschließend wird überprüft, ob der Text schon mal bewertet wurde, wenn ja, wird geschaut, ob der User mit dieser IP schon einmal abgestimmt hat, falls nicht, wird die Stimm- und Punktzahl entsprechend erhöht. Mit der Abfrage anschließend, werden die neuen Daten in der Datenbank gespeichert.
Bei ip speichern wir das, was bisher auch in der Spalte stand und hängen die IP des aktuellen Users dran, trennen beides aber mit einem | voneinander, damit die einzelnen IPs noch unterscheidbar sind.
Falls der Text noch nicht bewertet wurde, werden die Daten ebenfalls in die Datenbank eingetragen, mit der Stimmzahl 1 und der Punktzahl.
So sieht nun unser gesamtes PHP-Script aus:
<?PHP
function bewertung($id) {
/* hier legt ihr die Breite eures einzelnen Bewertungssternchens
fest (in px) */
$sternenbreite = 14;
/* hier wird die Bewertung des im Parameter $id übergebenen Textes
geholt */
$abf = "SELECT * FROM bewertung WHERE id='".$id."'";
$empf = mysql_query($abf);
/* im Array $row stehen uns nun die Daten der einzelnen Spalten zur
Verfügung */
$row = mysql_fetch_assoc($empf);
/* die Funktion mysql_affected_rows zählt die Zeilen aus der Tabelle
bewertung, die unserer Abfrage entsprechen, also die Zeile, die als id
die Zahl enthält, die im Parameter $id übergeben wurde, da dies
höchstens 1 sein darf, steht in der Variable $num nun 0 oder 1 */
$num = mysql_affected_rows();
/* Falls zu unserem Text also eine Bewertung gefunden wurde, wird in
der Variable $rechnung die Bewertung gespeichert (Punkte durch Stimmen
= durchschnittliche Punktzahl). Diese Zahl wird mit der Breite unserer
Grafik multipliziert, um zu berechnen wie breit die Div-Box mit den
erhaltenen Sternchen sein muss */
if ($num > 0) {
$rechnung = $row['punkte']/$row['stimmen']*$sternenbreite;
}
/* Falls es noch keine Bewertung gab, ist $rechnung = 0, keine
Bewertung = 0 Punkte */
else {
$rechnung = 0;
}
/* Nun wird in der Variablen $bewertung die Ausgabe der Bewertung in
Sternchen-Form ausgegeben. */
$bewertung = "<div class=\"bewertung\">\n
<div class=\"bewertet\"
style=\"width:".$rechnung."px;\">\n
<div class=\"bewerten\">\n";
/* Falls der aktuelle User den Text noch nicht bewertet hat, werden
Links zur Bewertung erzeugt */
if(!ereg($_SERVER['REMOTE_ADDR'],$row['ip'])) {
/* Da es fünf Punkte als maximale Punktzahl gibt, werden 5 Links
generiert, soll es 10 punkte geben, muss die 6 in 11 geändert werden
u.s.w. */
for($i=1;$i<6;$i++) {
/* Darstellung des Links wird erstellt. Linkadresse zur
Bewertung wird erstellt */
$bewertung.= "<a href=\"index.php?";
$bewertung.= "rating=".$i."&rid=".$id."\" target=\"_self\"
class=\"vote".$i."\"></a>";
}
}
/* Darstellung der Bewertung beenden */
$bewertung .= "</div>\n
</div>\n
</div>\n";
/* Die Bewertung zurückgeben an Funktionsaufruf */
return $bewertung;
}
/* MySQL-Abfrage: Wähle alle Texte aus der Datenbank aus */
$abf = "SELECT * FROM texte";
$empf = mysql_query($abf) or die(mysql_error());
/* Ausgabe der Datensätze aus der Datenbank, der Wert jeden Feldes ist
in dem Array $row gespeichert. */
while ($row = mysql_fetch_assoc($empf)) {
if(isset($_GET['rating']) AND $_GET['rid'] == $row['id']) {
$rid = $_GET['rid'];
/* GET-Variablen überprüfen */
/* Überprüfen, ob übergebene punktzahl auch wirklich Zahl ist */
if(is_numeric($_GET['rating'])) {
$rating = $_GET['rating'];
}
/* übergebene Punktzahl überprüfen, falls mehr als 5 Punkte
übergeben wurden, wird die Punktzahl auf 5 gesetzt, falls weniger als
1 übergeben wurde, wird die Punktzahl auf 1 gesetzt */
if($rating > 5) {
$rating = 5;
}
if($rating < 1) {
$rating = 1;
}
/* Überprüfung der bisherigen Bewertungsdaten */
/* Bewertungsdaten des entsprechenden Textes holen */
$abfpruef = "SELECT * FROM bewertung WHERE id='".$rid."'";
$empfpruef = mysql_query($abfpruef) or die(mysql_error());
$info = mysql_fetch_assoc($empfpruef);
$num = mysql_affected_rows();
/* Falls Text schon geratet */
if ($num > 0) {
/* Falls User Text noch nicht bewertet hat */
if(!ereg($_SERVER['REMOTE_ADDR'],$info['ip'])) {
/* Stimmen um eins erhöhen */
$stimmen = $info['stimmen']+1;
/* Punkte zu bisherigen Punkten addieren */
$punkte = $info['punkte']+$rating;
/* Neue Daten und ip des Users in DB eintragen */
$abfupdate = "UPDATE bewertung SET stimmen='".$stimmen."',
punkte='".$punkte."', ip='".$info['ip']."|".$_SERVER['REMOTE_ADDR']."'
WHERE id ='".$rid."'";
$empfupdate = mysql_query($abfupdate) or die(mysql_error());
}
}
/* Falls Text noch nie geratet */
else {
/* neuen Eintarg in DB erstellen. Mit der id des Textes als id,
1 Stimme, Punktzahl als Punkte und IP-Adresse des Users. */
$abfinsert = "INSERT INTO bewertung (id, punkte, stimmen, ip)
VALUES ('".$rid."','".$rating."','1','".$_SERVER['REMOTE_ADDR']."')";
$empfinsert = mysql_query($abfinsert) or die(mysql_error());
}
}
/* Gibt den gespeicherten Text aus, diese Ausgabe ist natürlich nur
beispielhaft und muss von euch individuell angepasst werden! */
echo $row['text']."<br/><br/>";
/* Aufruf der Funktion bewertung, die die bisherige Bewertung aus
der Datenbank liest und ausgibt, als Parameter wird die id des Textes
übergeben, damit später die Bewertung des jeweiligen Textes angezeigt
wird */
echo bewertung($row['id']);
}
?>
Natürlich fehlt hier noch die Verbindung zur Datenbank und das Layout um den Code herum. Das Tutorial zum Datenbank verbinden gibt's hier:
Verbindung zur Datenbank
Das Layout müsst ihr natürlich selbst noch hinzufügen, allerdings fehlt noch der letzte Feinschliff für die Darstellung des Ratings. Es fehlt die CSS-Datei:
/* die Grundbox eurer Bewertungsanzeige; Sternchen-Anzeige: inaktives Sternchen */
.bewertung {
width: 70px; /* Breite eurer Grafik mal max. Punktzahl */
height: 13px; /* Höhe eurer Grafik */
background: url('sternchen.gif') left top;
position: relative;
display: block;
}
/* die bisherige Punktzahl; Sternchen-Anzeige: bekommene Sternchen */
.bewertet {
height: 13px; /* Höhe eurer Grafik */
background: url('sternchen.gif') left bottom;
line-height: 0px;
}
/* die Links zum bewerten grundsätzlich; Sternchen-Anzeige: Sternchen beim Hovern */
.bewerten a{
height: 13px; /* Höhe eurer Grafik */
width: 14px; /* Breite eurer Grafik */
display:block;
position: absolute;
left:0px;
top:0px;
}
.bewerten a:hover{
height: 13px; /* Höhe eurer Grafik */
width: 14px; /* Breite eurer Grafik */
background: url('sternchen.gif') left center;
display:block;
position: absolute;
left:0px;
top:0px;
}
/* die einzelnen Punktzahlen, die man werten kann; wenn ihr mehr Punkte vergeben lassen wollt, müsst ihr das hier entsprechend weiterführen */
a.vote1, a.vote1:link, a.vote1:active, a.vote1:hover {
width: 14px; /* Breite eurer Grafik */
z-index:5;
}
a.vote2, a.vote2:link, a.vote2:active, a.vote2:hover{
width: 28px; /* Breite eurer Grafik mal 2 */
z-index:4;
}
a.vote3,a.vote3, a.vote3:link, a.vote3:active, a.vote3:hover {
width: 42px; /* Breite eurer Grafik mal 3 */
z-index:3;
}
a.vote4,a.vote4, a.vote4:link, a.vote4:active, a.vote4:hover {
width: 56px; /* Breite eurer Grafik mal 4 */
z-index:2;
}
a.vote5,a.vote5, a.vote5:link, a.vote5:active, a.vote5:hover {
width: 70px; /* Breite eurer Grafik mal 5 */
z-index:1;
}
Das Ganze beruht auf dem Prinzip, dass Blöcke erstellt werden, deren Hintergrundgrafik je nach Zustand verschoben wird. Die Grafik sternchen.gif sieht also wie folgt aus:
Das erste Sternchen entspricht dem inaktiven Zustand bzw. die Punkte, die dem Text fehlen, das zweite dem Hover-Zustand und das dritte zeigt die schon erreichte Punktzahl an.
Die Divs sind nun so verschachtelt, dass sie sich überlagern, ganz unten liegen die inaktiven Sternchen, darauf die Sternchen, die die aktuelle Punktzahl darstellen. Je breiter dieses Div, desto höher die Punktzahl! Im PHP-Code wird die Breite dieses Divs anhand der Punktzahl berechnet.
Ganz oben drauf liegen die Links. Damit, wenn wir mit der Mouse über das dritte Sternchen fahren, Sternchen 1 und 2 auch gehighlightet sind, sind die Links nun auch wieder unterschiedlich breit und liegen übereinander. Das erste Sternchen liegt ganz oben und ist so breit, dass ein Sternchen angezeigt wird. Der Link um 2 Punkte zu verteilen, liegt darunter und ist zwei Sternchen breit, der Link um 3 Punkte zu vergeben liegt wiederum darunter und ist 3 Sterne breit u.s.w.
Das war's auch schon, unser Bewertungssystem ist fertig!
Ich hoffe, es war alles verständlich!
Jel
Wow!Sehr (!) langes Tutorial, du hast dir echt viel Mühe gegeben.
Ich werde das mal austesten, ob's funktioniert... aber noch bin ich an meinem ACP dran.
Gaaaaanz viel Respekt!
6 Blümchen! :)
Jellü <3