0 votes
in SoSci Survey (dt.) by s191137 (330 points)
edited by SoSci Survey

Hallo zusammen,

ich bräuchte nochmals Unterstützung bei der Erstellung des PHP-Codes zum Versand von Serienmails bei einer mehrwelligen Befragung.
Ich habe kürzlich eine separate Frage zum Versand an individuellen Uhrzeiten gestellt:
Individuelle Uhrzeit mit mailSchedule
Allerdings denke ich nun, dass es sinnvoller ist, die Fragen an der gleichen Stelle zu klären. Ich bedanke mich im Voraus vielmals für Ihre Unterstützung!

Die Umfrage soll am Ende folgenden Aufbau haben:
- Große T0 Messung (T1)
- Tägliche Prä-Messungen für 7-14 Tage (Dauer wird randomisiert) (T2)
- Tägliche Messungen während der Intervention für 10 Tage (T3)
- Tägliche Post-Messungen für 14 Tage (T4)
- Große Post-Messung (T5)

Die VPn sollen im Eingangsfragebogen die Möglichkeit bekommen, die Uhrzeit des täglichen Versands selbst auszuwählen. Ich habe jetzt eine Variable erstellt, in der die VPn per Dropdown-Auswahl vier unterschiedliche Uhrzeiten auswählen können. Muss ich hier etwas beachten?

Nach den täglichen Prä-Messungen, welche für die verschiedenen Versuchspersonen unterschiedlich lang sein werden, soll es für jede Versuchsperson direkt am nächsten Tag weitergehen.

Zudem sollen Erinnerungsmails verschickt werden, wenn die Versuchspersonen den Fragebogen nicht ausfüllen.

Bisher habe ich Folgendes erarbeitet. Da ich leider noch wenig Erfahrungen mit PHP-Codes habe, würde ich mich über Unterstützung sehr freuen.

$tage = (int)value('RG01', 'label');
$versand = strtotime(value('IT01'));
// Einladungsmails
// T2
for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days'$versand));
}
// T3
for ($i<$tage+1; $i<$tage+10; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days'$versand));
}
// T4
for ($i<$tage+11; $i<$tage+24; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days'$versand));
}
// T5
mailSchedule(false, $i+1, strtotime('+'.($i+1).' days'$versand));
// Erinnerungsmails (z.B. nach einer und zwei Stunden)
// T2
for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' hours'), ['status' => 'no-response']);
}
for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+2).' hours'), ['status' => 'no-response']);
}
// T3
for ($i<$tage+1; $i<$tage+10; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' hours'), ['status' => 'no-response']);
for ($i<$tage+1; $i<$tage+10; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+2).' hours'), ['status' => 'no-response']);
// T4
for ($i<$tage+11; $i<$tage+24; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' hours'), ['status' => 'no-response']);
}
for ($i<$tage+11; $i<$tage+24; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+2).' hours'), ['status' => 'no-response']);
}
// T5
mailSchedule(false, $i+1, strtotime('+'.($i+1).' hours'), ['status' => 'no-response']);
mailSchedule(false, $i+1, strtotime('+'.($i+2).' hours'), ['status' => 'no-response']);

Zum Testen der Umfrage würde ich im Anschluss gerne die Zeiträume verkürzen. Wie kann ich das am besten machen?

Mir ist bewusst, dass das bisher alles noch etwas wild ist. Ich würde mich trotzdem über Hilfestellungen sehr freuen.
Vielen Dank im Voraus!

Viele Grüße

related to an answer for: Randomisierte Dauer

1 Answer

0 votes
by SoSci Survey (306k points)

Ich habe jetzt eine Variable erstellt, in der die VPn per Dropdown-Auswahl vier unterschiedliche Uhrzeiten auswählen können. Muss ich hier etwas beachten?

Gegenfrage: Funktioniert es?

Wenn Sie eine Serienmail auswählen, sehen Sie, zu welchem Zeitpunkt ein Versand geplant ist. Damit lässt sich schnell prüfen, ob mailSchedule() richtig arbeitet.

