0 votes
in SoSci Survey (dt.) by s066535 (275 points)

Liebes Forum

Ich hab mittels LoopToPage eine Aufgabe programmiert, welche problemlos durchläuft, wenn der Link mit Mac/Chrome oder Windows/Chrome gestartet wird. Wird jedoch zB Windows 10 mit Firefox verwendet, kommt mittendrin (ab ca. Seite 400) eine Fehlermeldung/Hinweis „There is an error in the PHP code: Questionnaire Error: Undefined offset: “ . Die Aufgabe läuft jedoch trotzdem durch.

Die Aufgabe zeigt mittels LoopToPage jeweils ein Bild (in pseudorandomisierter Abfolge), welches anschliessend bewertet werden muss, und loop dies für 96 Bilder durch.

Die Fehlermeldung bezieht sich auf die Seite 32, auf welchem das Bild angezeigt wird. Dort steht folgender Code:

#PHP Code1:
text('noButtons', 'spacing=default', 'css-style=false');
option('breakbutton', false);
option('layout', 'mobile3iaps');

replace('%remain%', 2.5);
text('timer_iaps', 'spacing=default‘);

#PHP Code 2:

$x = loopIndex();
    $id_name = id('IV13', $x + 1);
    if($order[$x] == 1){ //pos
        html('<img src="'.$pos[$zpos].'">');
        put($id_name, $pos[$zpos]);
        $jitterDuration = $arrJitterPos[$zpos];
        $zpos = $zpos + 1;}
    else if($order[$x] == 2){
        html('<img src="'.$neg[$zneg].'">');
        put($id_name, $neg[$zneg]);
        $jitterDuration = $arrJitterNeg[$zneg];
        $zneg = $zneg + 1;}
    else if($order[$x] == 3){
        html('<img src="'.$neu[$zneu].'">');
        put($id_name, $neu[$zneu]);
        $jitterDuration = $arrJitterNeu[$zneu];
        $zneu = $zneu + 1;}
    else if($order[$x] == 4){
        html('<img src="'.$geo[$zgeo].'">');
        put($id_name, $geo[$zgeo]);
        $jitterDuration = $arrJitterGeo[$zgeo];
        $zgeo = $zgeo + 1;}

registerVariable($jitterDuration);

Auf einer vorherigen Seite habe ich die Bilderarrays und ein Array definiert, welches sagt, wie die Reihenfolge der Bilder sein soll:

$pos = array( 'pro://007.jpg',
'pro://050.jpg','pro://066.jpg','pro://073.jpg',
'pro://1590.jpg','pro://1610.jpg','pro://1731.jpg','pro://2075.jpg',
'pro://2156.jpg','pro://2224.jpg','pro://2260.jpg','pro://2346.jpg',
'pro://2395.jpg','pro://4614.jpg','pro://4628.jpg','pro://5201.jpg',
'pro://5621.jpg','pro://5814.jpg','pro://7200.jpg','pro://7480.jpg',
'pro://7492.jpg','pro://7508.jpg','pro://8400.jpg','pro://8531.jpg' );
shuffle($pos); registerVariable($pos); ,...,

pseudorandomization

$arr1 = array(1,1,2,2,3,3,4,4); $arr2 = array(1,1,2,2,3,3,4,4); $arr3 = array(1,1,2,2,3,3,4,4); ,..,

shuffle($arr1);shuffle($arr2);shuffle($arr3);,...,

$order = array_merge($arr1, $arr2,$arr3,$arr4,$arr5,$arr6,
$arr7,$arr8,$arr9,$arr10,$arr11,$arr12); registerVariable($order);

Wenn ich den Link auf meinem Laptop starte, erscheint keine Fehlermeldung, auf zeigt es mit Debug die richtigen Werte jeweils an. Wissen Sie, was ich anders schreiben muss, damit die Fehlermeldung mit Windows 10 nicht mehr auftritt, respektive wieso sie nur bei gewissen Browsern und Betriebssystemkombinationen auftritt?

Vielen Dank

by SoSci Survey (305k points)
PHP-Fehlermeldungen können eigentlich fast unmöglich mit dem Browser zusammenhängen. Ich denke, es handelte sich bei der Beobachung eher um einen zufällige Zusammenhang.

Könnten Sie bitte einmal die exakte Fehlermeldung posten und die Stelle im Code, auf welche diese verweist? Es sollte reichen, wenn Sie eines der Fehler-Interviews einfach nochmal aufrufen. Wenn Sie es im Debug-Modus gestartet haben, dann sehen Sie unter "Erhobene Daten" -> "Daten ansehen" einen Link, der wieder direkt ins Interview springt.

> ab ca. Seite 400

Ich kann aus den Codes oben nicht nachvollziehen, inwiefern die 400 Seiten entstehen. Also, ob Sie loopPage() oder setPageOrder() o.ä. verwenden. Aber 400 Seiten ist definitiv ein Stück weißt aßerhalb des Üblichen.
by s066535 (275 points)
Die vielen Seiten entstehen, da mittels LoopToPage Seite 31-36 insgesamt für 96 Bilder wiederholt werden. Die Fehlermeldung lautet:
"Questionnaire Eror (page 32)
There is an error in the PHP Code:
Questionnaire Error: Undefined offset: 30
line: 17

Questionnaire Error: Undefined offset: 30
line: 18
Questionnaire Error: Undefined offset: 30
line: 19

Ich habs bei mir nochmals durchlaufen lassen. Diese Fehlermeldungen sind bei mir während des Testens nicht sichtbar, sondern nur, wenn ich anschliessend das Interview mit der Print Funktion nochmals anschaue. Die Fehlermeldung kommt aber nicht schon beim ersten Bild, sondern erst nach ca. 24 Bildern.

Ansonsten gerne hier ein Pretestlink:
https://sosci.scicore.unibas.ch/iron/?act=bK6Kmi9jSvAPUcmE7jGapXNM

Um die verwendeten Bilder einer Datenbank zusätzlich zu schützen, habe ich jeweils mit html den Rechtsklick versucht auszuschalten mittels html:
<body oncontextmenu="return false">

Daran wird es aber nicht liegen, oder?

2 Answers

0 votes
by SoSci Survey (305k points)

Ihr HTML-Code gegen den Rechtsklick sollte unproblematisch sein.

Questionnaire Error: Undefined offset: 30
line: 17

Könnten SIe bitte mal nachsehen, was in den Zeilen 17 bis 19 des PHP-Codes steht (eventuell ist die Nummer um 1-2 Zeilen verschoben)? Ich würde auf so einen Blick tippen

html('image');
put($id_name, $geo[$zgeo]);
$jitterDuration = $arrJitterGeo[$zgeo];

Da steht dreimal $geo[$zgeo] bzw. einmal $arrJitterGeo[$zgeo].

Und scheinbar hat $zgeo den Wert 30, aber in den beiden Arrays gibt es womöglich nur 30 Elemente (Index 0-29).

Nun weiß ich natürlich nicht, was in Ihren Arrays $pos, $neg, $neu und $geo steht - und ich weiß auch nicht in welchem Dreierblock das Problem auftritt. Daher kann ich dazu nichts genaueres sagen.

Diese Fehlermeldungen sind bei mir während des Testens nicht sichtbar, sondern nur, wenn ich anschliessend das Interview mit der Print Funktion nochmals anschaue.

Seltsam. Haben Sie irgendwo eine Randomisierung mittels shuffle() verwendet (die womöglich in der Druckansicht einen anderen Wert liefert als im Interview).

by s066535 (275 points)
Ich denke der Fehler weisst auf jeweils die Zeile mit  $jitterDuration = hin. Wenn ich mittels Debug jeweils zB debug($zgeo) ausgebe, gibts alles korrekt an (von 0-23), es kommt da gar nie > 23 (die Arrays enthalten 24 Elemente). Der Task läuft bei mir auch bis zum Ende durch, er hört nicht auf.

Genau, shuffle hab ich verwendet. Die gezeigte Bilderabfolge in der Druckansicht entspricht auch nicht der tatsächlichen, da habe ich die richtige Reihenfolge in internen Variablen gespeichert.
by SoSci Survey (305k points)
Nun, am besten lässt sich so ein Fehler eingrenzen, wenn man ihn replizieren kann. Wenn Sie also einen Fall haben, dessen Druckansicht das Problem verlässlich auswirft, dann ist das ein guter Ansatzpunkt.

Ich würde empfehlen, dass Sie als erstes mal die Inhalte der Variablen ausgeben lassen. Dafür könnten Sie z.B. folgendes ergänzen. Nehmen wir einmal an, die Probleme entstehen in Fall CASE=123 in dieser Zeile...

$jitterDuration = $arrJitterPos[$zpos];

Dann könnten Sie darunter einmal folgendes ergänzen:

if (caseNumber() == 123) {
  html('<p>zpos = '.$zpos.'</p>');
  html('<p>arrJitterPos = '.var_export($arrJitterPos, true).'</p>');
}

Ob var_export() funktioniert, kann ich nicht sicher sagen. Eventuell muss ich da noch eine bessere Lösung suchen. Aber schon der Wert in $zpos wäre ja relevant.
by s066535 (275 points)
Vielen Dank. Var_export hat nicht geklappt, aber ich hab alle Variablen x/zpos/zneg/zneu/zgeo/jitter_Duration bei jedem Bild per html während dem Durchführen anzeigen lassen. Da konnte ich keinen Fehler finden, dh es hat für alle Bilder und Kategorien die richtigen Items aus den Arrays genommen, es hat jeweils bei allen korrekt hochgezählt, es hatte genügend Items in den Arrays, das gesehene stimmt mit dem Inhalt der internen Variablen überein (die Arrays der Bilder und JitterDuration wurde geshuffelt).

Wenn ich nach dem durchlaufen lassen des Tasks die Druckansicht öffne, wird aber nun nicht mehr die gesehene Bilderabfolge und Werte angezeigt. Auch zeigt es nur die ersten 40 Bilder an (x von 0 bis 39), nicht alle 96 (auch kein "show all pages). Ist es möglich, dass das Problem auftaucht, weil verschiedene Variablen geshufflet werden und die Druckansicht bei jedem Aufrufen neu shuffelt? Oder wenn mehrere Leute parallel teilnehmen?
Gibt es eventuell einfach eine Möglichkeit, die Fehlermeldung zu unterdrücken, damit die wenigen Fälle (bei spezieller Kombination von Browser und Einstellungen) den Task ungestört machen können?
by SoSci Survey (305k points)
> Wenn ich nach dem durchlaufen lassen des Tasks die Druckansicht öffne, wird aber nun nicht mehr die gesehene Bilderabfolge und Werte angezeigt.

Sofern Sie die Variablen nicht mittels putList() o.ä. speichern, ist die Reihenfolge auch nicht im Datensatz gespeichert. Das ist soweit korrekt. Allerdings sollte in der Druckansicht der PHP-Code dann einfach eine neue Reihenfolge würfeln.

Möchten Sie das gesamte Projekt vielleicht einmal als XML-Datei exportieren und mir zur Analyse an die info@soscisurvey.de zukommen lassen?

> und die Druckansicht bei jedem Aufrufen neu shuffelt?

Das auf alle Fälle, wenn Sie mit shuffle() arbeiten - aber das sollte eigentlich nicht konsistent dazu führen, dass es im Interview funktioniert und in der Druckansicht zu Fehlern führt...

> Oder wenn mehrere Leute parallel teilnehmen?

Solange Sie nicht mit der Datenbank für Inhalte arbeiten, welche Daten über Interviews hinweg koordiniert, dürften parallele Teilnahmen (die ja absolut üblich sind) kein Problem darstellen.

> Gibt es eventuell einfach eine Möglichkeit, die Fehlermeldung zu unterdrücken, damit die wenigen Fälle (bei spezieller Kombination von Browser und Einstellungen) den Task ungestört machen können?

Ich würde unbedingt empfehlen, dass wir den Fehler identifzieren und beheben. Ich denke nicht, dass es an Browser und/oder Betriebssystem liegt. Und wenn man Fehler nicht behebt, wird das am Ende ziemlich sicher zu Ärgernissen an der ein oder anderen Stelle führen.
by s066535 (275 points)
Sehr gerne habe ich Ihnen das Experiment gemailt. Herzlichen Dank.
by SoSci Survey (305k points)
Ich stolpere beim Testen gerade darüber, dass bei Frage B013 vor dem ersten Stimulus eine Wartezeit von 20 Sek (20.000 ms) eingestellt ist. Ist das beabsichtigt?

Wenn ich (im Debug-Modus) auf Seite 23 springe, dann bekomme ich mehrfach den Hinweis, dass Sie in Ihren HTML-Inhalten das <body>-Tag verwenden, und dass dies ziemlich sicher zu Problemen führt. Solche Probleme sollten Sie generell beseitigen - ein <body>-Tag hat innerhalb (!) des Fragebogens nichts zu suchen.
by SoSci Survey (305k points)
Ich bekomme die Fehlermeldungen auch beim Testen im Fragebogen schon angezeigt. Allerdings bleiben dieser aufgrund der automatischen Weiterleitung nicht allzu lange sichtbar. Es scheint sich demnach nicht um ein Problem mit der Druckansicht, sondern mit Ihrer Programmierung im Allgemeinen zu handeln.

Ich posten nochmal eine separate Antwort mit Screenshot.
0 votes
by SoSci Survey (305k points)

Wie unten angekündigt, hier nochmal der Screenshot direkt aus dem laufenden Experiment - also bei Ausfüllen des Fragebogens.

Screenshot

Ergänzt habe ich hierein debug($pos);, um das Problem einzugrenzen. Hier sieht man recht gut, dass in $pos nur die Indizes 0 bis 23 definiert sind. Aber die Variable $zpos hat den Wert 30. Entsprechend kann $pos[$zpos] nicht funktionieren.

Meines Erachtens liegt das Problem darin, dass Sie $zpos unkontrolliert hochzählen:

$zpos = $zpos + 1;

Das kann unbeabsichtigte Effekte haben. Wird die Seite z.B. wegen eines F5 neu geladen, zählen Sie doppelt. Meine Empfehlung wäre, dass Sie auf Basis des loopIndex() und mithilfe einer FOR-Schleife über die $order-Variable jedesmal abzählen, was die aktuelle korrekte Position innerhalb der Kategorie ist.

Der Fehler scheint aber einfach dadurch zu entstehen, dass die Variable entweder zu schnell hochzählt oder dass es zu viele Wiederholungen gibt. Ich habe zwischen 2 Wiederholungen beobachtet, dass sich die Werte wie folgt geändert haben:

zpos = 6
zneg = 6
zneu = 6
zgeo = 7

zu

zpos = 6
zneg = 7
zneu = 6
zgeo = 8

und nächste Wiederholung (laut der von Ihnen schon eingebauten Ausgabe)

zpos = 7
zneg = 8
zneu = 6
zgeo = 8

Wenn ich es nicht falsch gesehen habe, wurden da beidesmal zwei Werte auf einmal hochgezählt.

Bis ins Detail kann ich das aufgrund der langen PHP-Codes nicht ergründen. Aber wie schon oben geschrieben, erachte ich das manuelle Hochzählen und das "Mitnehmen" von Zählvariablen über mehrere Seiten für höchst fehleranfällig und würde daher zu verlässlichen Zählern raten. Also den loopIndex() und auf dessen Basis immer frisch ausrechnen, wo die Teilzähler gerade sind.

by s066535 (275 points)
Herzlichen Dank für Ihre Unterstützung und Ihre Hinweise. Ich habe vor der LoopToPage Seiten eine Seite eingebaut, in der ich die generierte Reihenfolge der Bilder, Jitterduration, und AnzahlBildinKategorie in je ein Array "$finpicname" packe mittels:

for ($d=0; $d<count($order); $d++) {

if($order[$d] == 1 ){//pos
    $finpicname[] = $pos[$zpos];
    $finjitterdur[] = $arrJitterPos[$zpos];
    $finpicnumberval[] = $poscount[$zpos];
    $zpos = $zpos + 1;}
elseif ($order[$d] == 2) {//neg
    $finpicname[] = $neg[$zneg];
    $finjitterdur[] = $arrJitterNeg[$zneg];
    $finpicnumberval[] = $negcount[$zneg];
    $zneg = $zneg + 1;}
elseif ($order[$d] == 3) {//neu
    $finpicname[] = $neu[$zneu];
    $finjitterdur[] = $arrJitterNeu[$zneu];
    $finpicnumberval[] = $neucount[$zneu];
    $zneu = $zneu + 1;}
elseif ($order[$d] == 4) {//geo
    $finpicname[] = $geo[$zgeo];
    $finjitterdur[] = $arrJitterGeo[$zgeo];
    $finpicnumberval[] = $geocount[$zgeo];
    $zgeo = $zgeo + 1;}
}

Somit reicht mir nun der folgende Code innerhalb der Schlaufe beim zeigen der Bilder:

$x = loopIndex();
$id_name = id('IV13', $x + 1);

$picToShow = $finpicname[$x];
html('<img src="'.$picToShow.'">');

put($id_name, $finpicname[$x]);
$jitterDuration = $finjitterdur[$x];
registerVariable($jitterDuration);

Bis jetzt sind beim Testen keine Fehlermeldungen mehr aufgetaucht. Denken Sie, so ist es in Ordnung?
by SoSci Survey (305k points)
Eine vollständige Codeanalyse will ich hier nicht leisten. Zumal Sie den Code nicht kommentiert haben, sodass er einfach lesbar wäre. Aber wenn alles funktioniert und keine Fehlermeldungen auftauchen, dann sind die Chancen gut, dass es funktioniert.

Dass Sie jetzt mit loopIndex() arbeiten ist sicher robuster als mit registerVariable() und dem manuellen hochzählen.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...