0 votes
in SoSci Survey (dt.) by s195147 (145 points)

Liebes SoSciSurvey-Support-Team,

aus dem Nichts erhalte ich in meinem Fragebogen die unten angehängte Fehlermeldung. In der Variable $pos (ein Array) soll geprüft werden, ob das Element '0' vorhanden ist. Nachdem in zahlreichen Tests und auch bei den ersten 50 Proband:innen keine Fehler aufgetaucht sind, zeigt SoSciSurvey nun an, dass $pos jedoch kein Array, sondern ein String sei. Das stimmt aber nicht. Woran könnte das liegen und warum taucht das Problem aus dem Nichts auf, ohne dass am PHP-Code etwas verändert wurde?

Gab es vielleicht ein Update bei PHP oder SSS?

Beste Grüße

Die Fehlermeldung

Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, string given in /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(546) : eval()'d code:9 Stack trace:
#0 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(546) : eval()'d code(9): in_array()
#1 /var/www/s2survey/html/lib/s2survey/phpcode/PHPCodeExecutor.php(546): eval()
#2 /var/www/s2survey/html/lib/s2survey/questionnaire/php/PHPCodeExecutorQnr.php(63): s2survey\phpcode\PHPCodeExecutor->runCode()
#3 /var/www/s2survey/html/inc/QuestionnairePHP.php(574): s2survey\questionnaire\php\PHPCodeExecutorQnr->runCode()
#4 /var/www/s2survey/html/lib/s2survey/questionnaire/QuestionnaireElement.php(479): QuestionnairePHP->runElement()
#5 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1515): s2survey\questionnaire\QuestionnaireElement->run()
#6 /var/www/s2survey/html/inc/InterviewCase.php(3257): s2survey\questionnaire\QnrPage->runContent()
#7 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1553): InterviewCase->goToPage()
#8 /var/www/s2survey/html/inc/InterviewCase.php(3257): s2survey\questionnaire\QnrPage->runContent()
#9 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1553): InterviewCase->goToPage()
#10 /var/www/s2survey/html/lib/s2survey/questionnaire/QnrPage.php(1434): s2survey\questionnaire\QnrPage->runContent()
#11 /var/www/s2survey/html/inc/InterviewCase.php(1466): s2survey\questionnaire\QnrPage->run()
#12 /var/www/s2survey/html/inc/Interviewer.php(654): InterviewCase->createQuestionnairePage()
#13 /var/www/s2survey/html/inc/Interviewer.php(823): Interviewer->handleCreate()
#14 /var/www/s2survey/html/inc/Interviewer.php(1963): Interviewer->handleInterview()
#15 /var/www/s2survey/html/pqfc/index.php(4): Interviewer::run()
#16 {main} thrown
Zeile: 9

PHP-Code

006 $ncomp = $tmp[2];
007 
008 
009 if(in_array(0,$pos)){
010   return 'go:loops';
011 }
012 return 'ok';
by SoSci Survey (329k points)
Was haben Sie in der Variable $pos denn gespeichert? Der Fehlermeldung nach ist wohl kein Array. Wenn Sie nicht sicher sind, ergänzen Sie vor dem IF folgende Zeile:

debug($pos);
by s195147 (145 points)
$pos ist ein Array. Der Code hat ja bis gestern gegen 18 Uhr auch einwandfrei funktioniert. Auf einmal bekommt jedoch jede:r Testand:in dieselbe Fehlermeldung und ich frage mich, ob es wohl eine Änderung in PHP oder SSS gegeben hat, die das bedingt haben könnte. Wie ist Ihre Einschätzung dazu?

debug($pos); bringt nichts, weil nicht die Debug-Ausgabe, sondern nur die Ausgabe des oben dargestellten Fehlercodes erfolgt. An anderen Stellen ist $pos wie gewünscht ein Array.

1 Answer

+1 vote
by SoSci Survey (329k points)

Die Anzeige der Fehlermeldung hängt damit zusammen, dass www.soscisurvey.de seit gestern Nachmittag die aktuelle PHP-Version 8.1 statt bisher 7.4 verwendet. Dadurch werden einige Fehler im PHP-Code strenger geahndet.

