Mehrere Abstimmungen auf einer Seite mit IP-Sperre umsetzen

Samuel Becker

Dieses Beispiel zeigt, wie sich mehrere Abstimmungen auf einer einzelnen Webseite realisieren lassen. Die Besonderheit dabei ist, dass das System dateibasiert arbeitet und zusätzlich eine einfache IP-Sperre verwendet. Dadurch soll verhindert werden, dass ein Besucher mehrfach hintereinander abstimmt. Das Konzept ist vor allem für kleinere Projekte interessant, bei denen keine Datenbank eingesetzt werden soll und die Ergebnisse dennoch übersichtlich gespeichert und angezeigt werden müssen.

Das gesamte System basiert auf mehreren Dateien, die zusammenarbeiten. Ein Teil ist für die Darstellung des Formulars zuständig, ein anderer für die Ausgabe der Ergebnisse. Zusätzlich werden die abgegebenen Stimmen sowie die bereits erfassten IP-Adressen in separaten Dateien gespeichert. Auf diese Weise kann das Skript nachvollziehen, ob ein Benutzer bereits abgestimmt hat und welche Ergebnisse aktuell vorliegen.

Die Umsetzung ist eher für fortgeschrittene Anwender gedacht, da bereits etwas Verständnis für PHP, Dateiverarbeitung und einfache Formularverarbeitung notwendig ist. Wer sich jedoch näher mit dateibasierten Systemen beschäftigen möchte, erhält hier einen guten Einblick in die grundlegende Arbeitsweise solcher Abstimmungen.

Welche Dateien werden benötigt?

Für dieses Abstimmungssystem werden insgesamt fünf Dateien benötigt. Jede davon erfüllt eine bestimmte Aufgabe innerhalb des Ablaufs. Die Dateien heißen:

  • abstimmungen.php
  • ergebnis.php
  • ip.dat
  • abstimmung.dat
  • daten.dat

Die Datei abstimmungen.php enthält die Hauptlogik. Hier wird geprüft, ob ein Nutzer bereits abgestimmt hat, ob die Abstimmung abgeschickt wurde oder ob nur das Formular angezeigt werden soll. Die Datei ergebnis.php ist für die Darstellung der Auswertung zuständig. In den Dateien ip.dat, abstimmung.dat und daten.dat werden die benötigten Informationen dauerhaft gespeichert.

Die Aufgabe von abstimmungen.php

Die Datei abstimmungen.php ist das Herzstück des Systems. Zunächst werden darin die Pfade zu den einzelnen Datendateien festgelegt. Danach liest das Skript die bisher gespeicherten IP-Adressen aus der Datei ip.dat aus. Gleichzeitig wird die aktuelle IP-Adresse des Besuchers ermittelt.

Im nächsten Schritt wird geprüft, ob sich diese aktuelle IP-Adresse bereits in den letzten gespeicherten Einträgen befindet. Ist das der Fall, wird ein internes Kennzeichen gesetzt. Dieses Kennzeichen signalisiert dem System, dass die betreffende Person bereits abgestimmt hat. Damit wird eine erneute Stimmabgabe verhindert.

Lesen:  Webanalyse: Wie Daten helfen, Websites besser zu verstehen

Hat der Nutzer auf den Button zum Abstimmen geklickt und wurde seine IP noch nicht registriert, dann speichert das Skript zunächst die neue IP-Adresse in der Datei ip.dat. Anschließend werden die bisherigen Abstimmungsergebnisse aus abstimmung.dat geladen, zerlegt und verarbeitet. Für jede vorhandene Abstimmung wird der passende Wert erhöht. Zusätzlich wird die aktuelle Uhrzeit gespeichert, damit später erkennbar ist, wann die letzte Stimme abgegeben wurde.

Sind die Werte aktualisiert, schreibt das Skript die neuen Ergebnisse wieder in die Datei zurück. Direkt danach wird die Datei ergebnis.php eingebunden, damit der Besucher sofort die aktualisierten Resultate sehen kann.

