0 votes
in SoSci Survey (dt.) by s137404 (170 points)
closed by SoSci Survey

Hallo!

Ich habe ein Problem mit der Implementierung einer 'expire' Funktion. Die 'expire' Funktion funktioniert nicht, wobei der Rest des Codes funktioniert.

Folgende Ausgangsüberlegung:
Im Rahmen einer Tagebuchstudie möchte ich täglich eine "Tagesfrage" schicken (jeweils mit der selben Frage), um 18 Uhr. Diese Tagesfrage soll nach 24h ablaufen (wenn sie nicht beantwortet wird), also um 17.59Uhr des Folgetages, bevor die nächste Tagesfrage kommt.

Die ursprüngliche Programmierung sah folgendermaßen aus:
mailSchedule (false, 106, strtotime('+1 day 18:00'), [ 'expire' => strtotime('+2 day 17:59'), 'status' => 'incomplete' ]);
mailSchedule (false, 107, strtotime('+2 day 18:00'), [ 'expire' => strtotime('+3 day 17:59'), 'status' => 'incomplete' ]);
mailSchedule (false, 108, strtotime('+3 day 18:00'), [ 'expire' => strtotime('+4 day 17:59'), 'status' => 'incomplete' ]);

... und so müsste das 112x wiederholt werden; da muß natürlich eine FOR Schleife her;

Die FOR Schleife:
for ($i=0; $i<=109; $i++) {

$Tagesfrage = $i+106; // die ID der Tagesfrage beginnt ab 106, bis 215; man könnte hier vermutlich auch einfach nur die ID 106 nehmen, weil es sowieso immer die selbe Frage ist
$näTag = $i+1; // nächste Tagesfrage geht dann jeweils in +1 Tag raus
$exp24h = $i+2; // Tagesfrage expired 24h nach Rausschicken

mailSchedule (false,$Tagesfrage, strtotime(' + '.$näTag.' day 18:00'), [ 'expire' => strtotime(' + '.$exp24h.' day 17:59'), 'status' => 'incomplete' ]); }

// Ende der FOR Schleife

Problem:
bereits in der ursprünglichen Programmierung funktioniert folgender Code offenbar nicht:
... [ 'expire' => strtotime('+2 day 17:59'), 'status' => 'incomplete' ]);

in der FOR Schleife funktioniert entsprechend der gleiche Teil auch nicht:
....[ 'expire' => strtotime(' + '.$exp24h.' day 17:59'), 'status' => 'incomplete' ]); }

=> Anmerkung: die expire-Funktion funktoniert problemlos, wenn ich anstelle der strtotime-FUnktion einfach nur Sekunden angebe; also das Problem kam erst mit Implementierung der strtotime-FUnktion;

Was funktioniert:
...mailSchedule (false,$Tagesfrage, strtotime(' + '.$näTag.' day 18:00'),....

Meine Frage ans Team:
wie muss ich die strtotime-FUnktion und das '.$exp24h.' implementieren, damit die expire Funktion funktioniert?

Beste Grüße!

closed with the note: Es liegen keine weiteren Informationen mehr vor - vermutlich wurde das Problem bereits gelöst?!
by SoSci Survey (328k points)
Mit dem Knopf {} beim Erstellen/Bearbeiten einer Frage kann man PHP-Code als Code formatieren. Das verbessert die Lesbarkeit enorm.

> strtotime('+2 day 17:59')

Tragen Sie auf einer leeren Seite im Fragebogen doch einfach mal folgenden Code ein, und starten Sie die Seite im Debug-Modus.

debug(strtotime('+2 day 17:59'));
debug(date('d.m.Y H:i', strtotime('+2 day 17:59')));

Damit sollten Sie schnell prüfen können, ob die Funktion das erwartete Resultat liefert. Spezifizieren Sie "funktioniert nicht" gerne ein wenig genauer.

> $näTag = $i+1; // nächste Tagesfrage geht dann jeweils in +1 Tag raus

Meines Wissens sind Umlaute in Variablennamen nicht erlaubt.
by s137404 (170 points)
Hallo!
Danke für die Antwort damals. Ich habe es weiterhin nicht geschafft, die FOR-Schleife vollständig zum laufen zu bringen.

DIe Vorschläge haben das Problem noch nicht ganz erfasst.

Zur Vereinfachung habe ich die FOR-Schleife als Lösungskonzept wieder verlassen und würde einfach eine Hintereinanderreihung des ursprünglichen Codes machen; dieser lautet mit hier beispielhaft 3 hintereinander gefügten Code-Linien:

mailSchedule (false, 106, strtotime('+1 day 18:00'), [ 'expire' => strtotime('+2 day 17:59'), 'status' => 'incomplete' ]);
mailSchedule (false, 107, strtotime('+2 day 18:00'), [ 'expire' => strtotime('+3 day 17:59'), 'status' => 'incomplete' ]);
mailSchedule (false, 108, strtotime('+3 day 18:00'), [ 'expire' => strtotime('+4 day 17:59'), 'status' => 'incomplete' ]);

Die erste Hälfte, nämlich: mailSchedule (false, 106, strtotime('+1 day 18:00'),
... funktioniert tadellos: jeden darauffolgenden Tag kommt um 18 Uhr die nächst höher gezählte Einladungsmail (entsprechend der IDs 106, 107, 108, etc).

Doch das Kernproblem ist hier die 2. Hälfte dieser Code-Linie, nämlich die Expire-Funktion. Die Einladungsmail soll 24h nach dem Rausschicken ablaufen. In anderen Zusammenhängen mit folgendem Beispiel:

mailSchedule( false,3 , 604800, [ 'expire' => 777600, 'status' => 'incomplete' ]);



...habe ich die Expire-Funktion erfolgreich mit der Angabe mit Sekunden programmieren können. Hier funktioniert das Expire. In obigen Codes habe ich aber die Sekundenangabe gegen strtotime ausgetauscht. Ansonsten ist der Code genau gleich zu den anderen Fällen (mit Sekundenangaben), wo es ja tadellos funktioniert. Das "Funktionieren" der Expire-Funktion heißt hier, dass ich eine Meldung im Browserfenster bekomme, dass der Fragebogen schon abgelaufen ist, wenn ich auf die Einladungsmail klicke.

Bei meiner Variante mit strtotime kommt aber das Browserfenster mit der Meldung des abgelaufenen Fragebogens nicht, sondern es wird die Frage ganz normal angezeigt.

Meine Frage ans Team:

muss ich die strtotime-Funktion in dem Code-Teil ...

[ 'expire' => strtotime('+2 day 17:59'), 'status' => 'incomplete' ]);

.... irgendwie anders schreiben?

Beste Grüße
by SoSci Survey (328k points)
Also vom Code her gesehen sollten die Einstellungen für 'expire' korrekt sein und zum erwünschten Ergebnis führen. Wenn Sie mir einmal den Link mitteilen möchten, der in der Serienmail steht, dann sehe ich mir das direkt in der Datenbank an.

Nur zur Sicherheit: Haben Sie in den Einstellungen des Fragebogens den Zugriff "Serienmail" eingestellt? Wenn der Fragebogen öffentlich wäre, könnte die Sperre nicht greifen.
by s137404 (170 points)
Hallo!
Es funktioniert jetzt alles so wie gewünscht. Der entscheidende Hinweis war der, dass man in den Einstellungen des Fragebogens "Serienmail" einstellen muss. Der Code war tatsächlich richtig programmiert.
Vielen Dank!

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

...