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)
Okay, habe ich gemacht und der Fehler trat eben mit dem Schlüssel 6 auf.

Diesen Code habe ich also auf einer separaten Seite ausgeführt:
$deckNr = 6;
$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);


Das führte zu folgender Fehlermeldung:
Für den Schlüssel 6 liegen in der Datenbank keine Daten vor.
Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Trying to access array offset on false
Zeile: 14

PHP-Code

011  
012 shuffle($vigArray);
013
014  
015 $vigNr = array_pop($vigArray);
016
017

Die Fehlermeldung ist also exakt die gleiche wie sonst auch, nur reproduzierbar (sie kommt jetzt bei jedem mal ausführen).
by SoSci Survey (327k points)
edited by SoSci Survey
Gut, wenn der Fehler reproduzierbar ist, dann sind wir schonmal einen Schritt weiter.

Prüfen Sie nun bitte in der Datenbank für Inhalte, ob dort ein Schlüssel "6" vorliegt - und zwar genau so, also nicht z.B. "06". Und bitte prüfen Sie auch, was für diesen Eintrag in der Spalte "Sprache" steht? Verwenden Sie einen mehrsprachigen Fragebogen?
by s294006 (110 points)
Ja, in der Datenbank liegt ein Schlüssel 6 vor. Der Fehler kommt auch mit sämtlichen anderen Schlüsseln (die alle vorliegen). Die Sprache ist deu, der Fragebogen steht auch nur in einer Sprache zur Verfügung.
by SoSci Survey (327k points)
Wären Sie damit einverstanden, wenn ich einen Admin-Zugang zu dem betroffenen Projekt erstellen und mir das einmal direkt ansehe? Ich sehe die Datenbank-Einträge in der Datenbank, kann das Problem in einem anderen Projekt aber nicht replizieren. Daher würde ich mir das Ganze gerne im Kontext ansehen.
by s294006 (110 points)
Ich habe jetzt folgenden Code ergänzt:

$deckArray = false;
while ($deckArray == false) {
    $deckArray = dbGet($deckNr);
}
und das Problem trat bisher nicht mehr auf, ob das jedoch eine gute Lösung ist, weiß ich nicht. Dafür erhalte ich an einer anderen Stelle einen sporadischen Fehler (immer noch im Vignettenteil der Studie), mit dem ich auch nichts anzufangen weiß:

Im PHP Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined array key ""
Zeile: 14

Ganz generell scheint es immer wieder zu Problemen beim Zugriff auf die Datenbank zu kommen. Gern können Sie sich einen Admin-Zugang erstellen, wir sind gerade im Pretest (daher auch die Rückmeldung zu den Fehlern), aber das sollte ja nicht stören.
by SoSci Survey (327k points)
Dieser Code versucht eigentlich nur mehrfach, Anfragen an die Datenbank für Inhalte zu stellen. Sollte der Schlüssel nicht gefunden werden, hängt sich der Fragen dank dem while() in einer Endlosschleife auf. Das scheint mir eine ziemlich riskante "Lösung". Wobei es mich schon sehr interessieren würde, weshalb das Problem durch mehrfache Anfrage an die Datenbank umgangen werden kann. Aber wie gesagt: Ohne den Kontext ist das schwer zu klären.

> einen sporadischen Fehler (immer noch im Vignettenteil der Studie), mit dem ich auch nichts anzufangen weiß:

Wenn Sie Code posten, kann ich mehr dazu sagen. Die Zeilennummer könnte sich auch hier wieder auf die Funktionen in "PHP-Funktionen" anstatt auf den PHP-Code in der Seite beziehen.

> Gern können Sie sich einen Admin-Zugang erstellen

Danke, das werde ich gleich machen.
by SoSci Survey (327k points)
Ich hätte nun versucht, das Problem im Fragebogen "copy" zu replizieren, scheitere aber, weil die Seite "typ" nicht vorhanden ist, und ich entsprechend gar nicht auf Seite 21 mit dem Problem-Code gelange.

Könnten Sie den Code nochmal so abändern, dass das Problem auftritt und mir kurz mitteilen, in welchem Fragebogen auf welcher Seite? Fehler lassen sich deutlich einfacher eingrenzen und beheben, wenn sie replizierbar sind.
by s294006 (110 points)
Ich habe den aktuellen Fragebogen, mit dem wir aktuell auch den Pretest machen und bei denen es zu den Fehlern gekommen ist, in "copy". Bei mir lief der Fragebogen nun wieder ohne Fehler durch, bei anderen ist es jedoch zu der o.g. Fehlermeldung (Undefined array key "") auf verschiedenen Seiten im Vignettenteil (die Seiten sind mit V markiert) gekommen.

In "copy" habe ich jetzt die deckNr noch zu einem int konvertiert, da die Zufallsziehung einen string returned (Evtl. hat die type conversion auch in der Funktion dbGet zu sporadischen Problemen geführt?).
Ansonsten scheint die Abfrage durch dbGet in der while-Schleife problemlos zu funktionieren (die while-Schleife ist nur im Fragebogen "master" noch drin). Da theoretisch keine fehlerhafte Abfrage möglich ist, ist auch noch keine Endlosschleife bekannt.
by SoSci Survey (327k points)
> Evtl. hat die type conversion auch in der Funktion dbGet zu sporadischen Problemen geführt?

dbGet() konvertiert den Schlüssel immer zu einem String, daran dürfte es also nicht liegen.

> Bei mir lief der Fragebogen nun wieder ohne Fehler durch, bei anderen ist es jedoch zu der o.g. Fehlermeldung

Gut, dann sehe ich mir den anderen nochmal gezielt an.
by SoSci Survey (327k points)
Ich habe jetzt nochmal mit dem Fragebogen "master" getestet. Mit folgenden PHP-Code auf Seite 23 kann das Deck fix auf Nr. 6 eingestellt werden, wenn man "true" auf "false" ändert:

if (true) {
    $deckNr = (int) value('RD01');
    //debug($deckNr);
    $deckArray = false;
    while ($deckArray == false) {
        $deckArray = dbGet($deckNr);
    }
} else {
    // Testing
    $deckNr = 6;
    $deckArray = dbGet($deckNr);
}

Mir wird allerdings weiterhin kein Fehler angezeigt. Bei Ihnen?
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

...