Falls bereits abgestimmt wurde oder der Benutzer nur auf den Link zu den Ergebnissen geklickt hat, wird ebenfalls direkt die Ergebnisdatei geladen. Nur wenn ein Besucher die Seite ganz normal öffnet und seine IP noch nicht in der Sperrliste vorkommt, wird das Abstimmungsformular angezeigt.

Aufbau des Formulars und Einlesen der Daten

Damit die Fragen und Antwortmöglichkeiten nicht direkt im PHP-Code stehen müssen, werden sie aus der Datei daten.dat eingelesen. Diese Datei enthält die benötigten Informationen in strukturierter Form. Dazu gehören der Titel einer Abstimmung, die möglichen Antworten und die farbliche Gestaltung der Ausgabe.

Das Skript trennt diese Informationen in einzelne Abschnitte auf und baut daraus das HTML-Formular zusammen. Jede Frage wird mit den zugehörigen Antwortmöglichkeiten dargestellt. Die Antwortoptionen werden als Radio-Buttons ausgegeben, sodass pro Abstimmung nur eine Auswahl getroffen werden kann.

Zusätzlich ist im Formular ein Link eingebaut, über den sich die Ergebnisse auch ohne eigene Stimmabgabe aufrufen lassen. Das ist praktisch, wenn man die Resultate anschauen möchte, ohne direkt selbst an der Abstimmung teilzunehmen.

IP Sperre

Die Funktion von ergebnis.php

Die Datei ergebnis.php übernimmt die Darstellung der bereits abgegebenen Stimmen. Zunächst liest sie die Datei abstimmung.dat ein, in der die aktuellen Resultate gespeichert sind. Diese Daten werden in einzelne Abstimmungen zerlegt und weiter aufgeteilt.

Danach berechnet das Skript die Gesamtzahl der Stimmen pro Abstimmung. Im Anschluss werden die Prozentwerte für jede einzelne Antwortmöglichkeit ermittelt. Zusätzlich wird aus diesen Prozentwerten eine Balkenlänge berechnet, damit die Ergebnisse nicht nur als Zahl, sondern auch grafisch sichtbar sind.

Lesen:  Links in HTML: Grundlagen, Arten und wichtige Attribute

Ein weiterer Bestandteil ist die Anzeige der letzten Stimmabgabe. Dazu wird der gespeicherte Zeitstempel ausgelesen und in ein lesbares Datumsformat umgewandelt. So kann der Besucher erkennen, wann zuletzt an der jeweiligen Umfrage teilgenommen wurde.

Die Darstellung erfolgt anschließend in Tabellenform. Zu jeder Frage werden die einzelnen Antwortmöglichkeiten mit Balkengrafik und Prozentwert angezeigt. Darunter erscheint die Gesamtzahl aller abgegebenen Stimmen sowie der Zeitpunkt der letzten Teilnahme.

Wie muss die Datei daten.dat aufgebaut sein?

Die Datei daten.dat enthält die Inhalte der Abstimmungen. Dort stehen die Fragen, die Namen der Formularfelder, die Antworttexte und die Farben für die grafische Ausgabe. Die einzelnen Bereiche werden durch eine festgelegte Trennung voneinander abgegrenzt.

Ein typischer Eintrag kann zum Beispiel eine Frage wie „Ist die Waldweihnachten nötig?“ enthalten, gefolgt von den Antwortmöglichkeiten „Ja!“ und „Nein!“. Danach werden passende Farben angegeben, etwa Grün und Rot. Danach beginnt mit einer Trennung die nächste Abstimmung.

Durch diese Struktur ist es möglich, mehrere Umfragen nacheinander in einer einzigen Datei zu verwalten, ohne den PHP-Code selbst ändern zu müssen. Wer eine neue Abstimmung hinzufügen möchte, ergänzt einfach einen weiteren Abschnitt nach demselben Muster.

Die Datei abstimmung.dat und die Speicherung der Ergebnisse

