WBCE CMS – Way Better Content Editing.
You are not logged in.
Weil ich es im pädagogischen Umfeld brauche, habe ich mit ChatGPT 5.5 Pro ein neues Modul programmiert: Token Survey.
Das Modul dient zur Durchführung anonymer bzw. anonymitätsorientierter Umfragen, bei denen die Teilnahme nicht über eine IP-Sperre, sondern über einmalige Zugangstokens gesteuert wird. Jeder Token kann die Umfrage nur einmal absenden. Damit eignet sich das Modul besonders für Situationen, in denen pro Person oder Haushalt genau eine Rückmeldung möglich sein soll. In meinem Fall für eine schulische Evaluation pro Schulkind exakt eine Umfrageerhebung.
Wichtige Funktionen
mehrere Abfragegruppen pro Modulabschnitt
Abfragegruppen können dupliziert werden, inklusive Fragen, Antwortoptionen, Reihenfolge und Einladung
eigene Fragen je Abfragegruppe
unterstützte Fragetypen: Einfachauswahl, Mehrfachauswahl, Skala 1–4, Kurztext, Langtext und reiner Hinweistext
Fragen per Drag-and-drop sortierbar
Zeitraum für die Bearbeitung einstellbar
tokenbasierter Zugang über QR-Code
Tokens werden als QR-Kärtchen oder als Serien-Einladung mit WYSIWYG-Text ausgegeben
lokale QR-Code-Erzeugung ohne externe Dienste
Zwischenspeicherung der Antworten während der Bearbeitung
Antworten können bis zum Absenden oder bis zum Ende des Bearbeitungszeitraums geändert werden
Auswertung pro Abfragegruppe mit Rücklauf, gesendeten und zwischengespeicherten Antworten
Freitextantworten werden in der Auswertung angezeigt
mehrsprachig über Sprachdateien DE/EN
Sicherheits- und Datenschutzaspekte
Das Modul wurde mit besonderem Augenmerk auf Sicherheit entwickelt. Alle Datenbankzugriffe erfolgen über mysqli Prepared Statements. Schreibende Backend- und Frontend-Aktionen sind durch WBCE-FTAN geschützt. Eingaben werden serverseitig gefiltert, Ausgaben grundsätzlich escaped. Für WYSIWYG-Inhalte der Einladung wird eine Allowlist-Sanitisierung verwendet; lokale Bilder aus dem WBCE-Medienordner können eingebunden werden, externe oder unsichere Quellen werden nicht zugelassen.
Tokens werden nicht im Klartext gespeichert, sondern nur gehasht. Die QR-Codes müssen deshalb direkt nach der Token-Erzeugung gedruckt oder als PDF gespeichert werden. Das Modul nutzt keine externen QR-Code-Dienste und keine externe Auswertung. Zusätzlich gibt es Rate-Limiting bzw. Action-Throttling gegen Missbrauch.
Die Umfrage ist so angelegt, dass keine Namen, E-Mail-Adressen oder sonstigen direkten Personendaten abgefragt werden müssen. Die Auswertung erfolgt gruppenbezogen. Da bei kleinen Gruppen oder Freitextantworten dennoch Rückschlüsse möglich sein können, sollte der konkrete Einsatz immer mit einem passenden Datenschutzhinweis begleitet werden.
Inkludierte Kurzanleitung
Legen Sie zuerst eine Standard-Abfragegruppe an und erfassen Sie dort alle Fragen, die später verwendet werden sollen. Gestalten Sie dabei ebenso ein Standardschreiben, das als Vorlage für den Serien-Einladungsbrief dient.
Wenn die Standard-Abfragegruppe fertig ist, duplizieren Sie diese für die echten Abfragegruppen, zum Beispiel für einzelne Klassen, Kurse oder Gruppen. Beim Duplizieren werden alle Fragen, Antwortoptionen, die Fragenreihenfolge und die Einladung übernommen. Tokens und Antworten werden nicht kopiert. Somit kann zwischen verschiedenen Abfragegruppen leicht variiert werden. Bearbeiten Sie bei Bedarf die duplizierte Abfragegruppe und passen Sie Titel, Zeitraum, Fragen oder Einladung an.
Erzeugen Sie im Reiter Tokens für jede Abfragegruppe die benötigte Anzahl an Zugangscodes. Pro teilnehmender Person sollte genau ein Token ausgegeben werden.
Drucken Sie direkt nach dem Erzeugen die Einladungen oder QR-Kärtchen aus oder speichern diese als PDF. Die Tokens werden aus Sicherheitsgründen nicht im Klartext gespeichert und können später nicht erneut rekonstruiert werden.
Im Reiter Auswertung sehen Sie den Rücklauf und die bisherigen Ergebnisse. Die Auswertung enthält gesendete und zwischengespeicherte Antworten, so dass auch noch nicht finalisierte Antworten schon sichtbar sind.
In eigener Sache
Einige Zeit kam ich nicht mehr zum Coden und seit kurzem steht mir vom AG die Version 5.5 von ChatGPT Team zur Verfügung, bei der man auf PRO umschalten kann. Ich bin massiv beeindruckt. Das Modul entstand innerhalb weniger Stunden nebenbei an quasi einem Arbeitstag und lief auf Anhieb fehlerfrei, dann waren die PRO-Eingaben aufgebraucht. Ich musste auf Thinking wechseln und das hatte Mühe, nur das nachträglich dazugenommene Tutorial fehlerfrei ins bestehende Modul einzubinden. Nicht wundern: Es findet sich in den Code-Kommentaren noch manchmal schulbezogene Bezeichnungen, aber das ist für die Nutzung egal.
Viel Spaß damit!
Last edited by pfreud01 (12.07.2026 20:03:08)
Offline
beach, byteworker
Hallo pfreud01,
Das ist ein interessantes Modul.
Und es ist mir besonder der Sicherheitsabschnitt in deiner Beschreibung aufgefallen:
Sicherheits- und Datenschutzaspekte
Das Modul wurde mit besonderem Augenmerk auf Sicherheit entwickelt. Alle Datenbankzugriffe erfolgen über mysqli Prepared Statements.
Das ist wahr, die bisherige $database-Klasse bieten im Moment kein sauberes Prepared-Statement-API — wer das wollte, musste zwangsläufig selbst eine Schicht bauen.
Und das wurde in diesem Modul konsequent gemacht: eigene tsv_stmt()-Abstraktion, Typstrings für bind_param, vollständiges Parameter-Binding durch alle Ebenen. Das ist genau richtig, und es zeigt, dass du oder ChatGPT die Sicherheitsanforderungen ernst genommen haben, anstatt den bequemen Weg zu nehmen.
Dieses Manko wollten wir in WBCE schon lange ausbügeln, doch mangels Zeit sind wir erst im ersten Quartal dazu gekommen und die
WBCE Version 1.7.0 bringt eine komplett neue Database-Klasse auf PDO-Basis, die genau das bietet, was du brauchst:
$database->fetchAll("SELECT * FROM {TP}foo WHERE section_id = ?", [$sectionId]);
$database->fetchValue("SELECT COUNT(*) FROM {TP}bar WHERE id = ?", [$id]);
$database->query("UPDATE {TP}baz SET col = ? WHERE id = ?", [$value, $id]);Prepared Statements, ?-Platzhalter, kein escapeString(), kein manuelles Präfix-Zusammenbauen. Das Modul selbst wird davon profitieren können — tsv_stmt(), tsv_db_all(), tsv_db_one() und Co. könnten mittelfristig durch direkte $database-Aufrufe ersetzt werden, und die gesamte eigene DB-Schicht in common.php wäre dann schlicht nicht mehr nötig.
Schon bald wird wir die Beta-Version veröffentlicht.
Dann kannst Du entscheiden, ob Du Dein Modul weiterhin mit der eigenlösung mit mysqli oder mit der neuen PDO Database Klasse weiter arbeiten willst - die ist sehr gut dokumentiert und dein KI Assistent wird sie "lieben". :-)
Für die Kompatibilität mit 1.7.0 ist eine kleine Anpassung an token_survey/inc/common.php nötig (ca. 10 Zeilen), damit das Modul eine eigene mysqli-Verbindung aufbaut, wenn die neue PDO-Klasse aktiv ist. Das kannst Du schon jetzt machen — dann läuft das Modul auf beiden Versionen gleichermaßen.
Wenn Du dann irgendwann Zeit findest, kannst Du optional die gesamte eigene DB-Schicht (tsv_stmt, tsv_db_all usw.) durch direkte $database-Aufrufe ersetzen und den Code dabei deutlich vereinfachen — aber das ist kein Muss.
Schöne Grüße,
Christian
Falls Du es mit dem KI Assistenten machen willst, schick ihm den unteren Prompt:
Die Funktion tsv_db() in modules/token_survey/inc/common.php muss angepasst werden, damit das Modul mit WBCE 1.7.0 kompatibel bleibt. In WBCE 1.7.0 wurde die interne Datenbankklasse von mysqli auf PDO migriert. $database->db_handle gibt daher kein mysqli-Objekt mehr zurück, sondern ein PDO-Objekt. Der bisherige instanceof mysqli-Check in tsv_db() schlägt deshalb fehl, alle DB-Zugriffe des Moduls schlagen still fehl, und modify.php zeigt ERROR_PERMISSION.
Ersetze die bisherige tsv_db()-Implementierung durch eine Version, die:
Die Verbindung in einer static-Variable cached
Zuerst prüft, ob $database->db_handle ein echtes mysqli-Objekt ist (Rückwärtskompatibilität mit älteren WBCE-Versionen)
Falls nicht, eine eigene mysqli-Verbindung über die WBCE-Konstanten DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME aufbaut und den Zeichensatz auf utf8mb4 setzt
Wende den folgenden Patch an:```
--- a/modules/token_survey/inc/common.php
+++ b/modules/token_survey/inc/common.php
@@ -17,22 +17,33 @@
defined('TSV_TOKEN_LENGTH_BYTES') || define('TSV_TOKEN_LENGTH_BYTES', 18);-/**
- * Liefert den mysqli-Handle der WBCE-Datenbankklasse.
- */
+/**
+ * Liefert einen mysqli-Handle. Wenn WBCE bereits auf PDO migriert ist,
+ * wird eine eigene Verbindung über die DB-Konstanten aufgebaut.
+ */
function tsv_db(): mysqli
{
- global $database;
-
- if (!is_object($database)) {
- throw new RuntimeException('WBCE database object missing');
- }
-
- $handle = $database->db_handle ?? null;
- if (!$handle instanceof mysqli) {
- throw new RuntimeException('WBCE mysqli handle missing');
+ static $conn = null;
+
+ if ($conn instanceof mysqli) {
+ return $conn;
}- return $handle;
+ global $database;
+ if (is_object($database)) {
+ $handle = $database->db_handle ?? null;
+ if ($handle instanceof mysqli) {
+ $conn = $handle;
+ return $conn;
+ }
+ }
+
+ // WBCE nutzt PDO; eigene mysqli-Verbindung über DB-Konstanten
+ $conn = @new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
+ if ($conn->connect_errno) {
+ throw new RuntimeException('tsv_db: mysqli connect failed: ' . $conn->connect_error);
+ }
+ $conn->set_charset('utf8mb4');
+ return $conn;
}/**
```Alle anderen Dateien des Moduls bleiben unverändert.
“Success is the progressive realization of a worthy ideal.” ― Earl Nightingale
Offline
Das ist wahr, die bisherige $database-Klasse bieten im Moment kein sauberes Prepared-Statement-API — wer das wollte, musste zwangsläufig selbst eine Schicht bauen.
Und das wurde in diesem Modul konsequent gemacht: eigene tsv_stmt()-Abstraktion, Typstrings für bind_param, vollständiges Parameter-Binding durch alle Ebenen. Das ist genau richtig, und es zeigt, dass du oder ChatGPT die Sicherheitsanforderungen ernst genommen haben, anstatt den bequemen Weg zu nehmen.
Vielen Dank für die Blumen. Es freut mich, dass es diesesmal so gut geklappt hat. Ehrlicherweise hab ich keine Ahnung, wovon du da genau sprichst, aber Hauptsache, das Modul ist sicher.
Meine ersten KI-Codings hatten da ja noch mehr Mühe bereitet, aber diesesmal hat die KI sauber abgeliefert, obwohl mein Startprompt nicht viel anders war.
Danke auch für den Prompt, den werde ich sicher noch nutzen.
Offline
stefanek
Ja, bitte tue das, sonst kann das Modul leider nicht mit WBCE 1.7.0 arbeiten, wenn es rauskommt.
Schönen Gruß,
Christian
“Success is the progressive realization of a worthy ideal.” ― Earl Nightingale
Offline
Neue Version 0.1.1 im Ursprungsthread.
Fehler gelöst, dass nach "Zurück zur Übersicht" keine Abfrageliste mehr bearbeitbar war.
Backend-Startansicht vereinfacht: Abfragegruppenliste ohne unnötige Reiter.
Reiter Fragen, Tokens, Einladung und Auswertung erscheinen erst nach Auswahl einer Abfragegruppe.
Maximalzahl der Fragen pro Abfragegruppe standardmäßig auf 50 erhöht.
Druckvorschau für Einladungen ohne echte Token-Erzeugung ergänzt.
Druckvorschau erst nach gespeichertem Einladungstext verfügbar.
Einladungs-Editor erlaubt nun mehr Schrifteinstellungen.
Kleinere optische Verbesserungen.
LG pfreud01
Offline
Guten Abend
So weit so schön und nett - hier funktionert es auf dem ersten //Blick// prächtig :-) +1
Frage:
Ist es möglich oder angedacht das man zu den einzelen Fragen noch optional ein //Bild// (image) mit dazu "packen" kann/könnte?
Nur als Beispiel:
Siehe ScreenShot 1.
Zur Zeit behelfe ich mir mit einem Droplet - das funktioniert auch ganz gut - leider steht
dann natürlich der Droplet-Aufruf im Backend-Interface
Siehe Screen 2 ...
Gruß
Kant
Last edited by kant (12.07.2026 21:43:14)
Sapere aude!
Offline
Interessanter Gedanke, dazu ein Bild zu packen und es als digitalen Test zu nutzen. Ich habe darüber nachgedacht und werde dies jedoch nicht tun. In der Evaluation brauche ich das so nicht.
Einen browserbasierten Test zu programmieren, finde ich reizvoll, sehe aber ein großes Problem: Die Kundschaft könnte jederzeit in einen anderen Browsertab wechseln und den Test damit sabotieren. Zweitens wären Textangaben maschinell nur umständlich auswertbar. Das müsste per KI erfolgen und da fehlen mir die APIs. Außerdem bieten das schulische Lernumgebungen bereits an. Nicht schön, aber funktional.
Offline
Hallo :-)
Das war nur ein Beispiel :-) bei dem es sich um eine Testfrage handelte - könnte genauso einfach __nur__ eine Frage nach der Raumgestaltung der Kantine oder der Deckenfarbe im Flur sein - oder einfach nur eine zusätlich Illustration in einer Speisekarte oder ... halt wo ggf. ein Bild mit dazu __könnte__ - nicht __muss__ ;-)
Wie gesagt/geschrieben u.a. z.b. mit //Droplet// lösbar.
Gruß
Kant
Last edited by kant (16.07.2026 23:15:59)
Sapere aude!
Offline
Achso. Hab schon wieder die pädagogische Brille aufgehabt.
Macht so auch Sinn. Vielleicht bau ich das mal ein. Komme demnächst aber sicher nicht dazu. 
Offline