Anzeige
Tutorialbeschreibung

Ein einfaches Poll bzw. PHP-Umfrage-Script

Ein einfaches Poll bzw. PHP-Umfrage-Script

Umfragen Script

Hallo!
Für einen Poll benötigen wir als erstes ein paar Tabellen.
Fügt sie am besten per phpMyAdmin ein.
Bilder

Tabellen

Als erstes kommt die Tabelle "Poll". Sie Speichert unsere Frage und das Datum.
Alternativ könnt ihr für die Frage auch den Typ TEXT verwenden, bei mir reicht aber ein VARCHAR mit 120 Zeichen aus.
Da wir dynamisch viele Antworten wollen, benötigen wir noch eine Tabelle "Poll_answers" (oder so ähnlich). Sie Speichert die Antworten des zugehörigen Polls und die Klicks.
Damit der User nicht mehrmals abstimmen kann, speichern wir seine IP und wenden noch den Trick an, dass die ersten beiden Stellen in der IP ja immer gleich sind. Das machen wir in der Tabelle "Poll_IP".

Tabelle "Poll"

Wir benötigen 4 Felder:
Feld 1: Name: ID Typ: INT Extra: Auto Increment Primärschlüssel
Feld 2: Name: Frage Typ: VARCHAR Länge: 120
Feld 3: Name: Datum Typ: Date
Feld 4: Name: Aktiv Typ: INT
Bilder

Tabelle "Poll_Answers"

Für die Tabelle "Poll_Answers" benötigen wir 4 Felder:
Feld 1: Name: ID Typ: INT Extra: Auto Increment   Primärschlüssel
Feld 2: Name: Antwort Typ: VARCHAR Länge: 90
Feld 3: Name: PollID Typ: INT
Feld 4: Name: Klicks Typ: INT
Bilder

Tabelle "Poll_IP"

Für die Tabelle "Poll_IP" benötigen wir 3 Felder:
Feld 1: Name: IP Typ: VARCHAR Länge: 16
Feld 2: Name: Datum Typ: Date
Feld 3: Name: PollID Typ: INT
Bilder


So, am Ende könnt ihr noch eine Frage einfügen.
Achtet dabei darauf, dass bei den Antworten in "PollID" die ID der Frage in der Tabelle Poll steht.

PHP

Jetzt kommen wir zu den PHP Scripten. Als erstes braucht ihr natürlich eure MySQL Verbindung (ich setz mal voraus das ihr das könnt).
Datei: Index.php
In der Index Datei erstellen wir das Formular mit den Fragen und antworten.
Dazu erstellen wir erstmal ein neues Form:

<form method='post' action='vote.php'>

</form>

Jetzt rufen wir die Frage aus unserer Datenbank ab.
Der SQL String sieht wie folgt aus: "SELECT * FROM `poll` WHERE `Aktiv` = 1 LIMIT 0,1"
Da nur die Umfrage angezeigt werden soll, die den Wert Aktiv auf 1 hat, hab ich das WHERE noch eingebaut.
Jetzt müssen wir nur noch den Query ausführen und in ein Array holen. Außerdem speicher ich noch die ID des Polls, da wir diese später noch brauchen!
Der Code sieht dann wie folgt aus:

<form method="post" action="vote.php">
<?php
include("config.inc.php"); // Einbinden der Verbindung zur Datenbank
$sql = "SELECT * FROM `poll` WHERE `Aktiv` = 1 LIMIT 0,1"; // SQL String. Limit ist 1
$query = mysql_query($sql); // Query ausführen
$row = mysql_fetch_row($query); // In Array packen
echo $row[1]."<br>"; // row[1] ist im unserem fall die Frage
echo "<input type='hidden' name='PollID' value='".$row[0]."' />"; //Wir speichern uns die Poll ID für spätere Verwendung
?>
</form>

(bei mir wird die config Datei eingebunden, die die Verbindung zur Datenbank herstellt)

Wenn ihr jetzt testet werdet ihr schon die Frage sehen.
Als nächstes brauchen wir die Antworten zu der Frage.
Dazu verwenden wir folgenden SQL String:  "SELECT * FROM `poll_answers` WHERE `PollID` = < $row[0] >"
$row[0] ist hierbei die ID vom Poll, die wir in unserer Abfrage mit der Frage schon bekommen.
Jetzt den query ausführen und diesmal mit einer While schleife arbeiten, da es ja mehrere Ergebnisse sind.
Bei jedem Durchlauf wird nun ein <input type='radio'  value=<ID der Antwort> name=antwort /> <Antwort> erstellt, also ein Radiobutton der als Wert die ID der Antwort hat.
Das sieht dann so aus:

<form method="post" action="vote.php">
<?php
include("config.inc.php");
$sql = "SELECT * FROM `poll` WHERE `Aktiv` = 1 LIMIT 0,1";
$query = mysql_query($sql);
$row = mysql_fetch_row($query);
echo "<b>".$row[1]."</b><br>";
echo "<input type='hidden' name='PollID' value='".$row[0]."' />";
//------------------------ Neuer Bereich
$sql = "SELECT * FROM `poll_answers` WHERE `PollID` = ".$row[0]; // Abfrage der Antwort wo die ID des Polls die unserer Frage ist
$query = mysql_query($sql); // Query ausführen
while($row = mysql_fetch_row($query)) // So lange bis das ende erreicht ist
{
    echo "<input type='radio' name='answer' value='".$row[0]."' />".$row[1]."<br>"; // Radiobutton mit Frage ausgeben
}
?>
</form>

Jetzt sieht das ganze doch schon richtig gut aus, ihr könnt mal testen.
Natürlich kann oder sollte man das ganze noch mit CSS verschönern, was jetzt aber nicht sinn und zweck hier ist :-).
So, jetzt fehlt nur noch der Submit Button.
Platziert ihn einfach unter dem PHP Abschnitt.

<input type='submit' value='Abstimmen!' />

So, jetzt kommt das einfügen in die Tabellen In der Datei Vote.php .
Das ist schon komplizierter.
Die Erklärung werde ich im Code vornehmen:

<?php
include("config.inc.php");
if(!isset($_REQUEST['answer'])) // Überprüfen ob Etwas angeklickt wurde
{
    echo "Du musst etwas anklicken! <a href='index.php'>Zur&uuml;ck</a>"; // Wenn nicht dann bitte zurück
}
else //Ansonsten
{
$sql = "SELECT * FROM `poll_answers` WHERE `PollID` = ".$_REQUEST['PollID']." AND `ID` = ".$_REQUEST['answer'].""; // $_REQUEST['PollID'] ist die ID des Polls, das Hidden Field. 'answer' ist der Wert des Radio Buttons, also die ID der Antwort. Somit wird hier die Antwort geholt, die ausgewählt wurde
$query = mysql_query($sql); //Antwort holen
$row = mysql_fetch_row($query); // In Array schreiben
$klicks = $row[3] + 1; // Hier werden die Klicks genommen, und einer hinzugefügt.
$sql = "UPDATE `poll_answers` SET `Klicks` = ".$klicks." WHERE `ID` = ".$_REQUEST['answer']; // Den Klick noch hinzufügen, die Tabelle also updaten. Hier wird wieder nur der Eintrag geupdatet, den der Benutzer ausgewählt hat (mit der Where abfrage, 'answer' war ja die ID)
mysql_query($sql); // Ausführen
$sql = "INSERT INTO `poll_ip` (`IP`, `Datum`, `PollID`) VALUES ('".$_SERVER['REMOTE_ADDR']."', NOW(), '".$_REQUEST['PollID']."');"; // Hier wird die IP ($_SERVER['REMOTE_ADDR']) des Benutzers eingefügt. Ausserdem wird die Poll ID aus unserem Hidden Field geholt
mysql_query($sql); // Ausführen
echo "Danke f&uuml;r deine Teilnahme! <a href='ergebnisse.php'>Ergebnisse</a></p>"; // Bestätigung und weiterleitung zu Ergebnissen.
}
?>

So ich hoffe mal das war verständlich :-)
Also es wird halt die selektierte Antwort aus der Datenbank nochmal geholt um zu gucken wie viel Klicks schon waren.
(Scroll weiter hoch zu den Tabellen, dann siehst du den Eintrag mit den Klicks)
Dann wird noch einer dazu addiert, da der Benutzer ja dafür gestimmt hat.
Das wird dann mit UPDATE ausgeführt.
Zum Schluss wird noch die IP, das Datum und die ID vom Poll in unsere Datenbank "poll_ip" eingefügt.
Noch ein ein nettes "Danke für deine Teilnahme" mit einem Link zu den Ergebnissen und fertig. Auch hier gilt, es wäre sinnvoll auch hier wieder mit CSS zu arbeiten.
Aber halt! Wir haben doch etwas wichtiges vergessen... wir speichern die IP's ja, damit man nicht mehrmals voten kann.
Doch von einem normalen Benutzer ändert sich die IP alle 24 Stunden.
Da nimmt man sich den Trick zur abhilfe, dass die ersten beiden Stellen der IP immer gleich bleiben.
Das kann zwar auch mal schief laufen, deshalb sollte man lieber Kekse.. aäh also Cookies verwenden.
Nur leider ist mir das zu spät eingefallen
Bilder

Also schnell noch was im Code der Index.php geändert.
Erläuterung im Code:

<form method="post" action="vote.php">
<?php
include("config.inc.php");
$sql = "SELECT * FROM `poll` WHERE `Aktiv` = 1 LIMIT 0,1";
$query = mysql_query($sql);
$row = mysql_fetch_row($query);

