0 votes
in SoSci Survey (dt.) by s117257 (175 points)
edited by SoSci Survey

Hallo SoSci Survey Team!

Ich arbeite für meinen Fragebogen mit einem externen Panel-Anbieter zusammen. Den Teilnehmern werden verschiedene Marken angezeigt, die sie bewerten. Auf Basis dieser Bewertung werden fünf Marken ausgewählt, die die Teilnehmer dann nochmal auf weiterführenden Abfragen bewerten. Um nachzuvollziehen, welche Marken selektiert werden, speichere ich diese in internen Variablen. In der Übersicht der erhobenen Daten sind diese auch in allen Tests (auch bei einem Test-Lauf mit dem Panel-Anbieter) sichtbar gewesen.

Beim Live-Gang sind die Daten nun aber nicht mehr sichtbar. D.h. ich kann die Bewertungen der Marken sehen, aber nicht mehr, welche Marken eigentlich bewertet wurden. Nur bei zwei Teilnehmern war dies noch möglich. Wenn ich den Fragebogen jetzt selbst teste, werden die Marken auch nicht mehr gespeichert.

Das Ablegen der Daten erfolgte mittels folgendem Code:

if(count($Itemliste3)==1) {put('BP07_02', $marken[$Itemliste3[0]]);}
elseif (count($Itemliste3)==2) {put('BP07_02', $marken[$Itemliste3[0]]); put('BP07_03', $marken[$Itemliste3[1]]);}
elseif (count($Itemliste3)==3) {put('BP07_02', $marken[$Itemliste3[0]]); put('BP07_03', $marken[$Itemliste3[1]]); put('BP07_04', $marken[$Itemliste3[2]]);}

usw. bis 5 Marken.

Welchen Grund kann es geben, dass die Marken erst gespeichert wurden und jetzt nicht mehr? Im Code habe ich nichts umgestellt oder geändert.

Vielen Dank vorab für die Unterstützung!

Felix

1 Answer

0 votes
by SoSci Survey (327k points)

Das Ablegen der Daten erfolgte mittels folgendem Code

Schwer zu beurteilen ... mit welchem Code wird denn das Array $Itemliste erstellt?

Meine erste Vermutung wäre, dass es keine oder mehr als 3 Element enthält - also keine der drei Bedigungen zutrifft.

Meine zweite Vermutung wäre, dass der PHP-Code überhaupt nicht ausgeführt wird. Etwa, weil ein Filter davor greift.

Meine dritte Vermutung wäre, dass sich unter Fragebogen zusammenstellen -> Fragebögen verwalten noch eine ältere Kopie des Fragebogens befindet, und dass diese anstatt des richtigen Fragebogens verwendet wurde.

Sie sehen ... an möglichen Erklärungen fehlt es mir nicht. Aber ob es eine davon ist oder das Problem an ganz anderer Stelle liegt, vermag ich ohne weitere Informationen nicht zu sagen.

by s117257 (175 points)
Ich habe dazu nochmal den Code geprüft und bin in den Debug-Modus gegangen. Beim Durchlaufen erscheint dann die Fehlermeldung "Index undefined". Allerdings hat vor einigen Wochen noch alles funktioniert, daher habe ich dort zunächst nicht geschaut. Das Array wird wie folgt erstellt:

$Itemliste1 = getItems('M002', '>' , 3);
$Itemliste2 = getItems('M003', '>' , 3);

$Itemliste3 = array_intersect ($Itemliste1, $Itemliste2);
replace('%panelID%', $id);
if(count($Itemliste3)==0)
{redirect('https://samplicio.us/s/ClientCallBack.aspx?RIS=20&RID=%panelID%', true);};

shuffle($Itemliste3);
registerVariable($Itemliste3);

$AnzahlItems = count($Itemliste3);
registerVariable($AnzahlItems);

    if ($AnzahlItems == 1) {$Itemliste4 = array ($marken[$Itemliste3[0]]);}
elseif ($AnzahlItems == 2) {$Itemliste4 = array ($marken[$Itemliste3[0]], $marken[$Itemliste3[1]]);}
elseif ($AnzahlItems == 3) {$Itemliste4 = array ($marken[$Itemliste3[0]], $marken[$Itemliste3[1]], $marken[$Itemliste3[2]]);}
elseif ($AnzahlItems == 4) {$Itemliste4 = array ($marken[$Itemliste3[0]], $marken[$Itemliste3[1]], $marken[$Itemliste3[2]], $marken[$Itemliste3[3]]);}
elseif ($AnzahlItems >= 5) {$Itemliste4 = array ($marken[$Itemliste3[0]], $marken[$Itemliste3[1]], $marken[$Itemliste3[2]], $marken[$Itemliste3[3]], $marken[$Itemliste3[4]]);};

