2x bewertet

Umfrage

von Bianca  |  29.04.2009 um 12:08 h
PHP Anwendungen
Typ: PHP Anwendungen
Stufe:Einfach Mittelmäßig
Das ist nur das Umfrage-Skript! Hier (KLICK) gibt es das Skript mit Anleitung zum Einbauen und einem Admin-Control-Panel zum Downloaden und einfachem Installieren.

Was Du brauchst:
Grundkenntnisse in PHP und MySQL


Zu aller erst überlegen wir uns was wir überhaupt machen wollen: eine Umfrage!
Die Umfrage besteht aus einer Frage, für die man dann mehrere Antwortmöglichkeiten hat. Zunächst kann man über Radiobuttons seine Antwort auswählen und dann per Klick seine Antwort abschicken, daraufhin erfährt man dann, wie der aktuelle Stand der Umfrage ist; angezeigt durch ein paar hübsche Balken.
Hat man schon einmal abgestimmt, wird einem nur das Ergebnis gezeigt, nochmal abstimmen kann man erst wieder bei der nächsten Frage.

Als nächstes überlegen wir uns, wie unsere Tabelle(n) dazu aussehen müssen. Natürlich könnten wir alles in eine Tabelle packen, es ist aber durchaus sinnvoll 2 Tabellen zu erstellen: eine, die die Fragen enthält und eine die dazugehörigen Antworten. So kann man bequem mehrere Umfragen erstellen.

Die Tabelle mit den Fragen braucht auf jeden Fall schon mal 2 Spalten: id und frage. Es ist zudem sinnvoll auch das Datum, an dem sie hinzugefügt wurde zu speichern. Außerdem müssen wir speichern, wie viele Leute schon abgestimmt haben, um später zu ermitteln wie viel Prozent die einzelnen Antworten ausmachen. Hinzukommt, dass wir irgendwie speichern müssen, welcher User schon abgestimmt hat!
Hier gibt es mal wieder mehrere Möglichkeiten: Sessions, Cookies und IPs. Da man aber mit Cookies und Sessions am ehesten Spamen kann, verwenden wir die Methode in unserer Datenbank zu speichern, welche IPs schon abgestimmt haben.
Folglich brauchen wir noch eine Spalte, in der die ips gespeichert werden.
Die Tabelle umfrage sieht nun also wie folgt aus:
umfrage (id (INT, auto-increment, Primary Key) , frage (VARCHAR), datum (VARCHAR), stimmen(INT) , ip (LONGTEXT))

Die Tabelle mit den Antworten braucht auf jeden Fall auch eine Spalte id. Dann brauchen wir natürlich noch eine Spalte, die die Antwort an sich speichert, eine die die id der Frage, zu der die Antwort gehört, speichert und eine, die die abgegebene Stimmzahl enthält.
Die Tabelle antworten sieht also so aus:
antworten (id (INT, auto_increment, Primary Key), antwort(VARCHAR), stimmen(INT), frageid(INT))

Da wir nun unsere Tabellen angelegt haben, müssen wir uns jetzt noch überlegen, wie wir das Ganze in eine funktionierende Umfrage verwandeln.
Dabei müssen wir bedenken, dass das Umfrage-Script möglichst handlich und leicht in eine Website zu integrieren sein muss! Außerdem wäre es toll, wenn man ohne Probleme auch mehrere Umfragen in eine Seite bauen könnte.
Um diese Voraussetzungen möglichst effizient zu erfüllen, werden wir mit Funktionen arbeiten, die sich gegenseitig aufrufen und am Ende dann in einer Variablen die Umfrage bzw. deren Darstellung mit HTML-Code zurückliefern.
Das hat den Vorteil, dass alles übersichtlich bleibt und unsere zweite Anforderung lässt sich einfacher erfüllen: Wir brauchen keine Angst zu haben, dass durch eine zweite Umfrage auf derselben Seite sich Variablen und Benennungen in die Quere kommen.

Dazu sollten wir uns erst einmal überlegen welche Funktionen die Umfrage haben muss und arbeiten diese dann einzeln ab.
Funktion 1: Formular zum absenden
Funktion 2: Speichern der Stimme
Funktion 3: Anzeige der Umfrageergebnisse.

