Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2007.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erstellen Sie Online-Umfragen mit Access und werten Sie diese in Berichten aus.

Techniken

Formulare, Berichte, HTML, PHP

Voraussetzungen

Access 2000 und höher

Beispieldateien

Onlineumfrage.mdb

Shortlink

510

Onlineumfragen mit Access, HTML und PHP

André Minhorst, Duisburg

"Onlineumfragen? Mit Access? Access ist doch eine Desktopdatenbankanwendung!" - Ja, Sie haben Recht. Access ist ja auch nur ein Teil der in diesem Beitrag beschriebenen Lösung, dafür aber auch der wichtigste. Die hier vorgestellte Lösung speichert die Fragen, erstellt die HTML-Seiten zum Abfragen und wertet die Antworten aus - wenn das kein Multitasking ist. Aber schauen Sie doch einfach selbst ...

An einer Onlineumfrage hat sicher jeder von Ihnen schon einmal mitgewirkt, und wenn er auch nur angeklickt hat, dass Deutschland seiner Meinung nach 2008 Europameister im Fußball wird. Diese Lösung hier beschäftigt sich allerdings mit etwas aufwendigeren Exemplaren der Gattung Onlineumfrage.

Bevor es an die technischen Details geht, hier erst einmal ein Überblick darüber, was Sie auf den nächsten Seiten erwartet: Eine Umfrage besteht aus mehreren Fragen, die der Teilnehmer beantworten muss. Diese sind mehr oder weniger komplex: Manche erwarten die Eingabe eines Texts, manche die Auswahl einer oder mehreren Optionen aus einer bestimmten Menge von Möglichkeiten, und es gibt auch Fragen, die einfach nur mit Ja oder Nein zu beantworten sind.

Die erste Aufgabe der Lösung dieses Beitrags ist die Abbildung der Fragen, ihres Typs sowie der möglichen Antworten in einer passenden Tabellenstruktur. Die zweite Aufgabe hängt mit der Präsentation der Umfrage im Internet zusammen: Dazu ist HTML-Code notwendig, der von der Datenbankanwendung automatisch auf Basis der enthaltenen Fragen und Antworten erstellt werden soll.

Der dritte und letzte Teil betrifft schließlich die Aufbereitung der gesammelten Daten für die Auswertung: Dabei sollen die vom Teilnehmer beantworteten Fragen vom Webserver per Mail an den Auftraggeber gesendet und zur Auswertung in passende Tabellen geschrieben werden.

Das Versenden per E-Mail vom Webserver aus setzt das Vorhandensein von Webspace mit der Möglichkeit, PHP-Dateien auszuführen, voraus. Das ist aber mittlerweile bei den meisten Anbietern der Fall.

Umfrage-Datenmodell

Die wichtigste Aufgabe ist wie üblich das Austüfteln eines tragfähigen Datenmodells, was sich in diesem Falle als nicht unbedingt einfach erweist.

Schauen wir einmal, was alles in das Datenmodell einfließen soll: Zuoberst steht die Umfrage, von der es mehr als eine geben soll. Damit steht schon einmal außer Frage, dass es eine passende Tabelle namens tblUmfragen gibt - in diesem Fall auf das Notwendigste reduziert und somit lediglich aus zwei Feldern namens ID und Bezeichnung bestehend.

Hier können Sie sich später austoben und weitere Daten wie den Zeitraum der Umfrage, den tieferen Sinn und vieles mehr unterbringen.

Jede Umfrage besteht aus einer oder mehreren Fragen. Das Anlegen einer passenden Tabelle scheint nahe zu liegen, das Fremdschlüsselfeld zur Herstellung einer Beziehung zur Tabelle tblUmfragen ist ebenfalls absehbar. Des Weiteren wird diese Tabelle den Text der Frage enthalten und - was für das spätere Handling nicht unwichtig ist - ein Zahlenfeld zum Festlegen der Reihenfolge der Fragen.

Dann geht es schon ans Eingemachte: Wie sehen denn die Antworten auf die Fragen aus? Schauen wir mal:

  • Am einfachsten sind Fragen, die nur eine Antwort und keine Auswahlmöglichkeiten anbieten - die Antwort besteht also aus einem reinen Text, das verantwortliche Steuerelement wird ein Textfeld sein.
  • Alle weiteren Fragen sind Fragen mit Auswahlmöglichkeiten, wobei diese hier wohl eine Ausnahme ist: die klassische Ja/Nein-Frage. Es gibt zwei feste Antworten, die sich als Kontrollkästchen darstellen lassen.
  • Alle übrigen Auswahlfragen (oder auch Multiple-Choice-Fragen) haben zwei oder mehr mögliche Antworten, die je nach Frage variieren können. Auch diese unterteilt man: in eine Sorte, die nur eine Antwort zulässt ...
  • ... und eine weitere, die mehrere Antworten erlaubt, wobei auch "keine Antwort" eine Alternative ist.

