Keine Kommentare,
Fehler?
Schlecht?
Gut?
Hilfreich?
Funktioniert nicht?
irgendwas![]()
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:
AdministrationsbereichPHP-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
?>
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:
Durch die Komprimierung der Optionen und deren Stimmen in 2 Strings spart man Platz und behält die Übersicht.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>';
}
?>
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:
Ergebnis ausgebenPHP-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>';
}
?>
Zum Schluss nun die Datei, in der wir das Ergebnis unserer Umfrage ausrechnen und ausgeben.
Datei result.php:
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.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>';
}
?>
oh mann....hoffe, dass ich keine fehler eingebaut habe
![]()
lg fiu
Geändert von fiu (01.06.2004 um 19:01 Uhr)
Keine Kommentare,
Fehler?
Schlecht?
Gut?
Hilfreich?
Funktioniert nicht?
irgendwas![]()
Schicke Flügel auf deinem Rücken![]()
Jetzt muss ich mein Dummgeschwätz auch noch erklären
nein, es sieht so aus als würde auf deinem Avater auf dem Rücken der Frau Flügel zu sehen sein. Sind aber wohl keine, oder?
Und noch ein Statement zu deinem eigentlich Thread (damit ich nicht ganz umsonst hier dummgebabbelt habe).
ich habe es leider nicht ausprobiert, da ich von diesen Umfragen nicht viel halte. Aber ist bestimmt klasse![]()
hm...
Edit: Anhang entfernt
Geändert von fiu (03.03.2011 um 13:42 Uhr)
Hat vielleicht irgendwer einen Kommentar, der es auch ausprobiert hat![]()
es funktioniert
auch die cookiesperre.
onlinedemo
Leider kenne ich keine Möglichkeit für folgendes Problem:
Wenn sich jemand die Mühe macht, das Cookie zu löschen, kann er 1000000000x abstimmen...
Nicht schlecht, funktioniert einwandfrei![]()
"Dieses Business ist binär. Du bist eine Eins oder eine Null, lebendig oder tot. Es gibt keinen zweiten Sieger." - Gary Winston (StartUp)
Funktioniert super dein Script
Ausser das mit den Cookies....hast du vieleicht eine Lösung gefunden?![]()
Tja, das ist halt so mit den Cookies, du kannst keinen zwingen sie zu akzeptieren. Aber über Templates(+ Cookies) wäre das schon besser.![]()
HalloFiu
Oooooooh
Ich staune!!!!!
Also ich muss das unbedingt mal ausprobieren!
Aber das könnte ich nie- das ist echt toll!!!!!
Ich weis ma grad was echo ist-schäm-
aber jeder fängt mal an...
Ich werds bei meinem Server ausprobieren,da ich irgendwie Probleme hab
auf meinem Rechner den Apache auf PHP gefügig zu machen.
Also bye
Monchi
Wollt nur erst mal mein unbegreifliches Staunen ausdrücken![]()
Was macht das Script, wenn ich einem Optionfeld das Zeichen ; benutzen will?
Gruss
Jan
Ich habe mal soeine Art Voting programmiert. Ist im Prinzip das selbe.
Das Problem mit dem mehrfach Voten: Ich habe zusätzlich zum Cookie noch die IP mitgeloggt und überprüfe ob die IP schon gevotet hat. Ist auch nich das Gelbe vom EI, aber wenigstens müsste man den Cookie löschen und sich neu ins Netz einwählen.
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)