registerVariable($Itemliste4);

Insofern scheint Vermutung zwei zuzutreffen. Leider habe ich für dieses Problem keine Dokumentation finden können.
by SoSci Survey (327k points)
Kann es sein, dass Ihr großer Block am Ende nach registerVariable($AnzahlItems); nichts anderes macht als die Itemliste3 in die Itemliste4 zu kopieren? Mit einer Begrenzung auf 5 Items? Das ginge auch einfacher:

$Itemliste4 = array_slice($Itemliste3, 0, 5);

Auch beim put() rate ich zu einer Vereinfachung, die flexibler ist, was die Inhalte angeht:

foreach ($Itemliste3 as $i => $item) {
  // Maximal 5
  if ($i >= 5) {
    break;
  }
  // Umspeichern in interne Variable
  $varID = id('BP07', $i+2);
  put($varID, $item);
}

> Leider habe ich für dieses Problem keine Dokumentation finden können.

Nun, das dürfte daran liegen, dass es sich hierbei um einen inhaltlichen Fehler in Ihrem (eher speziellen) PHP-Code handelte. Mir würde spontan nicht einfallen, wie so etwas in der Anleitung abzubilden wäre?

Es ist ja der enorme Vorteil von PHP-Code im Fragebogen, dass man damit nahezu jede Login implementieren kann, die man in der Befragung benötigt. Aber der Nachteil ist eben, dass dabei oft sehr individuelle Codes entstehen - nahezu unbegrenzte Möglichkeiten, die man nicht mehr so einfach in eine endliche Anleitung packen kann.

> Beim Durchlaufen erscheint dann die Fehlermeldung "Index undefined".

Sie schreiben leider nicht, auf welche Zeile in welchem PHP-Code genau sich die Fehlermeldung bezieht. Sonst könnte ich vielleicht mehr dazu sagen ...

> Allerdings hat vor einigen Wochen noch alles funktioniert

... warum der Fehler nun aufgetreten ist. Ich vermute stark, dass es damit zusammenhängt, wie viele Items man in den beiden Fragen M002 und M003 ankreuzt. Aber das ist ohne weitere Hintergründe erstmal nur Spekultion.
by s117257 (175 points)
Danke schon mal für die Hinweise und die Vereinfachung des Codes! Tatsächlich ist mir bewusst, dass meine Vorgehensweise etwas umständlich ist, es ist aber auch mein erstes Projekt dieser Art. :)

Ich baue Ihre Vorschläge erstmal in meinen Code ein.

Die Fehlermeldung bezieht sich auf den Code, den ich oben gepostet habe. Z.B. wie folgt:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Undefined index: Thomapyrin
Zeile: 157

PHP-Code

154
155 registerVariable('limits');
156
157 if($AnzahlItems == 1) {put('BP07_02', $marken[$Itemliste4[0]]);}
158 elseif ($AnzahlItems == 2) {put('BP07_02', $marken[$Itemliste4[0]]); put('BP07_03', $marken[$Itemliste4[1]]);}

Thomapyrin ist in diesem Fall die (einzige) Marke, die selektiert wurde. Wenn es mehrere Marken sind (max. 5), erscheint die Fehlermeldung für jede Marke in der gleichen Form.
by SoSci Survey (327k points)
Sie schreiben

put('BP07_02', $marken[$Itemliste4[0]]);

Womöglich ist $Itemliste4[0] bereits der Text "Thomapyrin" - zumindest haben Sie weiter oben ja geschrieben:

$Itemliste4 = array ($marken[$Itemliste3[0]]);

Damit haben Sie die Codes bereits in Markennamen "umkodiert". Einen entsprechenden Index "Thomapyrin" gibt es in $marken nicht.

Wenn Sie sich genauer ansehen wollen, was in Ihren Variablen steht, dann fügen Sie über der Zeile mit dem Fehler doch mal folgendes ein:

debug($Itemliste3);
debug($Itemliste4);
by s117257 (175 points)
Hi,