Wichtig: Jede Serienmail wird an jeden Adressaten nur genau einmal verschickt. Es bringt also nichts, für eine Serienmail mehrere Versandzeitpunkte auszulösen. Das $i+1 scheint mir in dieser Hinsicht noch nicht überall korrekt, z.B. bei T4, da wird in beiden Schleifen dieselbe Serienmail angesprochen. Aber das $i ist ohnehin nur innerhalb der FOR-Schleife sinnvoll.

Zum Testen der Umfrage würde ich im Anschluss gerne die Zeiträume verkürzen. Wie kann ich das am besten machen?

Sie können "hours" durch "minutes" ersetzen. Allerdings bin ich der Meinung, dass das "hours" in Ihrem Code noch nicht ganz korrekt eingesetzte ist. Denn das strtotime() bezieht sich immer auf den aktuellen Zeitpunkt, wenn nichts anderes angegeben ist. Statt

mailSchedule(false, $i+1, strtotime('+'.($i+1).' hours'), ['status' => 'no-response']);

Könnte es also z.B. heißen

mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 1 hours'), ['status' => 'no-response']);

Mir ist bewusst, dass das bisher alles noch etwas wild ist. Ich würde mich trotzdem über Hilfestellungen sehr freuen.

Machen Sie als erstes eine Liste, welche Serienmail wann verschickt werden soll. Und dann gleichen Sie das damit ab, ob Sie mit dem $i+1 auf diese Nummern kommen bzw. was dort anderes stehen müsste also $i+1.

by s191137 (330 points)
Vielen Dank schon einmal für die Hilfestellungen! Dann werde ich mal versuchen, die Tipps umzusetzen!
Ich hätte noch zwei Fragen zu der Antwort:
- Wie kann ich denn herausfinden, ob das mit der Variable zur individuellen Uhrzeit funktioniert hat?
- Ich habe gerade bei den Serienmails geschaut und konnte keine Information zum geplanten Versand finden. Wo genau muss ich denn suchen?
Vielen Dank und viele Grüße
by SoSci Survey (306k points)
> herausfinden, ob das mit der Variable zur individuellen Uhrzeit funktioniert hat?

Was meinen Sie mti "Variable"? Zur Nomenklatur s. https://www.soscisurvey.de/help/doku.php/de:create:variables

Meinen Sie so etwas in der Art?

$i = 1;
debug($i+1);
debug('+'.($i+1).' hours');
debug(date('d.m.Y H:i', strtotime('+'.($i+1).' hours')));

>  Ich habe gerade bei den Serienmails geschaut und konnte keine Information zum geplanten Versand finden.

Wenn Sie bei einer Serienmail auf das Symbol zum Versenden klicken (Briefumschlag), dann sehen Sie, welche Versandtermine schon vorbereitet wurden.
by s191137 (330 points)
Mit "Variable" meinte ich tatsächlich eine Frage, in der die VPn per Dropdown-Auswahl vier unterschiedliche Uhrzeiten auswählen können. Ich habe mich gefragt, ob dies das richtige Vorgehen ist, um den VPn die Möglichkeit zu geben, eine individuelle Versanduhrzeit auszuwählen.

Bisher sind noch keine Versandtermine vorbereitet worden, weil ich noch keinen Befragungszeitraum angegeben habe.
by SoSci Survey (306k points)
>  eine Frage, in der die VPn per Dropdown-Auswahl vier unterschiedliche Uhrzeiten auswählen können. Ich habe mich gefragt, ob dies das richtige Vorgehen ist, um den VPn die Möglichkeit zu geben, eine individuelle Versanduhrzeit auszuwählen.

Ja, dies ist eine Möglichkeit. Eine offene Eingabe wäre ebenfalls möglich.

> Bisher sind noch keine Versandtermine vorbereitet worden, weil ich noch keinen Befragungszeitraum angegeben habe.

Zum Testen brauchen Sie das auch nicht. Wenn Sie einen Adresseintrag anlegen und dort das Häkchen für den Debug-Modus setzen, können Sie dfür diesen einen Teilnahmelink erzeugen und alles auch außerhalb des Befragungszeitraums testen.
by s191137 (330 points)
edited by s191137
Ich habe nun folgendes an dem Code verändert und hoffe, dass die ID's der Serienmails nun besser passen.  

