Fast auf allen dynamischen Websites findet man Umfragen. Meist werden sie in Verbindung mit einer MySQL Datenbank benutzt; deshalb werde ich auch in diesem Artikel eine solche Datenbank benutzen. Geeignet ist dieser Artikel für diejenigen, die (noch) nicht wissen, wie eine Umfrage mit PHP zu realisieren ist.
MySQL Tabelle erzeugen
Code:
CREATE TABLE umfragen (
id int not null primary key auto_increment,
frage varchar(255) not null,
options text not null,
hits text not null
);
Die ID dient zur eindeutigen Identifizierung einer Umfrage.
Unter Options und Hits werden die einzelnen Optionen und deren Stimmen gespeichert.
Variablen festlegen
Zuerst sollten wir die Variablen für die MySQL Verbindung und die Konfiguration des Scripts festlegen.
Datei config.php:
PHP-Code:
<?php
// MySQL Verbindungs Variablen
$host = "localhost";
$user = "root";
$pass = "root";
$dbname = "website";
// Verbindung aufbauen
$serverid = mysql_connect($host, $user, $pass);
mysql_select_db($dbname, $serverid);
// Konfiguration der Umfrage
$cookie = true; // Setzt einen Cookie nach der Abstimmung
$adminname = "Admin"; // Zur Administration der Umfragen
$adminpass = "admin"; // Passwort für Admin Account
$maxoptions = 10; // Maximale Optionsfelder, die im Adminbereich angezeigt werden
$blockdays = 7; // User dürfen erst nach X Tagen wieder an der Umfrage teilnehmen
?>
Administrationsbereich
Nun brauchen wir natürlich eine Umfrage. Jedesmal an der Datenbank mit phpMyAdmin rumzuwerkeln ist zu umständlich, also bauen wir ein Webinterface zur Administration der Umfrage-Tabelle.
Zuerst müssen wir überprüfen, ob der User schon eingeloggt ist. Wenn nicht, bekommt er ein entsprechendes Formular ausgegeben.
Datei admin.php:
PHP-Code:
<?php
// Config Datei hinzuladen
include("config.php");
// Wenn richtig -> Adminbereich
if($_POST["adminname"] == $adminname && $_POST["adminpass"] == $adminpass) {
// Wenn Erstellen geklickt wurde -> Neue Umfrage
if($_POST["submit"] == "Erstellen") {
// Definieren, dass $options und $hits ein Array ist
$options = array();
$hits = array();
// Array mit Werten füllen
for($i=0; $i<$maxoptions; $i++) {
// Überprüfen, welche Felder frei gelassen wurden
if($_POST["option" . $i] != "") {
$options[] = $_POST["option" . $i];
$hits[] = 0;
}
}
// Array in String für Datenbank umwandeln
$options = implode(";", $options);
$hits = implode(";", $hits);
// Eintragung in die Datenbank
$sql = "INSERT INTO umfragen (frage, options, hits) ";
$sql .= "VALUES ('" . $_POST["frage"] . "', '" . $options . "', '" . $hits . "')";
$query = mysql_query($sql, $serverid);
// Check
if(mysql_affected_rows($serverid)) {
echo 'Neue Umfrage erfolgreich erstellt.';
}
else {
echo 'Umfrage konnte nicht erstellt werden.';
}
}
// Wenn nicht -> Admin Formular
else {
echo 'Neue Umfrage erstellen';
echo '<br><br>';
echo 'Lasse Options-Felder die du nicht benötigst einfach leer.<br>';
echo '<form name="admin" action="' . $_SERVER['PHP_SELF'] . '" method="post">';
echo '<input type="hidden" name="adminname" value="' . $adminname . '">'; // Muss wegen Verifizierung nochmals übergeben werden
echo '<input type="hidden" name="adminpass" value="' . $adminpass . '">'; // s.o.
echo 'Frage:<br>';
echo '<input type="text" name="frage" size="50"><br>';
echo 'Optionen:<br>';
// Ausgabe der Optionsfelder
for($i=0; $i<$maxoptions; $i++) {
echo '<input type="text" name="option' . $i . '"><br>';
}
echo '<input type="submit" name="submit" value="Erstellen"></form>';
}
}
// Wenn nicht -> Login Formular
else {
echo '<form name="login" action="' . $_SERVER['PHP_SELF'] . '" method="post">';
echo '<input type="text" name="adminname" value="Username"><br>';
echo '<input type="text" name="adminpass" value="Passwort"><br>';
echo '<input type="submit" value="Login"></form>';
}
?>
Durch die Komprimierung der Optionen und deren Stimmen in 2 Strings spart man Platz und behält die Übersicht.
Voting Formular
So, nun wollen wir unsere erste Stimme abgeben. Dazu müssen alle Optionen der Umfrage mit entsprechenden Radio-Buttons ausgegeben werden.
Datei vote.php:
PHP-Code:
<?php
// Config Datei hinzuladen
include("config.php");
// ID der aktuellen Umfrage ermitteln
$id = mysql_result(mysql_query("SELECT id FROM umfragen ORDER BY id DESC LIMIT 1", $serverid), 0, "id");
// Wenn abgestimmt wurde -> Datenbankeintrag
if($_POST["submit"] == "Vote") {
// Bisherige Stimmen aus der Datenbank holen
$sql = "SELECT * FROM umfragen WHERE id=" . $id;
$query = mysql_query($sql, $serverid);
$data = mysql_fetch_array($query);
// String wieder zurück in ein Array einlesen
$data["hits"] = explode(";", $data["hits"]);
// Die Variable mit der Stimme des Users erhöhen
$data["hits"][$_POST["option"]]++;
// Array zurück in String
$data["hits"] = implode(";", $data["hits"]);
// Datenbank Update
$sql = "UPDATE umfragen SET hits='" . $data["hits"] . "' WHERE id=" . $id;
$query = mysql_query($sql, $serverid);
// Check
if(mysql_affected_rows($serverid)) {
setcookie("voted", $id, time()+3600*24*$blockdays);
echo 'Deine Stimme wurde gezählt.';
// User in 5 Sekunden zum Ergebnis der Umfrage weiterleiten
echo "<META http-equiv=refresh content='5; URL=result.php'>";
}
else {
echo 'Fehler beim Abstimmen.';
}
}
// Wenn nicht -> Ausgabe der Optionen
else {
// Überprüfen, ob User schon abgestimmt hat
if($_COOKIE["voted"] == $id) {
echo 'Du hast bereits abgestimmt - Beim nächsten Mal wieder.';
// User in 5 Sekunden zum Ergebnis der Umfrage weiterleiten
echo "<META http-equiv=refresh content='5; URL=result.php'>";
die();
}
// Letzte (aktuelle) Umfrage aus der Datenbank holen
$sql = "SELECT * FROM umfragen WHERE id=" . $id;
$query = mysql_query($sql, $serverid);
$data = mysql_fetch_array($query);
// String wieder zurück in ein Array einlesen
$data["options"] = explode(";", $data["options"]);
// Ausgabe der Frage und ihrer Optionen
echo $data["frage"];
echo '<form name="umfrage" action="' . $_SERVER['PHP_SELF'] . '" method="post">';
for($i=0; $i<count($data["options"]); $i++) {
echo '<input type="radio" name="option" value="' . $i . '">' . $data["options"][$i] . '<br>';
}
echo '<br><input type="submit" name="submit" value="Vote"></form>';
}
?>
Ergebnis ausgeben
Zum Schluss nun die Datei, in der wir das Ergebnis unserer Umfrage ausrechnen und ausgeben.
Datei result.php:
PHP-Code:
<?php
// Config Datei hinzuladen
include("config.php");
// Daten abfragen
$sql = "SELECT * FROM umfragen ORDER BY id DESC LIMIT 1";
$query = mysql_query($sql, $serverid);
$data = mysql_fetch_array($query);
// String in Array umwandeln
$data["options"] = explode(";", $data["options"]);
$data["hits"] = explode(";", $data["hits"]);
$gesamt = array_sum($data["hits"]);
echo $data["frage"] . '<br><br>';
// Ausgabe der Optionen mit Prozent, Stimmen und Balken
for($i=0; $i<count($data["options"]); $i++) {
$percent = floor($data["hits"][$i]*100/$gesamt);
echo $data["options"][$i] . ' - ' . $percent . '% (' . $data["hits"][$i] . ') ';
echo '<img border="0" src="links.gif" width="15" height="20"><img border="0" src="mitte.gif" width="' . ($percent*2) . '" height="20"><img border="0" src="rechts.gif" width="15" height="20"><br>';
}
?>
Natürlich muss man die Strings nicht ausgeben lassen (echo) - man könnte sie auch in Variablen packen, was das Script besonders für Template Systeme interessant macht.

oh mann....hoffe, dass ich keine fehler eingebaut habe
lg fiu