0 votes
in SoSci Survey (dt.) by s154475 (150 points)
edited by SoSci Survey

Hallo, ich habe folgendes Szenario:
Ich mache eine Tagebuchstudie, wobei die Teilnehmer zuerst einen Basisfragebogen ausfüllen (an einem beliebigem Tag). In der Woche dadrauf sollten sie für 2 Arbeitswochen (Mo-Fr) jeweils einen Fragebogen um 15.00 Uhr und einen anderen Fragebogen um 17.30 Uhr erhalten (also 2 mal täglich).
Ich habe nun folgenden PHP-Code zu erstellen begonnen, den ich zum Schluss des Basisfragebogens einfügen würde:

mailSchedule(false, 2, strtotime('next Monday 15:00:00'), 
['%custom1%' => date('d.m.Y')]);
mailSchedule(false, 3, strtotime('next Monday 17:30:00')
['%custom1%' => date('d.m.Y')]);
mailSchedule(false, 4, strtotime('next Tuesday 15:00:00')
['%custom1%' => date('d.m.Y')]);
mailSchedule(false, 5, strtotime('next Tuesday 17:30:00')
['%custom1%' => date('d.m.Y')]);

Das scheint mir aber eine sehr komplizierte und umständliche Lösung zu sein (da der Code somit ja unendlich lang wird) und ich frage mich daher, ob es nicht noch einen einfacheren Weg geben würde (z.B. mit einer "Funktionsschleife" oder so...)

Könnten Sie mir da vielleicht behilflich sein?

Vielen Dank schonmal im Voraus.

1 Answer

0 votes
by SoSci Survey (305k points)

da der Code somit ja unendlich lang wird

In der Programmierung gibt es für stupide Wiederholungen FOR-Schleifen. Das könnte dann so aussehen:

$days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'];
for ($i=0; $i<10; $i++) {
  $mailing = $i * 2 + 2;   // ergibt 2, 4, 6, ...
  $dayIndex = $i % 5;  // Rest aus der Division
  $day = $days[$dayIndex];  // Das ist nun "Monday", "Thuesday", etc...
  $data = ['%custom1%' => date('d.m.Y')];  // Diese Information möchten Sie immer gleich verwenden, wenn ich es richtig gesehen habe
  if ($i < 5) {
    mailSchedule(false, $mailing, strtotime('next '.$day.' 15:00:00'), $data);
    mailSchedule(false, $mailing + 1, strtotime('next '.$day.' 17:30:00'), $data);
  } else {
    mailSchedule(false, $mailing, strtotime('next '.$day.' 15:00:00 +7 days'), $data);
    mailSchedule(false, $mailing + 1, strtotime('next '.$day.' 17:30:00 +7 days'), $data);
  }
}

Ja, zugegeben: Das mit den Arrays und der Schleife muss man erst einmal verdauen. Aber dafür wird es auch nicht mehr viel komplizierter, wenn man z.B. 4 Wochen lang erheben möchte :)

by SoSci Survey (305k points)
Gerne :) Machen Sie bitte vor dem Start der Erhebung unbedingt noch einen technischen Test (mit Ihrer eigenen Mailadresse) ob alles funktioniert und ob alle Serienmails für die richtigen Zeitpunkte geplant werden. Sie sehen die bisher bereits terminierten Versadzeitpunkte, wenn Sie bei einer Serienmail auf das Briefumschlag-Symbol zum Versenden klicken.
by s154475 (150 points)
Das klappt irgendwie noch nicht ganz so wie das erwünscht ist... folgende Zeitpunkte werden eingeplant (wenn ich heute den Basisfragebogen ausfülle, wo auch der Code drin ist):

ID 1→ Link für Basisfragebogen (Fragebogen: Basis_F)

ID 2→ Link für Nachmittagsfragebogen_1 (Fragebogen: Na_1_Mo)   
12.10.2020, 15:00    → Versand an 1 Empfänger    X
12.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 3→ Link für Abendfragebogen_1 (Fragebogen: Ab_1_Mo)
12.10.2020, 17:30    → Versand an 1 Empfänger    X
12.10.2020, 17:30    → Versand an 1 Empfänger    X

ID 4 → Link für Nachmittagsfragebogen_2 (Fragebogen: Na_2_Di)
06.10.2020, 15:00    → Versand an 1 Empfänger    X
06.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 5→ Link für Abendfragebogen_2 (Fragebogen: Ab_2_Di)
06.10.2020, 17:30    → Versand an 1 Empfänger    X
06.10.2020, 17:30    → Versand an 1 Empfänger    X

ID 6→ Link für Nachmittagsfragebogen_3 (Fragebogen: Na_3_Mi)
07.10.2020, 15:00    → Versand an 1 Empfänger    X
07.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 7→ Link für Abendfragebogen_3 (Fragebogen: Ab_3_Mi)
07.10.2020, 17:30    → Versand an 1 Empfänger    X
07.10.2020, 17:30    → Versand an 1 Empfänger    X