$tage = (int)value('RG01', 'label');
$versand = strtotime(value('IT01'));

// Einladungsmails

// T1
for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days $versand'));
}

// T2
for ($i= 17; $i=26; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days $versand'));
}
 
// T3
for ($i=27; $i=40; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days $versand'));
}

// T4
mailSchedule(false, 41, strtotime('+1 day $versand'));



// Erinnerungsmails (z.B. nach einer und zwei Stunden)

// T1
for ($i=42; $i=55; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 1 hours'), ['status' => 'no-response']);
}

for ($i=56; $i=69; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 2 hours'), ['status' => 'no-response']);
}

// T2
for ($i=70; $i=79; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 1 hours'), ['status' => 'no-response']);
}

for ($i=80; $i=89; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 2 hours'), ['status' => 'no-response']);
}

// T3
for ($i=90; $i=103; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 2 hours'), ['status' => 'no-response']);
}

for ($i=104; $i=117; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 1 hours'), ['status' => 'no-response']);

// T4
mailSchedule(false, 118, strtotime('$versand + 1 hours'), ['status' => 'no-response']);

mailSchedule(false, 119, strtotime('$versand + 1 hours'), ['status' => 'no-response']);

Ich habe noch Schwierigkeiten strtotime( ) so zu verwenden, dass die Mails dann zu den richtigen Zeitpunkten und zu der ausgewählten Uhrzeit verschickt werden. Nach der randomisierte Dauer der Prä-Messung müsste am nächsten Tag eine Serienmail verschickt werden. Außerdem müssten die Serienmails jeweils zu der ausgewählten Uhrzeit ($versand) ankommen.
Vielen Dank für Ihre Hilfe!
by SoSci Survey (306k points)
Die Erinnerungen funktionieren vermutlich noch nicht so, wie gedacht. Nehmen wir mal diesen Code:


// Erinnerungsmails (z.B. nach einer und zwei Stunden)

// T1
for ($i=42; $i=55; $i++) {
  mailSchedule(false, $i+1, strtotime('+'.($i+1).' days + 1 hours'), ['status' => 'no-response']);
}

Im ersten Durchlauf bekommt $i den Wert 42. Das bedeutet, wenn ich das einsetze:

mailSchedule(false, 42+1, strtotime('+'.(42+1).' days + 1 hours'), ...);

Und weiter ausgerechnet

mailSchedule(false, 43, strtotime('+'.(43).' days + 1 hours'), ...);

Jetzt noch die Texte zusammenfügen (das macht der Punkt):

mailSchedule(false, 43, strtotime('+43 days + 1 hours'), ...);

Heißt also: Sie Serienmail 43 soll jetzt in 43 Tagen und 1 Stunde verschickt werden. Ich denke, Sie meinen eigentlich das hier:

for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+43, strtotime('+'.($i+1).' days + 1 hours'), ...);
}
by s191137 (330 points)
Vielen Dank für die Erläuterungen!

Könnte der Code, für T1 so aussehen, wenn im ersten Durchlauf ID3 am 3. Tag abgeschickt werden soll?
for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+3, strtotime(2'+'.($i+1).' days'));
}

Wenn ich dann bei T2 (gegeben $tage= 9) im ersten Durchlauf möchte, dass ID 17 an Tag 10 verschickt wird, wäre folgender Code möglich?
for ($i= 0; $i<$tage; $i++) {
  mailSchedule(false, $i+17, strtotime($tage '+'.($i+1).' days'));
}

Wenn ich dann bei T3 (gegeben $tage= 9) im ersten Durchlauf möchte, dass ID 27 an Tag 20 verschickt wird, wäre folgender Code möglich?
for ($i= 0; $i<$tage; $i++) {
  mailSchedule(false, $i+27, strtotime($tage '+'.($i+11).' days'));
}

Wenn ich bei T4 (gegeben $tage=9) möchte, dass ID 41 am 34. Tag verschickt wird, ist dieser Code möglich?
mailSchedule(false, 41, strtotime('+'.($tage+25).' days'));

