wissen / limesurvey · logik
Warum das Größer-Zeichen Ihre Bedingung zerlegt
Sie bauen eine Filterführung: Die Nachfrage soll nur erscheinen, wenn jemand älter als 65 ist. Sie schreiben alter > 65. Beim nächsten Öffnen ist die Bedingung kaputt oder tut nichts.
Was passiert
Die Zeichen < und > sind in HTML die Klammern für Tags. Läuft Ihr Ausdruck durch einen HTML-Editor oder durch die XSS-Filterung, kann alles zwischen einem < und dem nächsten > als vermeintliches Tag interpretiert – und dabei verändert oder entfernt – werden. Ihr Vergleich überlebt das nicht immer.
Die Lösung ist offiziell vorgesehen
Das ExpressionScript kennt zu jedem Vergleichsoperator eine Textentsprechung. Sie sind gleichwertig und im Manual dokumentiert:
| Zeichen | Textform | Bedeutung |
|---|---|---|
< | lt | kleiner als |
<= | le | kleiner oder gleich |
> | gt | größer als |
>= | ge | größer oder gleich |
== | eq | gleich |
!= | ne | ungleich |
&& | and | logisches UND |
|| | or | logisches ODER |
Aus alter > 65 wird also alter gt 65 – gleiche Bedeutung, aber ohne Zeichen, die HTML in Versuchung führen. Die Textformen sind keine Notlösung, sondern gleichwertiger Teil der Syntax.
Betroffen sind genau drei Zeichen, die der Editor in HTML-Entitäten verwandelt: & wird zu &, < zu <, > zu >. Selten trifft das auch normalen Text. Wechseln Sie über die Schaltfläche Quellcode die Ansicht im Editor, um mögliche HTML-Fehler zu finden.
Drei weitere Stolpersteine bei Bedingungen
- „=“ und „==“ nicht verwechseln. In ExpressionScript ist
=eine Zuweisung,==ein Vergleich. Schreiben Sie versehentlichalter=65stattalter==65, wird die Variablealterauf 65 gesetzt – und die Bedingung ist danach immer wahr, ohne jede Fehlermeldung. Das ist der gefährlichste Fehler in diesem Artikel, weil er nicht auffällt: Die Bedingung tut scheinbar etwas, nur eben nicht das, was Sie wollten. - Zahl oder Text? Vergleiche funktionieren nur dann wie erwartet, wenn beide Seiten denselben Typ haben. Ein Antwortcode
"05"ist eine Zeichenkette, keine Zahl. Wer numerisch vergleichen will, sollte die Codes auch numerisch anlegen. - Im Zweifel den Bedingungsdesigner rechnen lassen. In neueren Versionen erzeugt er die Relevanzgleichung, die anschließend direkt im Feld Relevanzgleichung weiterbearbeitet werden kann. Wer sich bei einer verschachtelten Bedingung unsicher ist, klickt sie zusammen und schaut sich das Ergebnis an – und prüft dabei gleich, ob der Designer spitze Klammern verwendet hat.
Angewöhnen lohnt sich: In Bedingungen grundsätzlich gt, lt, ge, le und auch eq statt == schreiben. Es liest sich nach kurzer Zeit genauso flüssig, nimmt eine ganze Fehlerquelle aus dem Projekt – und wer eq tippt, kann gar nicht erst aus Versehen nur ein = statt zwei setzen.
Ausführlich im offiziellen Manual: ExpressionScript – HTML-Editor-Problem.