Ich sehe mal zu, ob ich die Fehlermeldung da kurzfristig entschärfen kann. Aber die Meldung an sich deutlich mit an Sicherheit grenzender Wahrscheinlichkeit darauf hin, dass $pos kein Array enthält, sondern einen String. Posten Sie gerne mal Ihren PHP-Code der betroffenen Seite, dann werfe ich einen Blick darauf.

by s195147 (145 points)
Super, das ist schon mal eine total wichtige Info! Vielen Dank.

Hier der Code von der Seite, ich weiß aber nicht, ob das so für Sie ausreichend ist:
```
$tmp = PMNify($arr,$pos,$x=$current_i,$ncomp,$treeify,$fors);
$arr = $tmp[0];
$pos = $tmp[1];
$ncomp = $tmp[2];

registerVariable('arr');
registerVariable('pos');
registerVariable('ncomp');

if(in_array(0,$pos)){
  goToPage('loops');
}
```

Eigentlich benötigen Sie vermutlich noch die Funktion PMNify, dann benötigen Sie aber wiederum fast das gesamte Befragungsprojekt, was sich hier so nicht umsetzen lässt.. Besteht auch die Möglichkeit zur Supportanfrage via E-Mail?
by SoSci Survey (329k points)
Die Fehlermeldung sollte jetzt auf alle Fälle verschwunden sein - im Debug-Modus sollten Sie als Projektleitung aber eine Warnung sehen.

> Eigentlich benötigen Sie vermutlich noch die Funktion PMNify

Da haben Sie leider recht. Aber es ist naheliegend, dass diese Funktion beiweilen entweder NULL oder ein Array mit NULL als zweitem Element zurück gibt. Wenn Sie möchten, können Sie die Funktion einmal an info@soscisurvey.de senden. Aber wenn die NULL dort im Prinzip vorgesehen ist, dann wäre die saubere Lösung wohl diese:

if (($pos !== NULL) && in_array(0, $pos)) {
  goToPage('loops');
}
by s126035 (110 points)
edited by s126035
Vielen Dank für die Klarstellung des Problems. Die Funktion PMNify hat bisher einwandfrei funktioniert und gab ein Array zurück, welches an zweiter Stelle ein Array mit Zahlen zurück gibt. Jetzt gibt sie "redirect" zurück... Die Funktion ist kompliziert aufgebaut, da sie einen Sortieralgorithmus darstellt, der zeitgleich versucht den Umgang von SoSciSurvey mit wiederholter Präsentation des gleichen Items zu umgehen (siehe dazu https://support.soscisurvey.de/?qa=38547/multil-level-design-in-einer-schleife&show=38582#c38582).

Gibt es die Möglichkeit für das spezifische Befragungsprojekt wieder PHP 7.4 zu nutzen? Das Befragungsprojekt ist gerade online gegangen, und es hat leider relativ lange gedauert den workaround zu programmieren. Im Sinne der Abwärtskompatibelität wäre das hier für uns sehr wichtig.
by SoSci Survey (329k points)
Funktioniert es denn mit dem Workaround,d en ich Ihnen per E-Mail geschickt hatte?

$tmp = PMNify($arr,$pos,$x=$current_i,$ncomp,$treeify,$fors);
if (!is_array($tmp)) {
  return $tmp;
}

Oder alternativ, wenn Sie es 1:1 kompatibel haben möchten:

$tmp = PMNify($arr,$pos,$x=$current_i,$ncomp,$treeify,$fors);
if (!is_array($tmp)) {
  $tmp = ['r', [], 'd'];  // Oder so ähnlich
}

Wie schon in der E-Mail geschrieben, hat sich am grundsätzlichen Programmverhalten nichts geändert - bisher fiel einfach nur nicht auf, dass PMNify() im Falle eines multiLevelDown() den Wert "redirect" zurückgegeben hatte.

Wir hatten www.soscisurvey.de gestern auch so umprogrammiert, dass in_array() keinen Fehler mehr auswirft. Es sollte also sogar der alte Code ohne Workaround wieder funktionieren.

> Gibt es die Möglichkeit für das spezifische Befragungsprojekt wieder PHP 7.4 zu nutzen?

Dafür müssten wir die komplette Konfiguration des Servers umstellen. Nachdem beide o.g. Workarounds sowie auch die in_array()-Optimierung das Problem beheben sollten, sehe ich das nicht gerechtfertigt.

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

...