0 votes
in SoSci Survey (dt.) by s294006 (110 points)

Hallo,
ich mache eine Vignettenstudie, für die ich Daten in die Datenbank geladen habe. Ich habe eine Zufallsvariable (RD01) generiert, bei der ein Deck aus der Datenbank gezogen wird (von insgesamt 30) und lasse nun auf 10 aufeinanderfolgenden Seiten jeweils eine Vignette anzeigen. Das Ganze funktioniert auch reibungslos, außer dass ab und zu ohne erkennbaren Anlass ein sporadischer Fehler auftritt ("Für den Schlüssel X (beliebige Zahl) liegen in der Datenbank keine Daten vor."). In der Datenbank liegen jedoch definitiv Daten vor.
Der Fehler legt nahe, dass es ein Problem mit dbGet gibt. Der Beginn meines php-Codes lautet wie folgt:

$deckNr = value('RD01');
$deckArray = dbGet($deckNr);

Fehler im Fragebogen: Trying to access array offset on false
In der Fehleranzeige wird dann die Zeile 14 rot markiert mit dem Befehl shuffle($vigArray); der jedoch überhaupt nichts mit der Datenbank-Abfrage zu tun hat. Das Ganze ergibt also nicht so richtig Sinn. (Selbst wenn man den Code ergänzt / ändert, wird die Zeile 14 rot markiert).

Wenn das Problem einmal auftritt, wird es auf jeder der darauffolgenden Seite angezeigt, sodass der Fragebogen unbrauchbar wird. Wie kann ich das Problem lösen?

Viele Grüße

by s109993 (12.0k points)
Was steht denn in der Zeile 14? Können sie einmal ihren ganze Code in die Frage kopieren?
by s294006 (110 points)
auf der ersten Seite der Vignetten steht dieser Code:

// Die Zufallszahl wurde mittels RD01 gezogen
// only on first occurring page
$deckNr = value('RD01');
$deckArray = dbGet($deckNr);

// Initialize the array with numbers 0-9
// only on first occurring page
$vigArray = range(0, 9);

// Randomize the order of the numbers
// only on first occurring page
shuffle($vigArray);

// Pop an element from the array
$vigNr = array_pop($vigArray);

// Save variable in Fragenkatalog
// only on first occurring page
put('PV01_01', $deckNr);
put('PV02_01', $vigNr);

// Save variable globally (for later use)
// only on first occurring page
registerVariable($deckNr);
registerVariable($vigArray);

// HTML-Ausgabe des Inhalts
//htmlGen($vigNr, $vigArray, $deckNr, $deckArray);
showVig($vigNr, $vigArray, $deckNr, $deckArray);

auf jeder weiteren steht dieser:
// Die Zufallszahl wurde mittels RD01 gezogen
$deckArray = dbGet($deckNr);

// Pop an element from the array
$vigNr = array_pop($vigArray);

// Save variable in Fragenkatalog
put('PV01_01', $deckNr);
put('PV02_01', $vigNr);

// HTML-Ausgabe des Inhalts
//htmlGen($vigNr, $vigArray, $deckNr, $deckArray);
showVig($vigNr, $vigArray, $deckNr, $deckArray);

Aber wie gesagt, unabhängig davon was genau in der Zeile steht (selbst wenn man zusätzlichen Code ergänzt etc.) wird diese rot markiert.

1 Answer

0 votes
by SoSci Survey (327k points)

Aus der internen Fehlermeldung ist die genaue Position des Fehlers nicht immer eindeutig erkennbar - in Ihrem Fall vermute ich sogar, dass der Fehler in der Funktion showVig() entsteht, die Sie vermutlich unter "PHP-Funktionen" definiert haben. Daher der Verweis auf die falsche Zeile.

Ursache ist aber dass dbGet() kein Array sondern false liefert, wenn es den Schlüssel nicht findet. Und Ihre Funktion will $deckArray dann aber wahrscheinlich als Array verwenden.

("Für den Schlüssel X (beliebige Zahl) liegen in der Datenbank keine Daten vor."). In der Datenbank liegen jedoch definitiv Daten vor.

Ergänzen Sie doch bitte über dem dbGet() noch eine Zeile:

$deckNr = value('RD01');
debug($deckNr);
$deckArray = dbGet($deckNr);

Wenn Sie dann einen Fall haben, in welchem der Fehler auftritt, notieren Sie bitte, was genau angezeigt wird. Wenn da z.B. die 13 angezeigt wird, dann versuchen Sie als nächstes (gerne auf einer separaten Seite).

$deckNr = 13;
$deckArray = dbGet($deckNr);

Was passiert dann?