Das scheint für den menschlichen Verstand nicht besonders kompliziert zu sein, aber wenn man ein Datenmodell auf diesen Varianten aufbauen möchte, muss man zumindest kurz nachdenken. Um eines klarzustellen: Hier geht es zunächst einmal nur um die Abbildung der Fragen und der möglichen Antworten, um die Speicherung der tatsächlichen Antworten kümmern wir uns später.

Auf den ersten Blick braucht man für Fragen, die einen Freitext als Antwort erwarten, gar nichts weiter zu tun, für Fragen mit Ja/Nein-Antworten prinzipiell auch nicht; nur die Möglichkeiten für die Fragen mit beliebig vielen Antworten müssen gespeichert werden - und zwar in einer verknüpften Tabelle, die etwa den Namen tblAntworten trägt. Diese besitzt neben dem Primärschlüsselfeld ID noch ein Fremdschlüsselfeld namens FrageID sowie das Textfeld Antwort und - genau wie die Tabelle mit den Fragen - ein Feld zum Speichern der Reihenfolge bei der Anzeige der Antworten.

So weit, so gut: In der Tabelle tblFragen müssen Sie aber nun noch irgendwie kenntlich machen, welchem der vier Fragentypen die Frage denn nun gehört. Also fügen Sie noch ein Feld namens FragentypID hinzu und legen gleich noch die notwendige Tabelle tblFragentypen mit den beiden Feldern ID und Fragentyp an. Gefüllt mit den soeben ermittelten Fragentypen sieht die Tabelle dann wie in Abb. 1 aus.

pic001.tif

Abb. 1: Die Tabelle tblFragentypen

... und die Antworten?

Das Wichtigste beim Herleiten eines Datenmodells ist, dass man es möglichst erst komplett fertig stellt und sich erst dann an darauf aufbauende Elemente begibt. Sonst stellt man nämlich später fest, dass man das Datenmodell und alle darauf aufbauenden Elemente nochmals anpassen muss, nur weil man zu Beginn schludrig gearbeitet hat.

In diesem Fall fehlt beispielsweise noch etwas ganz Wichtiges, was sich gegebenenfalls auf die übrigen Tabellen auswirken könnte: nämlich die Antworten der Teilnehmer an der Umfrage.

Außerdem sollte man mit Umfragen vergleichbare Tests wie etwa Multiple-Choice-Tests oder Ähnliche denken.

Wie also bringen wir die Antworten der Teilnehmer einer Umfrage in der Datenbank unter? Oder, um ein wenig tiefer anzusetzen, wo finden die Teilnehmer selbst eigentlich Platz? Eine gute Idee ist es immer, reale Objekte wie Artikel, Kunden und so weiter in je einer eigenen Tabelle unterzubringen. Also verwenden Sie für die Teilnehmer eine weitere Tabelle namens tblTeilnehmer, die in diesem Fall zunächst die Felder ID, Vorname, Nachname und Teilnahmedatum aufnehmen soll.

Und nun zu den Antworten der hier gespeicherten Teilnehmer: Klar ist, dass es üblicherweise mindestens eine Antwort jedes Teilnehmers zu jeder Frage geben muss, gegebenenfalls sogar einmal keine. Da es aber auch mehrere sein können, bietet sich eine Tabelle an, die Teilnehmer und Fragen miteinander verknüpft und zusätzlich die Antworten speichert.

Aber wie soll man mit den Antworten umgehen, wenn diese mal als reine Texte daherkommen, mal als Antwort auf eine Ja/Nein-Frage und mal als eine der in der Tabelle tblAntworten vorgegebenen Antworten?

Man könnte es sich einfach machen und eine unsaubere Lösung wählen, indem man in der Tabelle (nennen wir sie tblTeilnehmerFragenAntworten) sowohl vorsieht, Kombinationen aus Fremdschlüsselfeldern mit Bezug auf die Tabellen mit den Teilnehmern, Fragen und Antworten zu speichern, als auch die Möglichkeit bietet, reine Textantworten in einem separaten Feld zu speichern. Das zöge nach sich, dass bei einem Teil der Fragen, nämlich bei denen mit Textantworten, kein Verweis auf einen Datensatz der Tabelle tblAntworten erfolgen würde. Anderenfalls würde bei allen Fragen, die keine Textantwort erwarten, das Textfeld mit der Antwort leer bleiben.