Bevor wir damit anfangen muss natürlich erst mal die Verbindung zur Datenbank hergestellt werden. Wie das geht erfährst du hier: KLICK.

Ganz oben in meinem Script binde ich die Datei, die mit der Datenbank connecten mit PHP include ein.



<?PHP
include "db.inc.php";
?>




Die erste Funktion ist ja relativ einfach und von den meisten schon mal geskriptet worden:



<?PHP
/* Diese Funktion erzeugt das Formular zum Abstimmen */
function formular($id) {
  
/* Wähle die Umfrage mit der übergebenen id aus. */
  
$abf "SELECT * FROM rp_umfrage WHERE id='".$id."'";
  
$empf mysql_query($abf) or die(mysql_error());
  
$fragedaten mysql_fetch_assoc($empf);
  
/* Wähle die Antworten, die zu der Umfrage gehören aus */
  
$abfant "SELECT * FROM rp_antworten WHERE
frageid='"
.$fragedaten['id']."'";
  
$empfant mysql_query($abfant) or die(mysql_error());
  
$anzahlantworten mysql_affected_rows();
  
/* Erstellung des HTML-Codes des Umfrage-Formulars;
$_SERVER['PHP_SELF'] bewirkt, dass das Formular an die aktuell
aufgerufene Seite geschickt wird. */
  
$daten['content'] .= "<div class=\"umfrage\">\n
                        <div
class=\"frage\">"
.$fragedaten['frage']."</div>\n
                        <div class=\"antworten\">\n
                        <form action=\""
.$_SERVER['PHP_SELF']."\"
method=\"post\">\n
                        <ul class=\"antwortenform\">\n"
;
  
/* Für jede Antwortmöglichkeit wird ein Radiobutton erzeugt und
bekommt als Wert die id der entsprechenden Antwort */
  
while($row mysql_fetch_assoc($empfant)) {
    
$daten['content'] .= "<li><input type=\"radio\" name=\"answers\"
value=\""
.$row['id']."\" /> ".$row['antwort']."</li>\n";
  }
  
/* Rest des Formulars wird verschickt. Der Name des Buttons ist
nötig um mehrere Umfrage-Formulare auseinanderhalten zu können, falls
jemand mehrere Umfragen in seine Seite einbindet */
  
$daten['content'] .= "</ul>\n
                        <input type=\"submit\" value=\"Abstimmen\"
class=\"abschicken\" name=\"submit"
.$id."\"/>\n
                        </form>\n
                        </div>\n
                        </div>\n"
;
  
/* Zurückgeben des Formulars */
  
return $daten['content'];
}
?>




Allerdings gibt es hier auch noch ein paar Besonderheiten.

Zunächst werden die Umfrage und deren Antworten aus der Datenbank geholt.
Um welche Umfrage es sich handelt erfährt die Funktion durch die Variable $id, die die id der umfrage enthält und beim Aufruf der Funktion übergeben wird.
Anschließend wird das Formular erzeugt. Der HTML-Code des Formulars wird in dem Array $daten[′content] gespeichert. Das passiert übrigens durch das ganze Skript hinweg und ist eigentlich nur eine Angewohnheit: Ich speichere alles, was später ausgegeben wird in diesem Array.

Da jede Umfrage verschieden viele Antworten hat, werden die Radiobuttons der Antworten mit PHP erzeugt. Jeder Radiobutton bekommt dabei als zu übergebenen Wert die id der Antwort zugeteilt.
Der Submit-Button bekommt einen eindeutigen Namen zugeteilt (submit + id der umfrage) um später unterscheiden zu können, welches Formular abgeschickt wurde, falls jemand mehrere Umfragen in seine Seite eingebunden hat.
Der HTML-Code bzw. die vielen Divs sind wichtig zur Darstellung des Formulars, dazu aber am Ende mehr.

Wir überspringen nun erstmal Funktion 2 und gehen direkt über zu Funktion 3, da die 1. einfacher ist und 2. weil Funktion 2 die anderen beiden Funktionen zusammenbringt.

Funktion 3 enthält also die Darstellung der Ergebnisse der Umfrage.


