PHP: Umfragen mit Komfort
Anzeige
Die meisten - häufig zu sehenden - Umfrage-Skripte bieten keine Mehrfachauswahl, sondern nur eine einzige Stimme. Das liegt daran wie PHP Formulare mit Checkbox- und Radio-Elementen behandelt. Kein Grund zur Sorge, Dr. Web kann helfen.
Während Radio-Auswahllisten immer nur einen Wert zurückgeben und in PHP über$_POST['name'] oder einfach nur $name abgerufen werden können, muss eine Mehrfachauswahl mittels Ankreuzkästchen in ein Array, eine zweidimensionale Variable, gespeichert werden.
Beim Speichern ist es dann am einfachsten, jede gewählte Möglichkeit als eigenen Eintrag zu speichern. Um später trotzdem noch die Anzahl der Benutzer, die abgestimmt haben, zu ermitteln, wird eine einmalige ID-Kennzahl mitgespeichert.
Standard-Umfrage mit Mehrfachauswahl
Insgesamt werden drei einzelne Dateien benötigt. Die erste stellt die Auswahloptionen bereit, die zweite schreibt die Daten in eine Textdatei und die letzte Datei wertet die Ergebnisse wieder aus. Die erste Datei hat im Beispiel zwei Abfragen, eine Mehrfachauswahl „Liebste Webseite“, die die Daten in den Array $auswertung[] speichert. Die zweite Auswahl nutzt Radio-Buttons, die als Variable $surfen gespeichert werden. Eine Cookie-Überprüfung schaut, ob bereits gewählt wurde. Ist dem so, bricht das Skript durch den Befehl die(); ab.
Hier der Quellcode der ersten Datei:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head>
<title>Dr. Web Umfrage</title></head><body>
<?php
if($_COOKIE["drwebumfrage"] == "tg") {
echo "<br><br>Sie haben bereits abgestimmt!</body></html>";
die();
}
?>
<form name="vote" action="schreiben.php" method="post">
<p style="font-size:12px"> <br>
<b>Liebste Webseiten</b><br>
<input type="checkbox" name="auswertung[]" value="drweb.de">
drweb.de<br>
<input type="checkbox" name="auswertung[]" value="brandeins.de">
brandeins.de<br>
<input type="checkbox" name="auswertung[]" value="windowsupdate.com">
windowsupdate.com<br>
<br><br><br>
<input type="radio" name="surfen" value="privat">
Ich surfe meist privat<br>
<input type="radio" name="surfen" value="beruflich">
Ich surfe meist beruflich<br>
</p>
<p>
<input type="submit" name="send" value="Abstimmen"
style="width:200px;">
</p>
</form></body></html>
Die zweite Datei, schreiben.php, gibt eine Bestätigungsmeldung aus und schreibt den Überprüfungs-Cookie und die Werte in die Datendatei. Dazu wird zuerst eine zufällige Benutzer-ID generiert, die bisherigen Daten ausgelesen und die aktuellen dann angehängt.
Der Quellcode:
<?php
setcookie("drwebumfrage","tg",time()+(3600*24*14),"/");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head>
<title>Dr. Web Umfrage</title></head><body>
<p>Vielen Dank, Ihre Antwort wurde gespeichert.</p>
<?php
//--------------------------------- ID Erzeugen
mt_srand ((double)microtime()*1000000);
$zahl1 = mt_rand(0,12800);
$zahl2 = mt_rand(0,12800);
$zahl3 = mt_rand(0,12800);
$zahl4 = mt_rand(0,12800);
$id = $zahl1.$zahl2.$zahl3.$zahl4; ($id + $zahl4) * ($zahl2 / 2);
//zur Auswertung der Umfrage
$auswertung = $_POST[auswertung];
$surfen = $_POST[surfen];
$anzahl_gewaehlt = count($auswertung);
$source = "log.txt";
$fd = fopen ($source, "r");
$schreiben = fread ($fd, filesize ($source));
fclose ($fd);
for($i=0; $i < $anzahl_gewaehlt; $i++) {
$schreiben .= $auswertung[$i]."§§§".$surfen."§§§".$id."\n";
}
$fp = @fopen($source,"w+");
flock($fp,2);
fwrite($fp,$schreiben);
flock($fp,3);
fclose($fp);
?>
</body></html>
Die letzte Datei kümmert sich schließlich um die Auswertung der Daten, zählt die Gesamtstimmen und erkennt anhand der unterschiedlichen IDs, wie viele Personen abgestimmt haben. Die Statistik-Auswertung zählt die Ergebnisse aus und zeigt diese in Tabellenform an.
<html><head><title>Dr. Web Umfrage Auswertung</title></head><body>
<?php
//logdatei auswerten
$log = file('log.txt');
$gesamt = "";
$privat = 0;
$hoechster_wert = 0;
//-----------------------------------------
//wirkliche Personen anhand der ID
for($pcounter = 0; $pcounter < count($log); $pcounter++){
$gefunden = "";
$wert = explode("§§§",$log[$pcounter]);
for($pcounter2 = 0; $pcounter2 < count($ids); $pcounter2++){
if($ids[$pcounter2] == $wert[2]) { $gefunden = "ok"; }
}
if($gefunden != "ok") {
$ids[] = $wert[2];
$personen++;
if(ereg("§§§privat",$log[$pcounter])) { $privat++;
}
//Anzahl der untersch. Personen, die privat surfen
}
}
//------------------------------------------
// liebste Seite?
for($counter = 0; $counter < count($log); $counter++){
$gefunden = "";
$wert = explode("§§§",$log[$counter]);
for($counter2 = 0; $counter2 < count($ergebnisse); $counter2++){
if($ergebnisse[$counter2] == $wert[0]) {
$gefunden = "ok";
$ergebnis_anzahl[$counter2]++;
if($ergebnis_anzahl[$counter2] > $hoechster_wert) {
$hoechster_wert = $ergebnis_anzahl[$counter2]; }
}
}
if($gefunden != "ok") { $ergebnisse[] = $wert[0];
$ergebnis_anzahl[] = 1; }
}
//-------------------------------------------
// Ausgabe...
echo "<h2>Statistik-Informationen:</h2>";
echo "Wirkliche Teilnehmer: $personen. ";
echo "Stimmen insgesamt: ".count($log);
echo "<br>(Im Schnitt ".floor(count($log) / $personen)."
Stimmen pro Person)<br><br>";
echo "$privat Personen (von $personen Teilnehmern) surfen privat<br>";
echo "<br><br><br><h2>Auswertung der Klicks:</h2>";
echo '<table style="font-family: arial; font-size: 10px;
border: 1px dotted black; background-color: #f2f2f2;" cellpadding=5>';
for($counter3 = 0; $counter3 < count($ergebnisse); $counter3++){
echo "<tr><td>$ergebnisse[$counter3]</td><td>
$ergebnis_anzahl[$counter3]</td></tr>";
}
?>
Um die Ergebnisse grafisch aufzuwerten, können Balkengrafiken eingefügt werden, deren Länge sich dynamisch aus dem Wert errechnet.
Das Skript ist beinahe beliebig erweiterbar. Sollen mehr Antwortmöglichkeiten für die Mehrfachauswahl hinzugefügt werden, muss nur bei dem Name-Attribut des Eingabefeldes darauf geachtet werden, dass das Ergebnis auch wirklich in einen Array geschrieben wird:
<input type="checkbox" name="auswertung[]" value="drweb.de">
Ohne die beiden eckigen Klammern würde nur der zuletzt gewählte Wert gespeichert.
Verwandte Artikel
1 Kommentar zu “PHP: Umfragen mit Komfort”
Meine Meinung
Bitte beachten Sie: Werbung und Spam sind unerwünscht und können eine Rechnung zur Folge haben. Woher kommen die Bilder neben den Kommentaren?









Ich will nur testen