IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - Realisierung einer Umfrage



Realisierung einer Umfrage

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.


Autor: ()
Datum: 27-10-2003, 21:20:26
Referenzen: Keine
Schwierigkeit: Fortgeschrittene
Ansichten: 6384x
Rating: 7.57 (7x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



MySQL Tabelle erzeugen

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
// 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
// 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
// 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"$idtime()+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
// 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.

Das komplette Paket inklusive Bilddateien steht hier zur Verfügung -> http://www.chaoslord.org/scorpion/umfrage.zip



Senior Member
Beitrag vom:
20-11-2003, 14:27:20

Das hat damit zu tun, dass die Variable submit noch nicht vorhanden ist, sondern erst beim abschicken (logisch) generiert wird. Falls die Fehlermeldung weiterhin auftreten sollte schreib einfach an den Anfang: error_reporting("E_ALL & ~E_NOTICE"); Ist eigentlich Grundeinstellung jedes Webservers - dashalb hab ich's nicht bemerkt :).

-----------------------------------------------------


wila
Rookie
Beitrag vom:
19-11-2003, 12:15:14

Fehlermeldung

hallo! ich habe das Umfragesystem bei mir installiert und leider erscheint immer eine Fehlermeldung: Notice: Undefined index: submit in E:\Intranet\cool\umfrage\vote.php on line 9 An was liegt das?

-----------------------------------------------------



Senior Member
Beitrag vom:
28-10-2003, 01:17:59

Berichtigung

Mir ist da ein kleiner Fehler in der Datei vote.php aufgefallen: Der Befehl setcookie("voted", $id, time()+3600*24*$blockdays); muss noch von einem Kontrollmechanismus umschlossen werden. Etwa so: if($cookie == true) { setcookie("voted", $id, time()+3600*24*$blockdays); } Jetzt kann man in der Konfiguration einstellen, ob ein User nur einmal bei der gleichen Umfrage abstimmen darf.

-----------------------------------------------------



Senior Member
Beitrag vom:
28-10-2003, 01:08:22

Nein, Nein - Das wäre viel zu aufwendig. Ich habe den Code einfach in eine Datei gepackt und diese dann mittels highlight_file(string file) gehighlighted.

-----------------------------------------------------


no_comment
Professonial
Beitrag vom:
27-10-2003, 22:18:36

der code ist richtig schön gehilighted, hast du das per Hand gemacht?

-----------------------------------------------------
Es gibt nur 3 natürliche Feinde des Programmierers: Tageslicht, frische Luft und das unerträgliche Gebrüll der Vögel -- http://pc-intern.com http://straightvisions.com


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06243
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1144
Comments: 0