ja, das scheint der Punkt zu sein. Wenn ich Ihren Code nutze, funktioniert der war, aber dann fehlt der Markenname in der internen Variable.

Zum Hintergrund: Auf der Seite davor (S. 3) wird das Array $marken wie folgt erstellt:

'$marke0 = value('M004x01', 'label');
registerVariable($marke0);
replace('%marke1%', $marke0);

$marke1 = value('M004x02', 'label');

//... bis Marke 20. Dann:

$marken = array(1 => $marke0, 2 => $marke1,

//usw. bis Marke 20.'

So sind dann in der Itemliste auch nur die keys und nicht die Markennamen enthalten. Auf der Folgeseite (S. 4) erfolgt aber auch die Erstellung eines Array mit Limits zur späteren Quotierung für die Marke, in dem dann die Markennamen die Keys sind. Die gute Nachricht ist aber, dass die internen Variablen wieder korrekt im Datensatz gespeichert werden, nur eben jetzt mit Zahlen statt mit Markennamen.

Debug-Information für $Itemliste4: 2, 1

Daher: Gibt es die Chance, in der von Ihnen beschriebenen Schleife auch wieder die Markennamen zu nutzen, so wie es vorher in meinem (umständlicheren) Code der Fall gewesen ist? Dann wäre es so, wie es sein müsste.

Herzlichen Dank vorab, auch für die schon gegebenen Hinweise. Das Support-Forum ist wirklich eine große Hilfe!
by SoSci Survey (327k points)
> So sind dann in der Itemliste auch nur die keys und nicht die Markennamen enthalten.

Aber mit dem 'label' rufen Sie doch gerade den Markennamen ab und nicht den numerischen Code. Wobei ich natürlich icht weiß, was M004 für ein Fragetyp ist? Wenn es offene Nennungen sind, sind SIe natürlich ein wenig eingeschränkter.
by s117257 (175 points)
Nein, es handelt sich um eine Abfrage zu vorgegebenen Markennamen mit einer Likert-Skala. Um das Problem zu lösen habe ich folgendes probiert.

Ich habe zunächst einmal geprüft, ob sich mit Hilfe der Itemliste4 (beinhaltet 5 Zahlen) auf das array $marken (beinhaltet die Markennamen) zugreifen lässt, das funktioniert:

$Test = $marken[$Itemliste4[0]];
Im Debug-Modus wird dann die entsprechende Marke angezeigt.

Im nächsten Schritt würde ich nun gerne die Ziffern in $Itemliste4 in Markennamen überführen, um sie danach in die internen Variablen zu speichern. (Wie von Ihnen oben beschrieben.)

O.g. Vorgehen lässt sich aber nicht in einer Schleife umsetzen, da folgt wieder die Fehlermeldung mit dem undefinierten Index. So sieht der Code für die Schleife aus:

foreach ($Itemliste4 as $n => $Itemliste5) {

$Itemliste5 = $marken[$Itemliste4[$n+1]];
};

Mich wundert ehrlicherweise, dass die Zuweisung in der Einzelanweisung oben funktioniert, als Schleife aber nicht...
by SoSci Survey (327k points)
> es handelt sich um eine Abfrage zu vorgegebenen Markennamen mit einer Likert-Skala

Dann ist mir aber unklar, woher die Kennung M004x02 kommt. Likert-Skalen haben Kennungen mit Unterstrich.

> Ich habe zunächst einmal geprüft, ob sich mit Hilfe der Itemliste4 (beinhaltet 5 Zahlen) auf das array $marken (beinhaltet die Markennamen) zugreifen lässt

Prüfen Sie bitte auf alle Fälle, ob die Inhalte passen. Vielleicht ist für Sie die Funktion getItemtext() interessant? Damit bekommen Sie den Text ohne Umwege (und Fehlerquellen).

> Im nächsten Schritt würde ich nun gerne die Ziffern in $Itemliste4 in Markennamen überführen

Sie haben bisher stets nur Ausschnitte aus dem PHP-Code gepostet, daher kann ich nicht beurteilen, ob dieses Vorgehen in Ihrem Fall das korrekte Ergebnis liefert. Was jedenfalls wenig Sinn macht ist, dass Sie mit foreach() eine Variable $itemliste5 belegen und diese dann gleich wieder überschreiben.

Für die interne Variable benötigen Sie auf jeden Fall ein put(), das sehe ich in Ihrem Code bisher nicht.

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

...