Zusätzlich frage ich mich noch, wie ich die Uhrzeit $versand in den Code einbinden könnte.
Vielen Dank im Voraus!
by SoSci Survey (306k points)
> Wenn ich dann bei T2 (gegeben $tage= 9) im ersten Durchlauf möchte, dass ID 17 an Tag 10 verschickt wird, wäre folgender Code möglich?

for ($i= 0; $i<$tage; $i++) {
  mailSchedule(false, $i+17, strtotime($tage '+'.($i+1).' days'));
}

Fast .. das Plus muss an eine andere Stelle. Wenn Sie hier i=0 einsetzen kommt im Moment heraus:

mailSchedule(false, 17, strtotime('9+1 days'));

Sie möchten aber

mailSchedule(false, 17, strtotime('+10 days'));

Also würden Sie schreiben:

mailSchedule(false, $i+17, strtotime('+'.($tage + $i + 1).' days'));

> Zusätzlich frage ich mich noch, wie ich die Uhrzeit $versand in den Code einbinden könnte.

Das hatten Sie oben ja schon ganz gut gemacht. Wenn in $versand eine Uhrzeit im Format "HH:MM" steht, können Sie das einfach noch ergänzen:

mailSchedule(false, $i+17, strtotime('+'.($tage + $i + 1).' days '.$uhrzeit));

Entsprechend dann z.B.

mailSchedule(false, 17, strtotime('+10 days 16:35'));
by s191137 (330 points)
Vielen Dank für die Erklärungen! Ich habe nun folgenden Code erstellt und der Versand der jeweiligen Mails scheint auch pünktlich geplant zu werden.

$tage = (int)value('RG01', 'label');
$uhrzeit = strtotime(value('IT01'));

// Einladungsmails

// T1
for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+3, strtotime('+'.($i+1).' days'.$uhrzeit));
}

// T2
mailSchedule(false, 17, strtotime('+'.($tage+1).' days'.$uhrzeit));
mailSchedule(false, 18, strtotime('+'.($tage+2).' days'.$uhrzeit));
mailSchedule(false, 19, strtotime('+'.($tage+3).' days'.$uhrzeit));
mailSchedule(false, 20, strtotime('+'.($tage+4).' days'.$uhrzeit));
mailSchedule(false, 21, strtotime('+'.($tage+5).' days'.$uhrzeit));
mailSchedule(false, 22, strtotime('+'.($tage+6).' days'.$uhrzeit));
mailSchedule(false, 23, strtotime('+'.($tage+7).' days'.$uhrzeit));
mailSchedule(false, 24, strtotime('+'.($tage+8).' days'.$uhrzeit));
mailSchedule(false, 25, strtotime('+'.($tage+9).' days'.$uhrzeit));
mailSchedule(false, 26, strtotime('+'.($tage+10).' days'.$uhrzeit));

 
// T3
for ($i= 0; $i<14; $i++) {
  mailSchedule(false, $i+27, strtotime('+'.($tage + $i + 11).' days '.$uhrzeit));
}

// T4
mailSchedule(false, 41, strtotime('+'.($tage+25).' days'.$uhrzeit));


// Erinnerungsmails (z.B. nach einer und zwei Stunden)

// T1
for ($i=0; $i<$tage; $i++) {
  mailSchedule(false, $i+42, strtotime('+'.($i+1).' days + 1 hours'), ['status' => 'no-response']);
}


for ($i= 0; $i<$tage; $i++) {
  mailSchedule(false, $i+56, strtotime('+'.($i+1).' days + 2 hours'), ['status' => 'no-response']);
}