<?PHP
/* Diese Funktion erzeugt die grafische Darstellung der Umfrage mit
den ausgewerteten Daten (also die hübschen Balken) */
function auswertung($id) {
  
/* Wähle die Datensätze der Tabelle umfrage, welche die übergebene
id besitzen. */
  
$abf "SELECT * FROM rp_umfrage WHERE id='".$id."'";
  
$empf mysql_query($abf) or die(mysql_error());
  
$fragedaten mysql_fetch_assoc($empf);
  
/* HTML-Code zum Ausgeben der Umfrage */
  
$daten['content'] .= "<div class=\"umfrage\">\n
                        <div
class=\"frage\">"
.$fragedaten['frage']."</div>\n
                        <div class=\"antworten\">\n"
;
  
/* Wähle alle Antworten zu der aufgerufenen Umfrage aus */
  
$abfant "SELECT * FROM rp_antworten WHERE frageid='".$id."'";
  
$empfant mysql_query($abfant) or die(mysql_error());
  while(
$row mysql_fetch_assoc($empfant)) {
    
/* Falls Antwort schon Stimmen hat, berechne deren Prozentanteil
(Stimmanzahl * 100 / Gesamtstimmanzahl) */
    
if ($row['stimmen']>0) {
      
$anteil round($row['stimmen']* 100 $fragedaten['stimmen']);
    }
    
/* Falls Antwort noch keine Stimmen hat, setze Variable $anteil
auf 0 */
    
else {
      
$anteil 0;
    }
    
/* HTML-Code zur Erstellung des Balkens, die Breite des blauen
Balkens entspricht dem Prozentanteil der aktuell bearbeiteten Frage */
    
$daten['content'] .= "<div class=\"antwort\">".$row['antwort']."
                          <div class=\"balken\"><div class=\"anteil\"
style=\"width:"
.$anteil."%;\"></div></div><div
class=\"text\">"
.$anteil."%</div></div>\n"
  }
  
/* HTML-Code für den Abschluss der Umfrage-Darstellung */
  
$daten['content'] .=  "</div>\n
                         <div class=\"umfragenfooter\">Bisher
abgegebene Stimmen: "
.$fragedaten['stimmen']."</div>\n
                         </div>\n"
;
  
/* Zurücklieferung der Umfrage */
  
return $daten['content'];
}
?>




Hier werden zunächst wieder Umfrage und dazugehörige Antworten ausgelesen und es wird begonnen den HTML-Code zur Darstellung zu erzeugen.
Um die Ergebnisse zu präsentieren verwenden wir Balken. Um für jede einzelne Antwort einen Balken zu erhalten, der auch im Verhältnis die richtige Breite hat, müssen wir zunächst berechnen wie viel Prozent die Stimmen der Antwort von allen abgegebenen Stimmen ausmacht.
Das ist einfache Prozentrechnung und müsste jedem klar sein ;)
Der Wert wird in der Variablen $anteil gespeichert. Und schließlich dem Div, das den Balken darstellt als Breite zugeteilt.
Anschließend wird noch der Fuß der Umfrage-Darstellung erzeugt und das ganze wird dann wieder zurückgegeben.

Nun kommt Funktion 2, das Kernstück unseres Skripts:



<?PHP
/* Diese Funktion ist die Hauptfunktion: sie ruft die anderen beiden
Funktionen auf und updatet die Daten der Umfrage */
function umfrage($id) {
  
/* Falls $id leer ist, wird einfach die zuletzt erstellte umfrage
ausgewählt */
  
if(empty($id)) {
    
/* Bedeutung der Abfrage: Order By datum = Sortiere nach datum;
DESC = Neuestes > Ältestes; LIMIT = Wähle nur den ersten Datensatz aus
*/
    
$abf "SELECT * FROM rp_umfrage ORDER BY datum DESC LIMIT 1";
    
$empf mysql_query($abf) or die(mysql_error());
    
$row mysql_fetch_assoc($empf);
    
/* $id bekommt nun die id der ausgewählten umfrage zugeteilt */
    
$id $row['id'];
  }
  
/* Um zu überprüfen ob der User schon mal abgestimmt hat, werden
alle Datensätze der Tabelle umfrage ausgewählt, die die gewünschte id
haben (sollte im Normalfall höchstens eine sein) und in deren Spalte
ip die IP des Users zu finden ist. */
  
$abfabgestimmt "SELECT * FROM rp_umfrage WHERE id='".$id."' AND ip
LIKE'%"
.$_SERVER['REMOTE_ADDR']."%'";
  
$empfabgestimmt mysql_query($abfabgestimmt) or die(mysql_error());
  
/* $abgestimmt bekommt nun die Anzahl der gefundenen Datensätze
zugeteilt, sprich, wenn der User schon abgestimmt hat, enthält
$abgestimmt nun eine 1, ansonsten eine 0 */
  
$abgestimmt=mysql_affected_rows();
  
/* Falls das Formular zum Abstimmen abgeschickt wurde, und zwar
nicht leer und $abgestimmt 0 ist (=User hat noch nicht gevotet) */
  
if(isset($_REQUEST["submit".$id]) AND !empty($_POST['answers']) AND
$abgestimmt==0) {
    
/* Falls die aus dem Formular kommende id auch wirklich eine
Nummer ist, wird der Variablen $antwort dieser Wert zugeteilt */
    
if(is_numeric($_POST['answers'])) {
      
$antwort $_POST['answers'];
    }
    
/* Die Antwort der übergebenen id wird aus der Datenbank geholt */
    
$abf "SELECT * FROM rp_antworten WHERE id='".$antwort."'";
    
$empf mysql_query($abf) or die(mysql_error());
    
$antwortdaten mysql_fetch_assoc($empf);
    
/* Falls es eine Antwort mit der id auch wirklich gibt... */
    
if (mysql_affected_rows() == 1) {
      
/* Auswählen der Umfrage mit der entsprechenden id */
      
$abf2 "SELECT * FROM rp_umfrage WHERE id='".$id."'";
      
$empf2 mysql_query($abf2) or die(mysql_error());
      
$fragen mysql_fetch_assoc($empf2);
      
/* Erhöhe die Stimmanzahl der Antwort */
      
$antwortdaten['stimmen']++;
      
/* Erhöhe die Gesamtstimmzahl der Umfrage */
      
$fragen['stimmen']++;
      
/* Speichern der Stimmzahl der Antwort */
      
$abfup "UPDATE rp_antworten SET
stimmen='"
.$antwortdaten['stimmen']."' WHERE id='".$antwort."'";
      
$empfup mysql_query($abfup) or die(mysql_error());
      
/* Speichern der Gesamtstimmzahl der Umfrage und der IP des User
in der umfrage-Tabelle */
      
$abfup "UPDATE rp_umfrage SET
ip='"
.$fragen['ip'].$_SERVER['REMOTE_ADDR']."|"."',
stimmen='"
.$fragen['stimmen']."' WHERE id='".$id."'";
      
$empfup mysql_query($abfup) or die(mysql_error());
    }
    
/* Aufrufen der Funktion auswertung */
    
$daten['content'] = auswertung($id);
  }
  
/* Falls User schon abgestimmt hat die Funktion auswertung aufrufen
*/
  
elseif ($abgestimmt!=0) {
    
$daten['content'] = auswertung($id);
  } 
  
/* Falls noch nicht abgestimmt und Formular nicht abgeschickt,
funktion formular aufrufen */
  
else {
    
$daten['content'] = formular($id);
  }
  return 
$daten['content'];
}
?>




Zunächst wird überprüft, ob $id leer ist, wenn ja, wird $id einfach die id der Umfrage zugeteilt, die als letztes erzeugt wurde. So braucht man nicht jedes Mal seinen Code austauschen, wenn man eine neue Umfrage erstellt hat!

Dann wird überprüft, ob der User schon einmal abgestimmt hat und ob das Umfrage-Formular abgeschickt wurde. Wenn der User schon mal abgestimmt hat, wird einfach die Funktion auswertung() aufgerufen um zu zeigen, wie der aktuelle Stand der Umfrage aussieht.

Falls der User noch nicht abgestimmt hat und das Formular noch nicht abgeschickt hat, wird die Funktion formular() aufgerufen, um ihm dazu die Möglichkeit zu geben.