In der Datei abstimmung.dat werden die eigentlichen Abstimmungsergebnisse gespeichert. Dort stehen die Zahlenwerte, die jede Antwortmöglichkeit bereits erreicht hat, sowie ein Zeitstempel, der die letzte Stimmabgabe festhält.

Jede Zeile repräsentiert eine Abstimmung. Die Zahlen werden durch Doppelpunkte getrennt. Dadurch kann das Skript die Werte später wieder einlesen, aufteilen und auswerten. Dieses einfache Speicherprinzip ersetzt in diesem Beispiel eine Datenbank.

Gerade für kleine Projekte ist das eine unkomplizierte Lösung. Allerdings stößt sie bei größeren Besucherzahlen oder bei hohem Sicherheitsanspruch schnell an ihre Grenzen.

Wichtiger Hinweis zu den Dateirechten

Damit das Skript die Dateien abstimmung.dat und ip.dat beschreiben kann, müssen beide Dateien die passenden Schreibrechte besitzen. Im ursprünglichen Beispiel wird dafür der CHMOD-Wert 666 genannt. Ohne diese Rechte kann das Skript weder Stimmen noch IP-Adressen speichern.

Wenn die Rechte nicht korrekt gesetzt sind oder die Dateien im falschen Verzeichnis liegen, können Fehlermeldungen auftreten. Typische Warnungen betreffen dann das Öffnen oder Lesen der Dateien. Ein Beispiel dafür ist eine Meldung, dass abstimmung/ip.dat oder abstimmung/daten.dat nicht gefunden werden konnte. In solchen Fällen sollte zuerst geprüft werden, ob die Dateien tatsächlich existieren, ob der Pfad stimmt und ob die nötigen Zugriffsrechte gesetzt wurden.

Lesen:  Neuregelung zum Text- und Data-Mining im Urheberrecht

Hinweise aus den Kommentaren und bekannte Probleme

Im Zusammenhang mit dem Skript wurde darauf hingewiesen, dass manche Probleme durch die PHP-Einstellung register_globals entstehen können. Ist diese Funktion deaktiviert, kann es sein, dass bestimmte Variablen nicht wie erwartet übernommen werden. Deshalb wurde angekündigt, den Quelltext entsprechend anzupassen.

Ein weiteres häufiges Problem betrifft die Dateirechte. In den Kommentaren wurde erklärt, dass man auf dem Server per Rechtsklick auf die jeweilige Datei zugreifen und dort die Berechtigungen auf 666 setzen muss. Erst dann funktioniert das Speichern der Stimmen meist fehlerfrei.

Außerdem wurde nach Erweiterungen gefragt, etwa nach einem Archiv für ältere Abstimmungen oder nach einer Version auf MySQL-Basis mit unbegrenzten Auswahlmöglichkeiten. Diese Anfragen zeigen gut, dass das vorgestellte System als Grundlage dienen kann, aber bei komplexeren Anforderungen sinnvoll erweitert werden müsste.

Fazit

Dieses dateibasierte Abstimmungssystem mit IP-Sperre zeigt anschaulich, wie mehrere Umfragen auf einer Seite umgesetzt werden können, ohne eine Datenbank zu verwenden. Die Lösung speichert IP-Adressen, zählt Stimmen, berechnet Prozentwerte und zeigt Ergebnisse inklusive Balkengrafik an. Durch die Trennung in mehrere Dateien bleibt das System überschaubar und kann relativ leicht angepasst werden.

Gleichzeitig sollte man beachten, dass diese Methode eher für kleinere Projekte gedacht ist. Die IP-Sperre bietet nur eine einfache Form der Mehrfachabstimmungsbegrenzung und die Speicherung in Dateien ist auf Dauer weniger flexibel als eine datenbankgestützte Lösung. Für Lernzwecke und kleinere Seiten ist dieses Beispiel jedoch gut geeignet und vermittelt wichtige Grundlagen im Umgang mit PHP und dateibasierter Verarbeitung.

Samuel Becker