// T2
mailSchedule(false, 70, strtotime('+'.($tage+1).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 71, strtotime('+'.($tage+2).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 72, strtotime('+'.($tage+3).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 73, strtotime('+'.($tage+4).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 74, strtotime('+'.($tage+5).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 75, strtotime('+'.($tage+6).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 76, strtotime('+'.($tage+7).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 77, strtotime('+'.($tage+8).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 78, strtotime('+'.($tage+9).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 79, strtotime('+'.($tage+10).' days + 1 hours'.$uhrzeit), ['status' => 'no-response']);

mailSchedule(false, 80, strtotime('+'.($tage+1).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 81, strtotime('+'.($tage+2).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 82, strtotime('+'.($tage+3).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 83, strtotime('+'.($tage+4).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 84, strtotime('+'.($tage+5).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 85, strtotime('+'.($tage+6).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 86, strtotime('+'.($tage+7).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 87, strtotime('+'.($tage+8).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 88, strtotime('+'.($tage+9).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);
mailSchedule(false, 89, strtotime('+'.($tage+10).' days + 2 hours'.$uhrzeit), ['status' => 'no-response']);

// T3
for ($i= 0; $i<14; $i++) {
  mailSchedule(false, $i+90, strtotime('+'.($tage + $i + 11).' days + 1 hours'), ['status' => 'no-response']);
}

for ($i= 0; $i<14; $i++) {
  mailSchedule(false, $i+104, strtotime('+'.($tage + $i + 11).' days + 2 hours'), ['status' => 'no-response']);
}

// T4
mailSchedule(false, 118, strtotime('+'.($tage+25).' days + 1 hours'), ['status' => 'no-response']);

mailSchedule(false, 119, strtotime('+'.($tage+25).' days + 2 hours'), ['status' => 'no-response']);

Allerdings werden die Mails jeweils zur Uhrzeit des Aufrufs bzw. eine/ zwei Stunden später (Erinnerung) versandt. Die Angabe der individuellen Uhrzeit scheint noch nicht zu funktionieren.
Zur Erfassung der individuell gewünschten Uhrzeit habe ich eine Dropdown-Auswahl mit den Antwortoptionen 10:00, 15:00, 18:00 und 20:00  mit der Kennung IT01 erstellt. Das scheint allerdings noch nicht zu funktionieren. Haben Sie eine Idee, woran das liegen könnte?
Vielen Dank im Voraus für die Hilfe und viele Grüße.
by SoSci Survey (306k points)
> Allerdings werden die Mails jeweils zur Uhrzeit des Aufrufs bzw. eine/ zwei Stunden später (Erinnerung) versandt.

Ich denke, das fehlt einfach ein Leerzeichen zwischen "days" und der Zeit:

mailSchedule(false, 17, strtotime('+'.($tage+1).' days '.$uhrzeit));

Ändert das etwas?
by s191137 (330 points)
Vielen Dank für die Anregung! Leider wird der Versand auch mit Leerzeichen zur Uhrzeit des Aufrufs geplant.
by SoSci Survey (306k points)
Gut, dann suchen wir mal ein wenig. Lassen wir uns als erstes ausgeben, was da genau herauskommt. Ergänzen Sie unter der o.g. Zeile bitte mal folgendes:

debug('+'.($tage+1).' days '.$uhrzeit);

Was wird denn dann im Debug-Modus angezeigt?
by s191137 (330 points)
Es wird Folgendes angezeigt:

Debug-Information für '+'.($tage+1).' days '.$uhrzeit:
'+'.($tage+1).' days '.$uhrzeit = +9 days (string)
by SoSci Survey (306k points)
Da fehlt die Uhrzeit würde ich behaupten :)

Gut, dann müssen wir weiter nach oben blicken:

$tage = (int)value('RG01', 'label');
$uhrzeit = strtotime(value('IT01'));

Was genau ist denn in 'IT01' gespeichert? Könnten Sie da bitte mal den Auszug aus der Variablen-Übersicht zu IT01 posten?

Das strtotime() ist hier höchstwahrscheinlich falsch, denn wenn wir die Zeit in strtotime() weiter untern verwenden möchten, brauchen wir ja (noch) keinen UNIX-Zeitstempel, sondern erstmal einen Text.
by s191137 (330 points)
Meinen Sie diesen Ausschnitt mit Variablen-Übersicht?

1 = 10:00
2 = 15:00
3 = 18:00
4 = 20:00
-9 = nicht beantwortet
by SoSci Survey (306k points)
Okay, dann versuchen Sie es bitte wie folgt:

$uhrzeit = value('IT01', 'label');
by s191137 (330 points)
Vielen Dank für die Unterstützung!
Jetzt scheint es zu funktionieren.
asked Oct 25, 2021 in SoSci Survey (dt.) by s191137 (330 points)
edited Oct 25, 2021 by SoSci Survey
Mehrwellige Befragungen

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

...