by s294006 (110 points)
Ich habe eben den Fragebogen im Pretest (master) selbst getestet und es lief alles glatt bis ich auf Seite 28 wieder den Fehler erhalten habe (Undefined array key "" Zeile: 14). Also das Problem besteht nach wie vor. Danach tritt auf jeder weiteren Seite das Problem auf, also wenn die Fehlermeldung einmal kam, wird keine der Vignetten auf den nachfolgenden Seiten richtig angezeigt.
Solange dieses Problem auftritt, können wir mit dem Fragebogen leider nicht ins Feld gehen, obwohl die Zeit etwas drängt. Haben Sie noch irgendwelche Ideen? Meiner Ansicht nach stimmt mit dem Code alles, da er ja auch in vielen Fällen fehlerlos durchläuft.
by s294006 (110 points)
dbGet scheint nicht mehr ein Problem zu sein, vor allem mit dbGet() in der while Schleife kann da der sporadische Fehler an der Stelle der Datenbankabfrage umgangen werden.

Problematischer und auch noch sporadischer ist aktuell ein Fehler, bei dem ein Array, welches ich mit registerVariable() für nachfolgende Seiten verfügbar gemacht habe, plötzlich leer ist (Array wird anfangs initialisiert, registered und dann auf den nachfolgenden Seiten jeweils ein Element herausgenommen). Der Fehler scheint nicht im Debug-Modus aufzutreten, sondern nur im Vorschau-Modus (und in den Pretests ist er auch sporadisch aufgetreten). Die Dokumentation von registerVariable() ist auch nicht ganz richtig glaube ich: in der Dokumentation steht, dass der Variablenname als String übergeben werden muss - das geht nicht, es muss die Variable selbst übergeben werden.

Die Probleme mit registerVariable() lösen dann auch den Fehler "Undefined array key "" Zeile: 14" aus: da die registered Variable plötzlich leer ist, ist auch das Element, welches ich aus dem Array ziehen möchte leer bzw. == "". Und mit diesem leeren Element als key versuche ich dann in einem anderen Array auf Daten zuzugreifen. Aber das Problem liegt ursprünglich in registerVariable().
by SoSci Survey (327k points)
> vor allem mit dbGet() in der while Schleife kann da der sporadische Fehler an der Stelle der Datenbankabfrage umgangen werden.

Ich hätte das Problem gerne geklärt, weil es eigentlch nicht auftreten dürfte. Aber ich verstehe, wenn Sie gerade andere Prioritäten haben :)

> bei dem ein Array, welches ich mit registerVariable() für nachfolgende Seiten verfügbar gemacht habe, plötzlich leer ist

registerVariable() ist nicht ganz ungefährlich, vor allem in Verbindung mit rotierten Seiten. Wenn man auf eine Seite springt, wo $a = [] steht (also, wenn das Array $a hieße), dann ist alles weg. Oder wenn man eine Seite mehrfach lädt, die jeweils ein Element herausnimmt. Dann wird bei jedem Reload ein Element entfernt, wenn sie nicht aufpassen.

Was macht das Array denn in Ihrem Fall? Vielleicht lässt es sich einfacher durch einen Zufallsgenerator ersetzen oder Sie nehmen nichts heraus, sondern verwenden einfach immer ein anderes Element, und erledigen die Zählung auf anderem Wege.

>  Der Fehler scheint nicht im Debug-Modus aufzutreten, sondern nur im Vorschau-Modus

Diese Modi funktionieren exakt gleich (es ist derselbe Code der läuft) mit dem einzigen Unterschied, dass der Debug-Modus zusätzliche Informationen anzeigt.

> in der Dokumentation steht, dass der Variablenname als String übergeben werden muss

Wo steht das denn noch? Das war früher mal so, und funktioniert im Prinzip immer noch - aber SoSci Survey erledigt das seit langem vollautomatisch, weil es einfach verwirrend war.
by s294006 (110 points)
Auf dieser Seite steht unter VariablenName ein sehr widersprüchlicher Satz: https://www.soscisurvey.de/help/doku.php/de:create:functions:registervariable

Ansonsten habe ich den Code jetzt so umgebaut, dass auf der ersten Seite des Vignettenteils (S. 22) die Elemente des Arrays der Reihe nach in internen Variablen gespeichert werden (anstatt registerVariable zu verwenden). Diese rufe ich auf den nächsten Seite anschließend wieder auf zur Anzeige der entsprechenden Vignette. Das scheint bisher ohne Fehler durchzulaufen. Dann lag der Fehler wahrscheinlich daran, dass das Array nicht in jedem Fall richtig übergeben werden konnte.
Sehen Sie bei dem derzeitigen Vorgehen noch irgendwelchen potenziellen Fehlerquellen?  Ansonsten habe ich jetzt die Hoffnung, dass das Ganze stabil ist.
by SoSci Survey (327k points)
Dankeschön, wir hatten es an vielen Stellen korrigiert - nur offenbar dort nicht, wo es am offenkundigsten gewesen wäre. Jetzt aber.

> Sehen Sie bei dem derzeitigen Vorgehen noch irgendwelchen potenziellen Fehlerquellen?

Sofern Sie die while()-Schleifen noch verwenden, würde ich empfehlen, diese wieder zu entfernen. Nennen Sie es Bauchgefühl. Ansonsten ist es ein recht gutes Zeichen, wenn es in den Tests funktioniert.

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

...