ID 8→ Link für Nachmittagsfragebogen_4 (Fragebogen: Na_4_Do)
08.10.2020, 15:00    → Versand an 1 Empfänger    X
08.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 9→ Link für Abendfragebogen_4 (Fragebogen: Ab_4_Do)
08.10.2020, 17:30    → Versand an 1 Empfänger    X
08.10.2020, 17:30    → Versand an 1 Empfänger    X
ID 10→ Link für Nachmittagsfragebogen_5 (Fragebogen: Na_5_Fr)

09.10.2020, 15:00    → Versand an 1 Empfänger    X
09.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 11→ Link für Abendfragebogen_5 (Fragebogen: Ab_5_Fr)
09.10.2020, 17:30    → Versand an 1 Empfänger    X
09.10.2020, 17:30    → Versand an 1 Empfänger    X

ID 12→ Link für Nachmittagsfragebogen_6 (Fragebogen: Na_6_Mo)
19.10.2020, 15:00    → Versand an 1 Empfänger    X
19.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 13→ Link für Abendfragebogen_6 (Fragebogen: Ab_6_Mo)
19.10.2020, 17:30    → Versand an 1 Empfänger    X
19.10.2020, 17:30    → Versand an 1 Empfänger    X

ID 14→ Link für Nachmittagsfragebogen_7 (Fragebogen: Na_7_Di)
13.10.2020, 15:00    → Versand an 1 Empfänger    X
13.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 15→ Link für Abendfragebogen_7 (Fragebogen: Ab_7_Di)
13.10.2020, 17:30    → Versand an 1 Empfänger    X
13.10.2020, 17:30    → Versand an 1 Empfänger    X

ID 16→ Link für Nachmittagsfragebogen_8 (Fragebogen: Na_8_Mi)
14.10.2020, 15:00    → Versand an 1 Empfänger    X
14.10.2020, 15:00    → Versand an 1 Empfänger    X

ID 17→ Link für Abendfragebogen_8 (Fragebogen: Ab_8_Mi)
14.10.2020, 17:30    → Versand an 1 Empfänger    X
14.10.2020, 17:30    → Versand an 1 Empfänger    X

usw. bis 16.10.

1. Wieso werden jeweils 2 gleiche Serienmails zur gleichen Zeit versendet?
2. die Tage stimmen noch nicht wirklich. Ziel ist es: Basisfragebogen wird zu einem beliebigen Zeitpunkt (von Mo-So) ausgefüllt und der erste Nachmittagsfragebogen soll dann am Montag die Woche drauf versendet werden (und ab da dann 2 Wochen, jeweils Mo-Fr). So wie es jetzt ist, kommt der Montag erst nächste Woche (was richtig wäre) aber der Rest schon diese Woche. Das soll aber natürlich aufeinanderfolgend kommen.

Was muss ich im Code nun anpassen, damit das klappt..? Danke
by SoSci Survey (305k points)
> 1. Wieso werden jeweils 2 gleiche Serienmails zur gleichen Zeit versendet?

Haben Sie den Fragebogen vielleicht zweimal aufgerufen? Oder die Seite zweimal geladen? mailSchedule() prüft da nicht groß, sondern trägt es einfach beide Mal ein. Beim eigentlichen Versand geht aber nur die erste Mail raus. Das ist also kein Problem.

> 2. die Tage stimmen noch nicht wirklich.

Richtig. Das liegt daran, dass "next monday" und "next tuesday" am Montag Nachmittag in unterschiedlichen Wochen liegen. Ich musste kurz innehalten, aber die Lösung ist zum Glück einfach: Wir nehmen einfach den nächsten Montag (bzw. den Sonntaq davor) als Referenz für alles weitere:

$days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'];
// NEU
$reference = strtotime('next monday 00:00:00') - 1;
for ($i=0; $i<10; $i++) {
// u.s.w.

// WEITER UNTEN
  if ($i < 5) {
    mailSchedule(false, $mailing, strtotime('next '.$day.' 15:00:00', $reference), $data);
    mailSchedule(false, $mailing + 1, strtotime('next '.$day.' 17:30:00', $reference), $data);
  } else {
    mailSchedule(false, $mailing, strtotime('next '.$day.' 15:00:00 +7 days', $reference), $data);
    mailSchedule(false, $mailing + 1, strtotime('next '.$day.' 17:30:00 +7 days', $reference), $data);
  }
by s154475 (150 points)
perfekt, danke, das hat geklappt!
Das wird auch funktionieren, wenn jemand den Basisfragebogen am Sonntag (z.B. am Abend) ausfüllt oder? Dann kommt der erste FB am Montag gleich dadrauf..? :)
by SoSci Survey (305k points)
> wenn jemand den Basisfragebogen am Sonntag (z.B. am Abend) ausfüllt oder?

Ja, deshalb der Umweg über "next monday", aber dann minus 1 (also 1 Sekunde vor Mitternacht), gemacht. Und am Sonntag ist "next monday" ja der nächste Tag.

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

...