$sql2 = "SELECT * FROM `poll_ip` WHERE `IP` LIKE '%".substr($_SERVER['REMOTE_ADDR'], 0, strpos($_SERVER['REMOTE_ADDR'], ".", 4))."%' AND `PollID` = ".$row[0].";"; //Hier wird nach der IP des Benutzers gesucht. Hierbei werden die zeichen gelöscht, die nach dem zweiten Punkt vorkommen (wir errinnern uns, dass die ersten zwei Stellen immer gleich bleiben).
$query2 = mysql_query($sql2); // Ausführen
$voted = mysql_fetch_row($query2); // In Array
if($voted != "") //Wenn nichts gefunden wurde, gabs nichts. Aber wenn was gefunden wurde (!=), hat der User schon gevoted
{
echo "Du hast leider schon gevotet!";
}
else
{
echo "<b>".$row[1]."</b><br>";
echo "<input type='hidden' name='PollID' value='".$row[0]."' />";
$sql = "SELECT * FROM `poll_answers` WHERE `PollID` = ".$row[0];
$query = mysql_query($sql);
while($row = mysql_fetch_row($query))
{
    echo "<input type='radio' name='answer' value='".$row[0]."' />".$row[1]."<br>";
}
?>
<input type='submit' value='Abstimmen!' />
<?
}
?>
</form>

So, jetzt fehlen uns nur noch die Ergebnisse. Dazu hab ich eine Neue Seite "Ergebnisse.php" erstellt. Sie zeigt die Ergebnisse der letzen 5 Umfragen an.
Erläuterung im Code:

<?php
include("config.inc.php");
$sql = "SELECT * FROM `poll` ORDER BY `Datum` DESC LIMIT 0,5"; // Alle Fragen nach Datum sortieren, maximal 5
$query = mysql_query($sql); // Ausführen
while( $row= mysql_fetch_row($query)) //Für alle 5 wiederholen
{
    echo "<b>Ergenisse der Umfrage:<br>".$row[1]." vom ".$row[2]."</b>:<br>"; //$row[1] ist die Frage, $row[2] das Datum
$sql2 = "SELECT COUNT(`PollID`) FROM `poll_ip` WHERE `PollID` = ".$row[0];
$query2 = mysql_query($sql2);
$row2 = mysql_fetch_row($query2);
    $teilnehmer = $row2[0]; //Teilnehmer in andere Variable schreiben
    $sql3 = "SELECT * FROM `poll_answers` WHERE `PollID` = ".$row[0];
    $query3= mysql_query($sql3);
    while($row3 = mysql_fetch_row($query3))
    {
        echo "<table>"; // Tabelle...
        echo "<tr><td>".$row3[1].":</td><td>".round($row3[3] / $teilnehmer * 100) ."%</td></tr>"; // Neue Tabellenreihe, $row[1] war die Frage, $row[3] die Klicks geteilt durch die Anzahl der Teilnehmer * 100
        echo "</table>"; //...
    }   
}
?>
Ein fertiges schönes Poll script könnte so aussehen:
Bilder

So. euer Poll Script sollte nun fertig sein und funktionieren.
Ich hoffe ich konnte euch helfen!
Falls ihr noch fragen habt, fragt mich:
Email: webmaster@source-forum.de
ICQ: 286742913

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 20.01.2011 - 11:34

vielen dank, ist super erklärt und funktioniert gut... *****

Portrait von Supersuzi
  • 13.09.2010 - 08:11

super erklärt, Danke

Portrait von SnowDragon
  • 24.01.2010 - 10:38

Gut erkährt, herzliches danke schön

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 19.01.2010 - 21:50

Sehr schönes und ausführliches Tutorial. DANKE!

Portrait von icehawk2
  • 17.01.2010 - 16:58

Sowas hab ich gesucht. . . Danke dir werd mal sehen, was sich damit anfangen lässt. . .

Portrait von WeihnachtsmannSek
Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 07.05.2009 - 16:38

funktioniert echt gut und lässt sich erweitern!

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 21.12.2008 - 21:12

Sehr gutes Tut. hab schon länger nach sowas gesucht, aber meist nur Müll gefunden. Schönes Ding!

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 10.10.2008 - 11:14

warum packst du das alles nicht in klassen ein?
nebenbei habe ich noch nicht entdeckt wo du den poll erstellst... aber das grundgerüst ist auf jedenfall erweiterbar!

Portrait von sund
  • 05.01.2008 - 14:22

sowas habe ich genau gesucht. thx

Portrait von Tobbsn
  • 04.01.2008 - 17:08

mysql injections gehen aber trotzdem oder? *scnr*

us ein gutes Tuto, warum aber nicht gliech OOP? aber trotzdem gutes tut! danke.

gruß
tob

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 04.01.2008 - 12:50

danke hast dir viel mühe gemacht, werd ich sicher mal brauchen, danke.

prosit 2008

x
×
×