info@a-coding-project.de

Umfragensystem mit PHP

Die Betreiber von Webseiten bzw. -portalen suchen nach immer neuen Möglichkeiten, um an persönliche Informationen von ihren Besuchern und Mitgliedern zu gelangen. Neben den eigentlichen Sinn von Umfragen, etwas über die Qualität des Produktes zu erfahren bzw. die Meinung zu bestimmten Ereignissen zu erfragen, werden sie in der Internet-Welt dazu verwendet, um die Persönlichkeit des Nutzers zu erfahren.

Design der Datenbank

Bei einem mehrseitigen Umfragesystem bietet es sich an, für jede Umfrageseite eine eigene Tabelle anzulegen, in der die Antworten gespeichert werden können. Aus diesem Grund benötigt eine Tabelle zum einen eine Spaltenmenge, die der Anzahl der Fragen entspricht sowie eine zusätzliche Spalte, in der die Userkennung des Teilnehmers oder ein allgemeiner Ausdruck gespeichert wird, wenn der Teilnehmer nicht bekannt ist. Wenn Userkennungen ein Thema sind, sollte sich ein bekannter User vorher einloggen, wenn er an der Umfrage teilnehmen möchte.
Bei einer Umfrage gibt es Multiple-Choice- oder textbasierte Antworten, auf die in der Datenbank Rücksicht genommen werden muss. Deshalb muss auch darauf geachtet werden, welcher Spaltentyp für die einzelnen Spalten vergeben wird.
Als zusätzliche Information kann u.a. das Datum gespeichert werden, an dem der User an der Umfrage teilgenommen hat.

Anlegen der Datenbank

Falls eine entsprechende Datenbank noch nicht existiert, wird sie mit folgendem Befehl angelegt:

create database survey;

Arbeitet man im MySQL-Client, muss mit dem Kommando "use survey" die Datenbank aktiviert werden, so dass mit ihr gearbeitet werden kann.

Anlegen der Tabellen in der Datenbank

Ausgehend von der Überlegung, dass pro Umfrageseite 5 Fragen beantwortet werden müssen und der Zeitpunkt der Teilnehme gespeichert werden soll, kann mit folgendem SQL-Statement eine Tabelle angelegt werden:

CREATE TABLE seite1 (user TEXT NOT NULL, datum DATE NOT NULL, 
  q1 varchar(5) NOT NULL, q2 varchar(5) NOT NULL, q3 varchar(5) 
  NOT NULL, q4 varchar(5) NOT NULL, q5 varchar(5) NOT NULL);

Anlegen von Indizes in den Tabellen

Da man im Vorfeld nicht wissen kann, wie viele Leute an der Umfrage teilnehmen, ist es nicht möglich, die Größe, die die Datenbank einmal erreichen wird, im Vorfeld zu beurteilen. Deshalb ist es sinnvoll für alle Tabellen in der Datenbank Indizes zu definieren. Damit wird der Zugriff auf die Informationen speziell in Tabellen mit vielen Datensätzen erheblich beschleunigt. In diesem Fall empfiehlt es sich, für die Spalte "user" einen Index zu erstellen. Das genügt, um zügig an die Antworten des entsprechenden Nutzers zu gelangen. Mit dem folgenden Befehl wird der Index für diese Spalte erstellt:

CREATE INDEX user ON seite1 (user(10));

Für die angegebene Spalte muss auf jeden Fall eine Zeichenlänge angegeben werden, für die der Index "wirken" soll. Ein Index kann nur für jeweils eine Spalte definiert werden, so dass entsprechend weitere CREATE INDEX - Kommandos ausgeführt werden müssen.

Erstellung des PHP-Skriptes für die erste Umfrage-Seite

Wenn es sich um einen User mit einer Kennung handelt, sollte zuerst überprüft werden, ob der User schon einmal an der Umfrage teilgenommen hat. Dies kann man am besten feststellen, ob die Kennung schon in der Datenbank gespeichert ist. Realisierbar ist dieser Schritt durch die folgende SQL-Abfrage im Skript:

