Umfrage auf MySQL-Basis
In diesem Tutorial erkläre ich euch, wie ihr eine einfache Umfrage auf MySQL-Basis programmieren könnt.
Wie fangen mit den MySQL-Tabellen an. Insgesamt benötigen wir drei Tabellen. Eine Tabelle für die Fragen, eine Tabelle für die Antworten und eine Tabelle für die IP-Sperre.
ALs erstes hier die Struktur für die Tabelle mit den Fragen: (Der Name der Tabelle spielt keine Rolle, da er später in der config.inc.php eingetragen wird)
Feld (Name) Typ (Datentyp) Null Extras
id INT (11) not null auto_increment, PRIMARY_KEY
frage VARCHAR (255) not null -
ergebnis INT (11) not null default '0'
Hier nocheinmal der MySQL-Befehl: (Der Tabellen-Name muss natürlich angepasst werden)
| Code: |
CREATE TABLE `fragen` ( |
Hier die Struktur für die Tabelle mit den Antworten: (Mit dem Namen gilt das gleiche wie bei der Fragen-Tabelle)
Feld (Name) Typ (Datentyp) Null Extras
id INT (11) not null auto_increment, PRIMARY_KEY
fid INT (11) not null default '0'
antwort VARCHAR (255) not null -
ergebnis INT (11) not null default '0'
Auch hier nocheinmal der MySQL-Befehl:
| Code: |
CREATE TABLE `antworten` ( |
Als letztes die Struktur für die Tabelle der IP-Sperre:
Feld (Name) Typ (Datentyp) Null Extras
ip VARCHAR (255) not null -
zeit VARCHAR (255) not null -
MySQL-Befehl:
| Code: |
CREATE TABLE `ip` ( |
Falls ihr nicht wisst, wie ihr diese Tabellen erstellen sollt, ladet euch einfach den kompletten Code des Tutorials down (den Download-Link findet ihr ganz unten im Tutorial). Nun müsst ihr die Datei config.inc.php anpassen und danach die install.php ausführen.
Nun, nachdem wir also alle MySQL-Tabellen erstellt haben, können wir mit dem Programmieren beginnen.
Zu erst einmal brauchen wir eine Konfigurations-Datei, in der alle wichtigen Daten angegeben werden. Dazu zählen zum Beispiel:
MySQL-Host, MySQL-Username, MySQL-Passwort, sowie die Namen der MySQL-Tabellen , eine weitere Variable, die wir später im Code für die IP-Sperre benötigen und eine Variable, die die Breite des Umfragen-Balkens regelt. (Sie gibt immer 100% an)
Unsere Konfigurations-Datei nennen wir config.inc.php. Der Inhalt sieht wie folgt aus:
| PHP: |
<?php
|
Wir stellen erstmal über mysql_connect(); eine Verbindung zur Datenbank her und wählen danach mit mysql_select_db(); unsere Datenbank aus.
Die 4 folgenden Variablen wurden bereits im Code beschrieben.
Nun ist die Grundlage für die Umfrage geschaffen. Als nächstes machen wir uns Gedanken über die Ausgabe. Da unsere Fragen und unsere Antworten in 2 verschiedenen MySQL-Tabellen sind, müssen wir ersteinmal alle Daten auslesen. Da wir in unserer Datei vote.php immer die aktuellste Umfrage angezeigt haben wollen, führen wir den folgenden MySQL-Befehl aus:
| Code: |
SELECT * FROM `".$ftable."` ORDER BY id DESC LIMIT 1 |
Durch diesen Befehl lesen wir Daten aus der Tabelle $ftable (ist in der Konfigurations-Datei definiert) in absteigender Reihenfolge der id aus. Somit ist die größte Zahl immer an Position 1. Um diese Daten von Position 1 alleine zu haben, fügen wir noch LIMIT 1 an. Dadurch beschränken wir das Auslesen auf genau einen Datensatz.
Soweit erstmal die Theorie.
[PHP]e2aa4e23db79b368511736a559ec71e61e2aa4e23db79b368511736a559ec71e6[/PHP]
Mit diesem Code haben wir nun unseren MySQL-Befehl ausgeführt und ihn direkt verarbeitet. Alle ausgelesenen Daten speichern wir erstmal in dem Array $row. Um unsere Arbeit zu erleichtern definieren wir 3 allgemeine Variablen, in der alle Daten aus der Fragen-Tabelle drin stehen.
Im nächsten Schritt lesen wir alle Daten (Antworten) aus der Antworten-Tabelle aus, die zu dieser Frage gehören. Ob die Antworten zu unserer Frage gehören, stellen wir Anhand unserer Variable $fid und dem Feld fid in der Datenbank fest.
Da es bei einer Umfrage immer mehrere Antwortmöglichkeiten gibt, müssen wir uns überlegen, wie wir die Daten am besten verarbeiten. Meiner Meinung nach bietet sich ein mehrdimmensionales Array an.
Als Struktur verwenden wir folgende:
| Code: |
Array |
In dem Array speichern wir also alle wichtigen Daten, die für jede Antwort interessant sind. Dazu zählen die Id, der Antwort-Text, die Stimmen, die für diese Antwort gestimmt haben, die Prozent im Verhältnis zum Gesamt-Ergebnis und die Breite des Balkens bei der Ausgabe.
Dieses Array erstellen wir mit folgendem Code:
| PHP: |
<?php |
Erklärung:
Die Daten für die Keys id, antwort und ergebnis werden direkt aus der Datenbank genommen. Die Prozent müssen wir berechnen, dazu überprüfen wir ersteinmal, ob überhaupt schon Stimmen vorhanden sind, ist dies der Fall berechnen wir die Prozentzahl und runden sie auf 2 stellen nach dem Komma. Diese Prozentzahl speichern wir in unser Array, da wir die Zahl später noch benötigen.
Die Breite wird auch in Abhängigkeit zu den gesamten Stimmen berechnet.
Beispiel:
Wir haben als $laenge 100 angegeben. 75 % wären dann genau 75 px breit.
Als nächstes geben wir unsere Frage als eine Art "Überschrift" aus. Direkt danach prüfen wir, ob der User bereits gevotet hat (IP-Sperre). Wenn nein, sieht er das Formular zum Abstimmen. Wenn ja, sieht er auf der gesamten Seite nur die Ergebniss.
| PHP: |
<?php |
Erklärung:
Als erstes speichern wir die IP in der Variable $ip. Als nächstes speichern wir in $zeit den aktuellen Timestamp und berechnen dann die differenz des aktuellen Timestamps und der Sperre. Nun löschen wir alle IP's aus der Tabelle, die vor der Sperre eingetragen wurden. Direkt danach prüfen wir, ob die IP in der Datenbank steht, wenn nein, geben wir das Formular aus. Wenn ja, passiert nichts.
Nun kommt als nächstes die Ausgabe der Ergebnisse:
| PHP: |
<?php |
Als erstes prüfen wir, ob bereits Stimmen vorhanden sind. Wenn nein, geben wir einen Hinweis aus, wenn ja, geben wir die Ergebnisse in einer Tabelle aus. Dazu nutzen wir die Funktion foreach();. Damit lesen wir unser großes Array $ant aus und verarbeiten es. Da wir vorher die Keys bestimmt haben, können wir ganz einfach darauf zugreifen.
Das war die Datei vote.php. Jedoch haben wir noch keine Funktion eingebaut, die Das Formular verarbeitet. Diesen Code schreiben wir in die Datei vote_add.php.
Als erstes prüfen wir, ob das Formular auch wirklich an die Datei abgesendet wurde. Ist dies der Fall empfangen wir die Daten aus dem Formular. Außerdem prüfen wir, wie auch schon in der vote.php ob die IP nicht gesperrt ist. Wenn die IP gesperrt ist, wird nur ein Info-Text ausgegeben, wenn nicht, wird die Stimme gezählt und es werden beide Tabellen aktuallisiert (Fragen und Antworten). Außerdem wird nach dem Abstimmen die IP gesperrt. So wir das mehrfach Abstimmen vermieden.
Der komplette Coder der vote_add.php:
| PHP: |
<?php
|
Download der Umfrage