Umfrage, Funktion
Oft möcht man die Einschätzung der Besucher erfahren, mit einer einfach
gestalteten Umfragemöglichkeit hat man eine gute Chancen diese zu erfahren.
Dazu erstellen wir ein Kästchen, wie rechts auf dieser Webseite, mit
dem Titel Umfrage. Bewusst gibt es nur wenige Antwortmöglichkeiten.
Es wird beim Senden geprüft, ob überhaupt eine Antwort gewählt wurde
und wenn ja, ob nicht bereits gewählt wurde (IP). Nach dem "senden"
werden die Resultate angezeigt.
Ein Beispiel erüberigt sich, da die hier rechts eingeblendete Umfrage
verwendet werden kann.
Zur Erstellung werden folgende Dateien benötigt:
- umfrage.php das auf den Webseiten einzubindende Script
- gruen.gif das Bild für den Prozentanteilsbalken
- stern.jpg für die Sterne
- umfrage_anz.php für den Administrator zur Gesamtübersicht
Als erstes erstellen wir, am Besten mit
phpMyAdmin, in der MySQL-Datenbank unsere Tabelle.
Das Programm phpMyAdmin ist bei den meisten Providern bereits
installiert und hilft uns, unsere Datenbank zu warten.
Code MySQL - Datenbank
PHP & MySQL: Umfrage v1.0, SQL Datenbank# Tabellenstruktur für Tabelle `umfrage`
CREATE TABLE `umfrage` (
`id_umfrage` int(11) NOT NULL AUTO_INCREMENT,
`frage` varchar(15) NOT NULL DEFAULT '',
`antwort` char(1) NOT NULL DEFAULT '',
`ip_umfrage` varchar(15) NOT NULL DEFAULT '',
`unix_time` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id_umfrage`),
KEY `frage` (`frage`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Script Update:
29.04.08
Erklärungen zum Code
Zu den Zeilen:
1: Hier steht als Kommentar der Inhalt dieses Scriptes. Dieser
könnte auch weggelassen werden.
3 - 11: Die Definition unserer Tabelle
4: Die ID wird festgelegt, zudem wird angeben, dass diese sich
selbst vergibt mittels einem Zähler (auto_increment).
Es empfiehlt sich, für die ID nie nur "id" zu verwenden, sondern immer einen
Namen zu vergeben, der zur Tabelle passt. Denn, wenn mehrere Tabellen
verwendet werden sollten, könnte es leicht zu Verwechselungen kommen.
5 - 10: Es folgen die diversen Felder.
5: Der Name der Umfrage. Damit können mit einer einzigen DB-Tabelle
mehrere Umfragen ausgewertet werden.
6: Als Anzwort geben wir eine einstellige Ziffer, darum
als Spaltentyp char(1). Mit Ziffern erleichtern wir uns die Auswertung massiv.
7: Zu jeder Eintragung wird die IP der Benutzers gespeichert.
8: Zu jeder Eintragung wird die UNIX-Zeit gespeichert, damit verhindern
wir, dass ein Benutzer beliebig viele Eintragungen vornehmen kann.
10: Um die Abfragen aus der DB zu beschleunigen, legen wir einen Key
auf "frage", was uns natürlich nur nützt wenn mehrere Fragen verwaltet werden.
Nun erstellen wir mit einem Editor eine Datei "umfrage.php"
und fügen folgendes Script ein:
Code Umfrage
Datei: umfrage.php
PHP & MySQL: Umfrage v1.0, include
<!-- poll/umfrage.php -->
<?php
// Mitgeben an dieses Script:
// Frage für DB, max. 15 Zeichen -> $frage
// Die eigentliche Frage -> $fragestellung
// Erklärung zur Frage -> $fragezusatz
// Ausgangsbasis der Anzeigen
$anzeigen_umfrage = 'ja';
$anzeigen_fehler = 'nein';
$anzeigen_fehler_ip = 'nein';
$anzeigen_antwort = 'nein';
$anzeigen_ergebnis = 'nein';
// Antwort senden
if(isset($_POST['submit_umfrage'])) {
switch ($antwort_f) {
case '3':
$antwort_z = 'ja';
$antwort = '3';
break;
case '2':
$antwort_z = 'teilweise';
$antwort = '2';
break;
case '1':
$antwort_z = 'wenig';
$antwort = '1';
break;
case '0':
$antwort_z = 'nein';
$antwort = '0';
break;
default:
$antwort_z = '';
$antwort = '';
break;
}
if ( $antwort == '' ) {
$anzeigen_fehler = 'ja';
}
else {
$unix_time_min = $unix_time - 7200 ; // Anzahl Sekunden für neue Abstimmung -> 2 Std.
$query_umfrage = "SELECT * FROM umfrage
WHERE frage = '".$frage."'
AND ip_umfrage = '".$ip_umfrage."'
AND unix_time > '".$unix_time_min."'
";
if ( $num_umfrage == 0 ) {
$anzeigen_umfrage = 'nein';
$anzeigen_antwort = 'ja';
$anzeigen_ergebnis = 'ja';
// eintragen in DB
$query_umfrage_e = "INSERT INTO umfrage (frage, antwort, ip_umfrage, unix_time)
VALUES('$frage','$antwort','$ip_umfrage','$unix_time')";
}
else {
$anzeigen_fehler_ip = 'ja';
$anzeigen_umfrage = 'nein';
$anzeigen_ergebnis = 'ja';
}
}
}
?>
<div id="poll">
<h6>Umfrage</h6>
<?php
<p class="tooltipp" onmouseover="return overlib(\''.$fragezusatz.'\', CELLPAD, 5, 5, TEXTSIZE, \'10pt\' );"
onmouseout="return nd();">'.$fragestellung.'</p>
';
if ( $anzeigen_fehler == 'ja' ) {
echo '<p class="center rot"><strong>Keine Auswahl!</strong></p>';
}
if ( $anzeigen_fehler_ip == 'ja' ) {
echo '<p class="center rot"><strong>Bereits Abgestimmt!</strong></p>';
}
if ( $anzeigen_umfrage == 'ja' ) {
<form method="post" action="'.htmlspecialchars($_SERVER['PHP_SELF']).'" name="umfrage" id="umfrage" >
<fieldset>
<p><input type="radio" name="antwort" value="3" /> ja</p>
<p><input type="radio" name="antwort" value="2" /> teilweise</p>
<p><input type="radio" name="antwort" value="1" /> wenig</p>
<p><input type="radio" name="antwort" value="0" /> nein</p>
<p class="center"><input type="submit" class="kl" name="submit_umfrage" value="senden" /></p>
</fieldset>
<input type="hidden" name="ip_umfrage" value="'.$_SERVER['REMOTE_ADDR'].'" />
<input type="hidden" name="frage" value="'.$frage.'" />
</form>
';
}
if ( $anzeigen_antwort == 'ja' ) {
<p class="center"><strong>Ihre Antwort:<br /><span class="rot">'.$antwort_z.'</span></strong></p>
';
}
if ( $anzeigen_ergebnis == 'ja' ) {
<p class="center"><strong>Das Ergebnis:</strong></p>
';
$query_erg_3 = "SELECT COUNT(antwort) AS ant_3 FROM umfrage WHERE frage = '".$frage."'
AND antwort = '3' ";
if ($ant_3 == '' ) { $ant_3 = 0 ; }
$query_erg_2 = "SELECT COUNT(antwort) AS ant_2 FROM umfrage WHERE frage = '".$frage."'
AND antwort = '2' ";
if ($ant_2 == '' ) { $ant_2 = 0 ; }
$query_erg_1 = "SELECT COUNT(antwort) AS ant_1 FROM umfrage WHERE frage = '".$frage."'
AND antwort = '1' ";
if ($ant_1 == '' ) { $ant_1 = 0 ; }
$query_erg_0 = "SELECT COUNT(antwort) AS ant_0 FROM umfrage WHERE frage = '".$frage."'
AND antwort = '0' ";
if ($ant_0 == '' ) { $ant_0 = 0 ; }
$ant_tot = $ant_3 + $ant_2 + $ant_1 + $ant_0;
$ant_mit = ($ant_3 * 3 + $ant_2 * 2 + $ant_1) / $ant_tot ; // Mittelwert
$ant_ste = $ant_mit / 3 * 5 ; // Anzahl Sterne
$stern_breite = round($ant_ste * 15, 0 ); // Anzahl Sterne mal deren Breite
$proz_3 = round(100 / $ant_tot * $ant_3, 0);
$proz_2 = round(100 / $ant_tot * $ant_2, 0);
$proz_1 = round(100 / $ant_tot * $ant_1, 0);
$proz_0 = round(100 / $ant_tot * $ant_0, 0);
<div>
<div class="stern" style="width:'.$stern_breite.'px"></div>
</div>
<p><span class="proz">'.$proz_3.'%</span>
<strong>ja</strong></p>
<img src="/poll/gruen.gif" width="'.$proz_3.'" height="12" alt="Anteil: ja" title="Anteil: ja" />
<p><span class="proz">'.$proz_2.'%</span>
<strong>teilweise</strong></p>
<img src="/poll/gruen.gif" width="'.$proz_2.'" height="12" alt="Anteil: teilweise" title="Anteil: teilweise" />
<p><span class="proz">'.$proz_1.'%</span>
<strong>wenig</strong></p>
<img src="/poll/gruen.gif" width="'.$proz_1.'" height="12" alt="Anteil: wenig" title="Anteil: wenig" />
<p><span class="proz">'.$proz_0.'%</span>
<strong>nein</strong></p>
<img src="/poll/gruen.gif" width="'.$proz_0.'" height="12" alt="Anteil: nein" title="Anteil: nein" />
<p>'.$ant_tot.' Teilnehmer</p>
';
}
?>
</div>
<!--
Quelle Script: http://www.zudila.ch/scripte/php_umfrage.php
Zudila Umfrage v1.0, GPL
-->
<!-- /poll/umfrage.php -->
Script Update:
29.04.08
Erklärungen zum Code
Es versteht sich, dass dieses Script so alleine nicht funktioniert!
Dazu muss es in eine Webseite eingebunden werden,
Beispiel mit: <?php include(poll/umfrage.php); ?>, je nach dem Pfad.
Empfehlenswert ist auch dieses Verzeichnis mit einer .htaccess-Datei zu
schützen!
Zudem, muss die Datenbank bereits bekannt sein:
MySQL Datenbankzugang.
Auch ist zu beachten, dass die hier verwendeten Variablen in den Webseiten
wo dieses Script includiert wird, nicht bereits verwendet werden.
Zu den Zeilen:
1: Abstand um den Quelltext übersichtlicher zu halten.
2: Im Quelltext soll stehen, dass der folgende Teil includiert wird,
das hilft bei einer Fehlersuche.
5 - 8: Hier stehen die erwarteten externen Variablen.
$frage: der Titel in der DB.
$fragestellung: die angezeigte Frage (im Beispiel grün).
$fragezusatz: der per JavaScript eingeblendete Zusatztext beim
Überfahren der Fragestellung. Wichtig, diese Variable darf keinen
Zeilenumbruch enthalten.
11 - 15: Welche Teile angezeigt werden, wenn man neu auf diese Webseite
kommt wird hier festgelegt. Diese Struktur erleichtert uns die Übersicht
im Ablauf massiv.
18 - 75: Die zu durchlaufenden Zeilen beim Senden des Formulares.
19: Übernahme von "antwort".
21 - 42: Mit der Funktion "switch" prüfen wir nun die "antwort".
Wichtig, in case müssen die Ziffern in "'" stehen! Zur Anzeige ordnen wir
den Ziffern Texte zu.
Sollte keine der erwarteten Ziffern übergeben worden sein (default), wird der
"antwort" NULL zugeordnet.
43 + 44: Die restliche Variablen werden übernommen.
45: Der aktuelle Zeitpunkt wird als UNIX-Zeit ermittelt.
47 - 49: Sollte beim Senden nichts ausgewählt worden sein, so wird die
Verarbeitung beendet und dafür die Fehlermeldung von Zeile 87 - 89
angezeigt.
50 - 74: Ist ein richtige "antwort" vorhanden werden diese Zeilen durchlaufen.
51: Wir legen die Sperrzeit fest, in der mit der gleichen IP nicht
nochmals abgestimmt werden kann.
Man darf eine IP nicht einfach für immer sperren! Denn fast alle
Benutzer kommen mit einer dynamisch zugeteilten IP.
52 - 58: Abfrage in de DB, ob bereits abgestimmt wurde.
60 - 68: Ist kein entsprechender Eintrag bereits vorhanden, kann dieser
nun in die DB eingetragen werden.
Die anzuzeigenden Teile werden zugeordnet.
69 - 73: Wurde bereits abgestimmt, erfolgt nur die Anzeige der Ergebnisse.
78 - 177: Der auf der Webseite anzuzeigende Block. Er wird mit der id="poll"
umfasst und per CSS definiert.
82 - 85: Die extern definierten Variablen werden eingebunden. Hier wird
auch der bei onMouseOver angezeigte Block definiert. Mehr dazu unter:
overLIB,
oder mit Analyse dierer Webseite und deren Einbindung der JavaScripte.
87 - 89: Der Teil, wenn keine Auswahl erfolgte.
90 - 92: Der Teil, wenn bereits abgestimmt wurde.
93 - 107: Der Teil, wenn noch abgestimmt werden kann.
95 - 105: Das eigentliche Formular.
96 + 102: "fieldset" erzeugt einen Rahmen und verbindet die
Eingabefelder logisch.
103: Wir ermitteln die IP um sie versteckt dem Formular mitzugeben.
104: die extern festgelegte "frage" wird mitgegeben.
Sollten wir mehrere Umfragen benötigen, so muss nur dieser Wert
angepasst werden.
108 - 112: Die eigene Antwort wird allenfalls angezeigt.
113 - 174: Das allenfalls anzuzeigende Ergebnis.
117 - 120: Nun werden alle "ja" (= 3) zur entstrechenden "frage"
summiert. Also wie oft kommt "ja" vor?
121: Sollte noch kein eintag dazu vorhanden sein, eine "0" gesetzt.
117 - 121: Danach wird dieser Teil noch 3 x ausgeführt, für jede der
möglichen Antworten. Dies könnte in einer Schlaufe schöner und etwas kürzer
programmiert werden. Die saubere Lösung ist aber nicht einfacher
nachzuvollziehen. In Anbetracht von nur 4 Antworten lassen wir es so.
Für die Grafische Ausgabe berechnen wir nun verschiedene Werte.
141: Das Total aller Antworten.
142: Der Mittelwert aller Antworten. Nun ist ersichtlich, wieso wir in
der DB keine Texte sondern nur Werte eingegeben haben, das Rechnen ist
so sehr einfach.
143: Im Ergebnis zeigen wir 0 - 5 Sterne an. Wir waben aber Werte
zwischen 0 und 3. Somit rechnen wir die Anzahl der Sterne um.
144: in der Anzeige sind maximal 5 Sterne mit je einer Breite von 15 Pixel
sichtbar. Wir rechnen nun die Anzahl Pixel aus, die in der Breite gezeigt werden.
So kann auch nur ein Teil eines Sternes ersichtlich sein.
Die Rundung ist nötig, da nur ganze Pixel gezeigt werden können.
146 - 149: Für die grünen Balken muss deren Breite berechnet werden.
Für 100 % würde der Balken genau 100 Pixel breit, das in unserem Beispiel
gut geht, denn der ganze Kasten ist 120 Pixel breit. Ansonsten müsste hier
mit einem Faktor die Breite angepasst werden.
152 - 154: Dieser einfache Quellcode ist etwas tricky!
Die richtige Darstellung geschieht nur mittels CSS.
Das Äussere "div" erstellt eine Box mit weissem Hintergrund und schwarzem
Rahmen mit 1 Pixel Breite und positioniert es richtig.
Das innere "div" hat als Hintergrundbild den Stern der sich seitlich
wiederholt. Der Trick ist nun, dass die Breite dieses "div" errechnet
wurde. Nur so lassen sich die Sterne nur teilweise anzeigen!
156 - 157: Rechts wird die Antwort angezeigt "ja" und links etws
kleiner der Wert in Prozent. Wichtig ist, dass zuerst der Wert ansgegeben
wird und danach das "ja", ansonsten kommt nicht beides auf eine Linie!
158: Für den Balken haben wir ein gif-Bildchen von 1 x 12 Pixeln
erstellt. Da wir nun die Breite dynamisch angeben, wird das Bild einfach
gestreckt.
Code CSS
Datei: umfrage.css
PHP & MySQL: Umfrage v1.0, CSS#poll { margin:10px 0 10px 0; padding:3px; width:114px; background-color:#ffff99; }
#poll h6 { font-size:17px; margin-top:5px; margin-bottom:5px; text-align:center; margin-left:auto; margin-right:auto; }
#poll p { margin:4px 0 4px 0; padding:0; font-size:12px; line-height:100%; }
#poll form { margin:0; padding:0; }
#poll fieldset { margin:0; padding:3px; }
#poll .rot { color:#ff0000; }
#poll .center { text-align:center; margin-left:auto; margin-right:auto; }
#poll div { margin:7px 20px 2px 20px; padding:0; height:15px; width:75px; border: solid #000000 1px; background-color: #ffffff;}
#poll .stern { margin:0; padding:0; border:0; background-repeat:repeat-x; background-image: url(poll/stern.jpg); }
#poll .proz { float:right; font-size:10px; }
Script Update:
03.08.07
Erklärungen zum Code
Es sind hier nur die entscheidenden Angaben angegeben. Wichtig ist,
dass die Vererbungen stimmen. Alle CSS-Angaben können dem Quelltext dieser
Webseite entnommen werden.
Die nötigen Bilder sind direkt ab dieser Webseite zu kopieren.
Für andere Sterne suche man sich allenfalls andere Motive. Wichtig, entweder
sind die Bilder auch 15 x 15 Pixel formatiert, oder das Script wird angepasst.
Für den Balken kann einfach ein anderes Bild verwendet werden.
Code Umfrage Admin Anzeigen
Datei: umfrage_anz.php
PHP & MySQL: Umfrage v1.0, Admin Anzeigen<?php print '<?xml version="1.0" encoding="iso-8859-1" ?>' ; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de-ch" lang="de-ch">
<head>
<title>Intern</title>
</head>
<body>
<?php
include_once('inc.php'); // include der Datenbank
?>
<h2>Umfragen</h2>
<table summary="Umfrage-Ergebnisse">
<colgroup>
<col width="100" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="50" />
<col width="50" />
</colgroup>
<thead>
<tr>
<th class="blun">Frage</th>
<th class="blun" colspan="2">Total</th>
<th class="blun" colspan="2">ja</th>
<th class="blun" colspan="2">teilweise</th>
<th class="blun" colspan="2">wenig</th>
<th class="blun" colspan="2">nein</th>
</tr>
</thead>
<?php
$query = "SELECT frage, COUNT(frage) AS total FROM umfrage GROUP BY frage ORDER BY frage";
for ($i = 0; $i < $num; $i++){
$query_erg_3 = "SELECT COUNT(antwort) AS ant_3 FROM umfrage WHERE frage = '".$row['frage']."'
AND antwort = '3' ";
if ($ant_3 == '' ) { $ant_3 = 0 ; }
$query_erg_2 = "SELECT COUNT(antwort) AS ant_2 FROM umfrage WHERE frage = '".$row['frage']."'
AND antwort = '2' ";
if ($ant_2 == '' ) { $ant_2 = 0 ; }
$query_erg_1 = "SELECT COUNT(antwort) AS ant_1 FROM umfrage WHERE frage = '".$row['frage']."'
AND antwort = '1' ";
if ($ant_1 == '' ) { $ant_1 = 0 ; }
$query_erg_0 = "SELECT COUNT(antwort) AS ant_0 FROM umfrage WHERE frage = '".$row['frage']."'
AND antwort = '0' ";
if ($ant_0 == '' ) { $ant_0 = 0 ; }
// Prozentangaben einzel
$pro_ant_3 = round(100 / $row['total'] * $ant_3, 0 );
$pro_ant_2 = round(100 / $row['total'] * $ant_2, 0 );
$pro_ant_1 = round(100 / $row['total'] * $ant_2, 0 );
$pro_ant_0 = round(100 / $row['total'] * $ant_0, 0 );
// Summen in letzter Zeile
$sum_total = $sum_total + $row['total'];
$sum_ant_3 = $sum_ant_3 + $ant_3;
$sum_ant_2 = $sum_ant_2 + $ant_2;
$sum_ant_1 = $sum_ant_1 + $ant_1;
$sum_ant_0 = $sum_ant_0 + $ant_0;
<tr>
<td>'.$row['frage'].'</td>
<td class="rechts">'.$row['total'].'</td>
<td class="rechts kl">100 %</td>
<td class="rechts">'.$ant_3.'</td>
<td class="rechts kl">'.$pro_ant_3.' %</td>
<td class="rechts">'.$ant_2.'</td>
<td class="rechts kl">'.$pro_ant_2.' %</td>
<td class="rechts">'.$ant_1.'</td>
<td class="rechts kl">'.$pro_ant_2.' %</td>
<td class="rechts">'.$ant_0.'</td>
<td class="rechts kl">'.$pro_ant_0.' %</td>
</tr>
';
}
// Prozentangaben summe
$pro_sum_ant_3 = round(100 / $sum_total * $sum_ant_3, 0 );
$pro_sum_ant_2 = round(100 / $sum_total * $sum_ant_2, 0 );
$pro_sum_ant_1 = round(100 / $sum_total * $sum_ant_1, 0 );
$pro_sum_ant_0 = round(100 / $sum_total * $sum_ant_0, 0 );
<tr>
<td><strong>Total</strong></td>
<td class="rechts"><strong>'.$sum_total.'</strong></td>
<td class="rechts kl"><strong>100 %</strong></td>
<td class="rechts"><strong>'.$sum_ant_3.'</strong></td>
<td class="rechts kl"><strong>'.$pro_sum_ant_3.' %</strong></td>
<td class="rechts"><strong>'.$sum_ant_2.'</strong></td>
<td class="rechts kl"><strong>'.$pro_sum_ant_2.' %</strong></td>
<td class="rechts"><strong>'.$sum_ant_1.'</strong></td>
<td class="rechts kl"><strong>'.$pro_sum_ant_1.' %</strong></td>
<td class="rechts"><strong>'.$sum_ant_0.'</strong></td>
<td class="rechts kl"><strong>'.$pro_sum_ant_0.' %</strong></td>
</tr>
';
?>
</table>
</body>
</html>
Script Update:
06.08.07
Vielleicht hat Ihnen unser Skript ein paar Stunden Arbeit erspart?
|