mysql_db_query("SELECT user FROM seite1 WHERE user="$user"");
$user_check = mysql_fetch_row($result);

Wenn die Userkennung bekannt ist, wird sie über die Variable $user_check zurückgegeben. Ist die Variable leer, hat der User noch nicht an der Umfrage teilgenommen. Über die folgende if-Schleife wird das Ergebnis abgefangen.

if($user_check == $user)
{
 echo "Der User hat bereits an der Umfrage teilgenommen";
}

else
{
 ... Anzeige des Formulares für Seite 1 ...
}

Anzeige des Formulares

Das Formular selbst kann direkt in das PHP-Skript eingebettet werden. Eine eigene HTML-Datei, aus der das PHP-Skript zur weiteren Datenverarbeitung aufgerufen wird, ist zwar auch möglich, aber nicht notwendig. Im else-Zweig der obigen if-Schleife kann jetzt folgender Code eingebunden werden:

print("
 <form action="page2.php" method=post>
 <h1>Fragen zum Kauf des Autos</h1>
 <p>In welchem Jahr wurde das Auto gekauft?</p>
 <select name=year size=1>
  <option value='2004'>2004 
  <option value='2005'>2005
  <option value='2006'>2006 
 </select>
 <p>Wurde für den Kauf ein Kredit aufgenommen ?</p>
 <input type=checkbox name=credit value=yes> JA
 <input type=checkbox name=credit value=no> NEIN
 <p>Wie lange hat es geschätzt bis zur Kaufentscheidung gedauert?</p>
 <select name=time_period size=1>
  <option value='1 week'>1 Woche 
  <option value='1 month'>1 Monat
  <option value='1 year'>1 Jahr
  <option value='longer'>mehr als 1 Jahr 
 </select>
 <p>Welches Auto fuhren Sie vor dem Neukauf ?</p>
 <input type=text name=old_car size=30>
 <p>Warum haben Sie sich für diese Marke entschieden ?</p>
 <textarea name=decision cols=50 rows=10></textarea>
 <br><br>
 <input type=submit  value="Zur Seite 2">
 </form>
");

Bei der Ausarbeitung des Formulares sollte beachtet werden, dass die Antworten später auch auswertbar sind. Das bedeutet, dass - siehe Beispiel - bei der Angabe des Zeitraumes für die Kaufentscheidung eindeutige Zeiträume ausgewählt werden müssen. Sonst ist davon auszugehen, dass die Angaben der Nutzer zu unterschiedlich sind, um eine auswertbare Struktur zu bieten.

Im Skript für die nächste Umfrageseite werden die Eingaben aus der aktuellen Seite zuerst verarbeitet, bevor die neuen Fragen angezeigt werden. Damit ist das Skript für die erste Seite schon fertig.

PHP-Skript für die zweite Umfrageseite

Nach der Herstellung und Überprüfung der Verbindung zur Datenbank muss zuerst auf die von der vorigen Seite übergebenen Informationen zugegriffen werden. Dies wird durch die folgenden Codezeilen möglich.

$year = $_POST['year'];
$credit = $_POST['credit'];
$time_period = $_POST['time_period'];
$old_car = $_POST['old_car'];
$decision = $_POST['decision'];

Wenn beim Formular die Methode GET angegeben wurde, muss an dieser Stelle das $_POST durch $_GET ersetzt werden.

Nachdem noch mit der Zeile $date = date("d.m.Y"); das Datum der Umfrage ermittelt wurde, können alle Informationen in die Datenbank eingetragen werden.

Eintrag in die Datenbank + Überprüfung

Der folgende Code-Abschnitt schreibt die Antworten in die Datenbank, überprüft ob alles geklappt hat und gibt in Abhängigkeit des Resultates entweder eine Fehlermeldung aus oder zeigt das Formular mit den neuen Fragen an.

mysql_select_db("test",$connect);
$result = mysql_query("
INSERT INTO seite1 (user,datum,q1,q2,q3,q4,q5) 
VALUES('$user','$date','$year','$credit','$time_period',
       '$old_car','$decision')
");

if(!$result)
{
 echo "Eintrag in die Datenbank nicht möglich; Fehlerursache: " .  mysql_error();
}
else
{
 ... Anzeige des Formulares für Seite 2 ...
}

Um das Thema der Umfrage fortzuführen, bietet es sich an, technische Daten zum neu gekauften Auto zu erfragen. Im Vergleich zum obigen Beispiel für das erste Formular ändert sich grundlegend nichts wesentliches, nur dass beim Attribut action in der form-Zeile das Skript "page3.php" eingetragen werden und die Bezeichnung des Submit-Buttons auf "Zur Seite 2" geändert werden muss.

Auswertung der Umfrageergebnisse

Anhand der dazugehörigen SQL-Abfragen soll aufgezeigt werden, welche Auswertungen anhand der gespeicherten Informationen in der Datenbank möglich sind. Da man auch nicht zwingend davon ausgehen kann, dass jeder User auch wirklich die komplette Umfrage beantwortet, kann die Auswertung nur für die jeweilige Seite stattfinden.

Hinweis: Die hier beschriebenen SQL-Statements beziehen sich immer auf die erste Umfrageseite.

Anzahl der registrierten und anonymen Teilnehmer

In der Beispielumfrage gibt es zwei Teilnehmerkategorien, die an der Umfrage teilnehmen können. Daraus ergibt sich die Möglichkeit, dass dreimal eine Gesamtanzahl der Teilnehmer ermittelt werden kann. Wenn ein nicht-registrierter User an der Umfrage teilnimmt, wird in der Spalte "user" automatisch das Wort "anonymus" eingetragen. Ist der User registriert, wird seine User-Kennung gespeichert. Über verschiedene SQL-Abfragen können alle Teilnehmerzahlen ermittelt werden.

Besucher: 
SELECT count(user) FROM seite1 WHERE user="anonymus";

Registrierte Nutzer: 
SELECT count(user) FROM seite1 WHERE user != "anonymus";

Gesamtanzahl: 
SELECT count(user) FROM seite1;

Wieviele User haben an einem bestimmten Tag teilgenommen?

Dazu muss zuerst ermittelt werden, welche Tage in der Datenbank gespeichert sind. Wenn alle Tage bekannt sind, wird durch eine zweite Abfrage die Useranzahl ermittelt. Auch hier ist es dann wiederum möglich, nach anonymen und registrierten Usern zu unterscheiden. Dieses PHP-Code-Segment zeigt, wie die Details ermittelt werden können:

$result = mysql_query("SELECT distinct(datum) FROM seite1");
while($datum = mysql_fetch_row($result))
{
 $output = mysql_query("SELECT count(user) FROM seite1 where 
                        datum = "$datum"");
 $user_cnt = mysql_fetch_row($output);
}

Die Werte der Variablen $datum und $user_cnt beinhalten die notwendigen Informationen.

Wieviele User haben eine bestimmte Antwort gegeben?

Anhand des Tabellennamens in der SQL-Abfrage steht fest, um welche Tabelle es sich handelt und durch den Spaltennamen im where-Filter wird die Frage eindeutig festgelegt.

$result = mysql_query("SELECT count(user) FROM seite1 
                       WHERE q1 = '2004'");

Bei Bedarf kann noch der Filter, der in der ersten Auswertung beschrieben wurde, mit angegeben werden. Damit ist noch eine Unterscheidung nach User-Kategorien möglich.

Prozentuale Anteile der Teilnehmer für bestimmte Antworten

Dazu muss die erste und die dritte Auswertung gleichzeitig ausgeführt werden. Wenn die beiden Werte bekannt sind, muss noch der prozentuale Anteil ausgerechnet werden, was durch den folgenden PHP-Code möglich ist:

$percent = ($part / $complete) * 100;

Hinweis: Der Inhalt von $part entspricht der tatsächlichen Teilnehmerzahl für eine Antwort während $complete der kompletten Teilnehmeranzahl entspricht.

Weiterlesen: ⯈ SOAP

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Auch interessant