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 (312k 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 s154475 (150 points)
Vielen Dank, ich verstehe die Funktion aber leider nicht wirklich...

$mailing = $i * 2 + 2;   // ergibt 2, 4, 6, ...
$dayIndex = $i % 5;  // Rest aus der Division
--> was wird bei diesen zwei Zeilen gemacht..? Wofür steht i?

Meine IDs der Serienmails gehen von 1 (=Basisfragebogen) bis 21, wo steckt diese Information drin?Also wo muss ich nun die jeweilige ID einsetzen?
Und wo steht, dass das nun über 2 Wochen hinweg rausgehen muss? Ich sehe nur +7 Tage...
by SoSci Survey (312k points)
> Wofür steht i?

Eine sehr gute Frage. $i ist eine Variable, die durch die FOR-Schleife immer wieder einen anderen Wert bekommt. Das ganze läuft erst einmal mit $i=0 (siehe direkt nach dem FOR). Dann wird die Variable mittel $++ um eins hochgezählt und das Ganze läuft erneut. Das wiederholt das FOR solange, bis $i<10 (steht auch im FOR) nicht mehr zutrifft.

> Meine IDs der Serienmails gehen von 1 (=Basisfragebogen) bis 21

Ich ging aufgrund Ihre Codes davon aus, dass Sie Serienmail für Montag 15 Uhr die Nummer 2(nicht 1) hat?! Die Information steckt hier:

$mailing = $i * 2 + 2;

Im ersten Durchlauf kommt hier 0 * 2 + 2 = 2 heraus. Im zweiten Durchlauf dann 4 u.s.w. Die ungeraden Zahlen für den Nachmittag entstehen durch das $mailing + 1 im mailSchedule()-Befehl.

> Und wo steht, dass das nun über 2 Wochen hinweg rausgehen muss?

Das steckt im $i < 10. Zweimal 5 Tage.

> Ich sehe nur +7 Tage...

Das ist für die zweite Woche. Ab $i=5 (also ab dem sechsten Durchlauf) müssen 7 Tage dazugezählt werden.

> ich verstehe die Funktion aber leider nicht wirklich...

Keine Sorge, der Start mit Code ist nie ganz einfach. Aber ich hoffe, mit den Erklärungen wird es ein wenig besser nachvollziehbar?
by s154475 (150 points)
Ja, die Serienmail für Montag 15.00 Uhr hat die Nummer 2. Es ist nun ein wenig klarer. Das Problem ist aber glaube ich folgendes: der erste 17.30Uhr Fragebogen hat die ID3, von ID4 bis ID 12 kommen dann aber alle Nachmittagsfragebögen von 15.00Uhr, und erst dann von ID13 - 21 alle weiteren Abendfragebögen. Deshalb geht das dann ja nicht mehr auf mit dem + 1 jeweils.. Die ID's kann ich ja nicht abändern oder?

Ansonsten versende ich die Serienmails einfach manuell..
by SoSci Survey (312k points)
Dann müssten Sie vielleicht einfach noch eine Liste anlegen, wann welche Serienmail verschickt werden soll:

$mails = [
  0 => [2,3],  // Montag
  1 => [4,13],  // Dienstag
  2 => [5,14],
  // u.s.w.
];

Das komplett vorweg und unten im Code dann (2x):

mailSchedule(false, $mails[$i][0], ...
mailSchedule(false, $mails[$i][1], ...

> Ansonsten versende ich die Serienmails einfach manuell..

Auch eine Option, aber bei Weitem nicht so elegant ;)
by s154475 (150 points)
Danke!
Wo genau kommt das denn in den Code rein?
mailSchedule(false, $mails[$i][0], ...
mailSchedule(false, $mails[$i][1], ...
by SoSci Survey (312k points)
Dort, wo oben auch schon mailSchedule() steht - es sind also 2-mal 2 Zeilen, die Sie abändern müssten.
by s154475 (150 points)
Ich habe nun die Serienmails gelöscht und nochmals so kopiert, dass dieser Code funktioniert (Nachmittagsfragebogen=gerade Zahlen, Abendfragebogen=ungerade Zahlen). Beim Einsetzen des von Ihnen geschriebenen Codes kommt nun allerdings folgende Fehlermeldung:
Warnung: Unerwartetes Element: 5 - fehlt hier vielleicht ein Semikolon (;) oder Anführungszeichen?
$dayIndex = $i % 5

Könnten Sie mir sagen, wo der Fehler liegt? hinter $dayIndex = $i % 5 steht doch ein Semikolon..

Vielen Dank.
by SoSci Survey (312k points)
Die Meldung kann auch bedeuten, dass in der Zeile vorher ein Semikolon fehlt. Oder dass irgendwo ein Anführungszeichen nicht korrekt gesetzt ist. Wenn Sie Ihren aktuellen PHP-Code posten möchten, werfe ich gerne einen Blick darauf.
by s154475 (150 points)
Ich habe exakt den oben stehenden Code genommen (den Sie vorgeschlagen haben). Also:

$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);
  }
}
by SoSci Survey (312k points)
Verstehe. Was Sie sehen ist nur eine falsche Warnung ... der Code-Checker von SoSci Survey kennt die Modolus-Rechnung (%) nicht und zweigt deshalb eine Warnung. Dies ist ein wenig irritierend (entschuldigung), hat aber keine Auswirkung auf die Funktion.
by s154475 (150 points)
alles klar. Vielen Dank für Ihre Unterstützung, Sie haben mir wirklich sehr geholfen!
by SoSci Survey (312k 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 (312k 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 (312k 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

...