Besonders ungünstig ist dies, da man in der Tabelle tblTeilnehmerFragenAntworten üblicherweise einen eindeutigen Index über die drei Felder TeilnehmerID, FrageID und AntwortID legen würde, um zu verhindern, dass eine der Kombinationen mehrfach gespeichert wird. Dies ließe sich aber aushebeln, wenn eines der Felder einfach leer bleibt - die Kombination TeilnehmerID = 1 und FrageID = 1 könnte also mehrfach auftreten, wenn nur das Feld AntwortID keinen Wert aufweist.

Damit der zusammengesetzte Index trotzdem zieht, könnte man die Textantworten anderweitig speichern: Und zwar als neue Antwort in der Tabelle tblAntworten, die man dann ordnungsgemäß mit der Tabelle tblTeilnehmerFragenAntworten verknüpft. Man müsste nur einen Weg finden, dass die so im Laufe der Umfrage zu dieser Tabelle hinzugefügten Antworten nicht mit den eigentlich vorgesehenen Antworten vermischt werden und eine Frage mit einer reinen Textantwort plötzlich mehrere Antworten bereitstellt.

Aber auch dies ist relativ einfach zu bewerkstelligen: Man lässt im Gegensatz zu den Auswahlantworten einfach das Feld Reihenfolge in der Tabelle tblAntworten leer.

Abb. 2 zeigt somit das vollständige Datenmodell, das allen gängigen Regeln entspricht, aber bei der anschließenden Programmierung der Benutzeroberfläche einige Aufmerksamkeit erfordert.

pic003.tif

Abb. 2: Das Datenmodell der Onlineumfrage-Datenbank

Umfragen anlegen

Die Umfragen mit ihren Fragen und Antworten sollen möglichst übersichtlich dargestellt werden. Im Gegensatz zu manch anderem Anwendungszweck, bei dem Detaildaten wie die eines zu einem Projekt zugeordneten Kunden gerne in Popupformularen erscheinen, soll hier ein Formular die Umfrage, die Fragen sowie die Antworten zur jeweils markierten Frage auf einen Blick anzeigen. Beim Wechseln der Frage sollen auch die angezeigten Antworten aktualisiert werden.

Dies funktioniert mit einem Hauptformular, das an die Haupttabelle, hier tblUmfragen, gebunden ist und in zwei Unterformularen die Fragen und die Antworten anzeigt.

Die Synchronisierung der beiden Unterformulare erfolgt hierbei über ein Textfeld im Hauptformular, das die ID der aktuell im ersten Unterformular aktivierten Frage enthält. Das zweite Unterformular mit den Antworten wird schließlich mit dem Inhalt dieses Textfelds synchronisiert.

Im ersten Entwurf sieht das Formular zum Eingeben der Umfragen, Fragen und Antworten zunächst einmal wie in Abb. 3 aus. Die beiden Unterformulare frmFragen und frmAntworten sind an die Tabellen tblFragen und tblAntworten gebunden. Das Unterformular frmFragen ist über das Feld UmfrageID an das Feld ID des Hauptformulars gebunden.

pic004.tif

Abb. 3: Entwurfsansicht des Formulars zum Eingeben von Umfragen, Fragen und Antworten

Im Unterformular frmFragen gibt es eine Routine, die durch das Ereignis Beim Anzeigen ausgelöst wird - also beim ersten Anzeigen, beim Wechseln und auch beim Löschen eines Datensatzes. Diese sorgt dafür, dass das Textfeld txtFrageID des Hauptformulars immer die ID der im Formular frmFragen aktiven Frage enthält:

Private Sub Form_Current()

Me.Parent.txtFrageID = Me.ID

End Sub

Dieses Textfeld können Sie natürlich ausblenden, es soll für den Benutzer nicht zu sehen sein. Damit das Unterformular frmAntworten auch nur die Antworten zur aktuell im Formular frmFragen anzeigt, stellen Sie nun dessen Eigenschaft Verknüpfen von auf das Feld FrageID und Verknüpfen nach auf txtFrageID ein.

Umfragen anlegen

In Aktion sieht das Formular frmUmfragen wie in Abb. 4 aus. Das linke Unterformular enthält bereits eine Reihe von Fragen, das rechte zeigt die für die aktuell ausgewählte Frage angelegten Antworten an. Mit dem Feld FragetypID lässt sich festlegen, ob die Frage eine Text-, Ja/Nein-, Einfach- oder Mehrfachauswahlfrage ist. Die Eingabemöglichkeit für die möglichen Antworten beeinflusst dies nicht, allerdings werden diese nur bei Fragen des Typs Einfach- oder Mehrfachauswahl berücksichtigt.