Hat der User das Formular abgeschickt und noch nicht an der Umfrage teilgenommen, wird zunächst überprüft ob die vom Formular übergebene id auch wirklich nur eine Zahl ist. Das ist wichtig um zu verhindern, dass unerwünschter Code eingeschleust wird!
Anschließend wird die Antwort, die der User gewählt hat aus der Datenbank geholt (über die aus dem Formular kommende id).
Falls es diese Antwort auch wirklich gibt, wird die Stimmanzahl einmal für die Antwort und dann nochmal für die Umfrage-Gesamtanzahl erhöht und schließlich wird das Ganze in der Datenbank gespeichert.

Nun brauchst du nur noch die von uns eben erstellte PHP-Datei in die Seite zu includen, in der die Umfrage zu sehen sein soll (am besten ganz am Anfang der Datei) und an der Stelle, an der die Umfrage dann platziert sein soll, mit PHP die Funktion umfrage(") aufzurufen. Gibst du in den Anführungszeichen eine Zahl an, wird die Umfrage mit dieser id angezeigt.

Um das Ganz noch hübsch zu machen, gibts hier die Stylesheet-Datei:


body {
font-family: arial;
font-size: 12px;
color:#747474;
margin:50px;
}

.umfrage {
width:250px;
margin:50px;
}

.umfrage .frage {
font-size:24px;
}

.umfrage .antworten {
padding:10px;
background-color:#f5f5f5;
}

.umfrage .antworten .antwort {
display:block;
margin-bottom:10px;
}

.umfrage .antworten .antwort .balken {
width:80%;
background-color:#d1d1d1;
height:15px;
float:left;
margin-right:10px;
}

.umfrage .antworten .antwort .balken .anteil {
background-color:#52c8ff;
height:15px;
}

.umfrage .antworten .antwort .text {
font-weight:bold;
}

.umfrage .umfragenfooter {
font-size:10px;
}

.umfrage .antworten .antwortenform {
list-style-type: none;
padding:0px;
}

.umfrage .antworten .abschicken {
background-color:#ff57a2;
border:1px solid #f13898;
}


Für dich wichtig zum Anpassen der Umfrage sind die width-Angabe bei .umfrage (das ist die Breite, die deine Umfrage einnehmen soll) und die Farbwerte, mit denen kannst du einfach mal ein wenig rumspielen. Kleiner Tipp: statt Farben für die Balken zu verwenden könntest du auch ein Hintergrundbild verwenden, dass einen schönen Verlauf hat!

Mehr zu dem Skript und ein Admin-Control-Panel gibts im Skript-Download-Bereich hier: KLICK

Ich weiß, dass man das Tutorial nicht zwingendermaßen braucht, wenn man sich auch einfach alles runterladen kann, aber ich dachte, dass der ein oder andere vielleicht wissen will, wie das ganze funktioniert ;).



6 Kommentare




Jel

... und das rockt noch viel mehr! :'D
Danke. <333
Jel. Smilie
(merci, dass es dich gibt *sing* xD)
am 30.04.2009 um 19:40 Uhr


Isa_G

Wouw, echt super :) VIELEN DANK!
Ich habs bissl umgebastelt und hab vor es in mein ACP einzubinden (also nicht deins aus dem anderen Tut zu nutzen). Du bekkommst aber natürlich einen Creditlink^^
am 07.05.2009 um 11:39 Uhr


Suzuki

Das Script ist toll Smilie
Allerdings habe ich ein Problem, nachdem ich die Umfrage eingebunden habe:
Immer, wenn ich auf \"Abschicken\" klicke, wird die Index-Seite aufgerufen - es wird keine Stimme gezählt (hab in der Datenbank geschaut) und die Statistik wird mir auch nicht angezeigt.
Das Script \"umfrage.inc.php\" habe ich nicht verändert °°
Kann mir jemand helfen? Smilie
am 08.07.2009 um 22:39 Uhr


Bianca

Dass die Index-Seite aufgerufen wird ist auch richtig :) Warum die Stimme nicht gezählt wird, kann ich so einfach nicht sagen, am besten zeigst du mir mal deinen Code :)
am 27.11.2009 um 12:50 Uhr


butterfly

Schade. Das Skript funktioniert leider nicht.
am 03.06.2010 um 20:10 Uhr


Bianca

@butterfly dein Kommentar hilft leider nicht sehr, was genau funktioniert denn nicht?
am 09.09.2010 um 11:28 Uhr