SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuch.php?group=41
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Online-Umfrage


Dieses Thema ist immer wieder etwas, das Entwickler und Anwender gleichermaßen vor eine Herausforderung stellt, die es zu bewältigen gilt. Der Anwender muss eine Wahl treffen, und der Entwickler muss dafür sorgen, dass die Stimmabgabe ordnungsgemäß verarbeitet wird.

Im folgenden Beispiel versuche ich, Ihnen als Entwickler eine Lösung an die Hand zu geben, mit deren Hilfe Sie hoffentlich in der Lage sind, erfolgreich Online-Umfragen durchzuführen, sei es für Wahlen oder für die Lieblingsfarbe Ihrer Besucher.

Die Online-Umfrage setzt sich aus zwei wesentlichen Skripts zusammen.

Zusätzlich wurden folgende drei Ordner angelegt:




Bild 5.10: Dateischema der Atomic-Umfrage{PSP}1. Umfrage.php

<?php
if (isset($_POST["ergebnis"])) {
  // Aktuelle Sperre 1 Minute
  // 30 Tage Sperre time()+60*60*24*30
  setcookie("abgestimmt","ja",time()+60);
}

$thema = "Atomic-Umfrage 2005";
$auswahl = array("Super","Sehr Gut","Gut","Naja","Schlecht");
$anzahl = count($auswahl);

?>
<html>
<head>
<title>Atomic-Umfrage</title>
<link rel='stylesheet' type='text/css' href='css/umfrage.css'>
</head>
<body>
<img src='bild/umfragelogo.gif' width='506' height='62'><br>
<h3><?php echo $thema ?></h3>
<form method='post' action='<?php echo $PHP_SELF; ?>'>
<p>
<?php

foreach ($auswahl as $key=>$eintrag) {
  echo "<input type='radio' name='ergebnis' value='$key'> $eintrag<br>\n";
}

?>
</p>
<?php
if (empty($_COOKIE["abgestimmt"]) && !isset($_POST["ergebnis"])) {

// Submit nur zeigen, wenn Formular noch nicht abgeschickt wurde
echo "<input type='submit' value='Daten senden'>";

} else {
echo "<p>Danke für die Übermittlung der Daten!</p>\n";

// Formular abgeschickt? Aber bisher noch nicht abgestimmt?
if (empty($_COOKIE["abgestimmt"]) && isset($_POST["ergebnis"])) {

// Dateiname in Variable speichern
$datei="daten/stimmen.txt";

// Datei vorhanden?
if (file_exists($datei)) {
  $fp=fopen($datei,"r+");
} else {
  $fp=fopen($datei,"w");
}

// Datei einlesen
$stimmen=fread($fp,filesize($datei));

// String aus Datei in Array zerlegen
$stimmen=explode(",",$stimmen);

// Der gewählte Punkt wird um 1 erhöht!
$stimmen[$_POST["ergebnis"]]++;

// Stimmen in einem String zusammensetzen
for ($i=0;$i<$anzahl;$i++) {
  $total .= $stimmen[$i] .",";
}

// Neuen String in Datei schreiben
rewind($fp);
fputs($fp,$total);
fclose($fp);
}
}
?>
</form>
<p>
[ <a href='ergebnis.php' target='_blank'>Umfrageergebnisse betrachten</a> ]
</p>
</body>
</html>




Bild 5.11: Aufbau der dynamischen Bestandteile der Eingabemaske{PSP}
Bild 5.12: Umfrage samt Eingabemaske

Die vorliegende Umsetzung legt mithilfe eines Cookies fest, dass jeder Onlinewähler lediglich einmal pro Minute eine Stimme abgeben kann. Natürlich lässt sich diese Sperrzeit beliebig erhöhen.

Hinweis: Die eingesetzte Sperre stellt keinen absoluten Schutz dar. Sie können damit jedoch bereits eine gewisse Kontrolle über die Online-Umfrage erreichen. Eine Kombination aus Cookie und IP-Zeitsperre würde zusätzliche Sicherheit bieten, eine absolute Sperre wird es jedoch ohne größeren Aufwand nicht geben.

Um die Umfrageergebnisse zu betrachten, wird folgendes Skript verwendet:

2. Ergebnis.php

<?php

$thema = "Atomic-Umfrage 2005";
$auswahl = array("Super","Sehr Gut","Gut","Naja","Schlecht");
$farben = array("9999FF","8888FF","7777FF","6666FF","5555FF");
$anzahl = count($auswahl);

?>
<html>
<head>
<title>Atomic-Umfrage – Ergebnis</title>
<link rel="stylesheet" type="text/css" href="css/umfrage.css">
</head>
<body>
<img src='bild/umfragelogo.gif' width='506' height='62'><br>
<h3><?php echo $thema; ?> – Ergebnisse</h3>
<?php
$datei="daten/stimmen.txt";
@$fp=fopen($datei,"r");
@$stimmen=fread($fp,filesize($datei));
@fclose($fp);
// String zerlegen, Array entsteht
$stimmen=explode(",",$stimmen);

for ($i=0;$i<$anzahl;$i++) {
  $gesamt += $stimmen[$i];
}

if ($gesamt>0) {
// Höchstlänge der Balken angeben
$laenge=400;

for ($i=0;$i<$anzahl;$i++) {
// Anteil der Balken
$blaenge=$stimmen[$i]*$laenge/$gesamt;

// Werte auf ganze Zahlen runden
$blaenge= round($blaenge);

// Prozentwert ermitteln und ausgeben
$prozent = sprintf('%1.1f', 100*$stimmen[$i]/$gesamt);

echo "
<table border='0'>
<tr>
<td width='100'>$auswahl[$i]</td>
<td> </td><td width='$blaenge' bgcolor='$farben[$i]'> </td>
<td> <i>$prozent% ($stimmen[$i])</i></td>
</tr>
</table>
";
}

echo "<p>Anzahl der Stimmen: <b>$gesamt</b></p>";
} else {
echo "<p>Bisher wurden noch keine Stimmen abgegeben!</p>";
}
?>
</body>
</html>




Bild 5.13: Umfrageergebnis – Tabellenfelder dienen hier als Anzeige{PSP}Sie können durch eine leichte Anpassung die Umfrageergebnisse auch mithilfe von Grafikdateien wiedergeben. Hierfür müssen Sie lediglich die folgende echo-Codezeile einsetzen.
echo "
<table border='0'>
<tr>
<td width='100'>$auswahl[$i]</td>
<td> </td><td><img src='bild/balken_ende_l.gif' width='6' height='10'><img src='bild/balken.gif' width='$blaenge' height='10'><img src='bild/balken_ende_r.gif' width='6' height='10'> </td>
<td> <i>$prozent% ($stimmen[$i])</i></td>
</tr>
</table>
";




Bild 5.14: Umfrageergebnis – Balkendarstellung