pic005.tif

Abb. 4: Das Umfrage-Eingabeformular in Aktion - hier bei der Eingabe einer Frage mit Mehrfachauswahl

Von Access ins Web

Ein Werkzeug zum Anlegen der Umfragen mit Fragen und Antworten haben Sie nun. Aber auf welchem Wege bringt man die Fragen nun zum Benutzer? Sicher ist: Sie könnten leicht einen Bericht erstellen, der die hier angegebenen Fragen zu Papier bringt, aber die Erfassung der zurücklaufenden Daten ist auf diesem Wege doch recht müßig.

Wie in der Überschrift dieses Beitrags angedeutet, sind HTML und PHP mit im Spiel und damit ist die Richtung klar: Die Veröffentlichung der Umfrage erfolgt online, und zwar im Internet in Form eines geeigneten Formulars.

Um dieses zusammenzustellen, müssen Sie kein Zauberer sein - die Syntax ist recht einfach. Betrachten wir das Formular aus Abb. 5, das die Fragen und Antworten aus Abb. 4 repräsentiert. Für jede der vier Fragetypen gibt es ein bestimmtes HTML-Gerüst, dessen Gesamtheit von einigen weiteren Elementen eingefasst wird, die wie folgt aussehen:

<!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" >

<head>

  <title>Umfrage: Umfrage 2</title>

</head>

<body>

   <form action="umfrageGesendet.php"
method="post">

     <table>

       ... eigentliche Umfrage-Elemente ...

     </table>

     <input type="submit" value="Absenden"/>

   </form>

</body>

</html>

pic006.tif

Abb. 5: Die HTML-Umfrage mit den Fragen und Antworten der in Abb. 4 erstellten Umfrage

Dieses Gebilde enthält die üblichen für eine
HTML-Seite notwendigen Informationen sowie einen Teil des Codes für die Anzeige des Formulars: nämlich das öffnende und schließende form-Tag sowie den äußeren Rahmen für die enthaltene Tabelle (table).

Diese dient hier als einfaches Mittel, die einzelnen Elemente sauber anzuordnen. Das form-Tag definiert ein Formular, das eines oder mehrere Steuerelemente enthält, deren Inhalt nach dem Absenden des Formulars vom Empfänger ausgewertet werden kann.

In diesem Fall ist der Empfänger eine PHP-Seite und der Inhalt wird mit der post-Methode weitergeleitet:

<form action="umfrageGesendet.php" method="post">

Das bedeutet schlicht und einfach, dass die Formularfelder und deren Inhalte mit der durch das Absenden des Formulars erzeugten Anfrage versendet werden (die Alternative wäre die get-Methode - hier werden die Informationen als Teil des URL versendet).

Nun brauchen Sie nur noch für jeden der vier Fragetypen die passende HTML-Definition. Schauen Sie sich einfach die HTML-Datei aus Abb. 5 an. Die Syntax für das dort abgebildete einfache Textfeld sieht beispielsweise so aus:

<tr>

<td>Vorname:</td>
<td><input type="text" name="2_1_6_0" /></td>

<tr>

<tr> und </tr> definieren eine Zeile, <td> und </td> die einzelnen Spalten. Obige Definition liefert also eine Tabellenzeile mit zwei Feldern, von denen das linke die Frage und das rechte das für die Eingabe der Antwort notwendige Steuerelement enthält - in diesem Fall ein input-Element des Typs text mit dem Namen 2_1_6_0. Die Frage stammt direkt aus der Tabelle tblFragen, der Name 2_1_6_0 steht für Umfrage-ID 2, den Fragentyp 1, die Frage-ID 6 sowie die Zahl 0 für die ausgewählte Antwort, die ja hier nicht vorhanden ist - auf diese Weise können Sie die Antworten des Benutzers später zuordnen.

Ja/Nein-Fragen soll der Benutzer durch das Aktivieren oder Deaktivieren eines Kontrollkästchens beantworten. Die Ja/Nein-Frage aus dem Beispiel wird in HTML so dargestellt:

<tr>

<td>Ich nehme gern an Umfragen teil!</td>
<td><input type="CheckBox" name="2_2_10_0"/>
</td>

</tr>

Interessanter sind schon die Fragen mit mehreren Antworten. Solche, bei denen der Benutzer nur eine Antwort wählen darf, bringen Sie in einem Kombinationsfeld unter. Dieses wird in HTML durch ein select-Element markiert, die einzelnen Einträge durch option-Elemente:

<tr>

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.