Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitabstände

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zeitabstände

    Hallöchen...

    Ich hab im Moment vom ganzen Coden ein Brett vor dem Kopf und bekomm diese einfache Sache nicht hin:

    Ich möchte eine Funktion ausführen, die aus einer Mysql-Tabelle Daten nimmt und endweder an bestimmten Wochentagen (immer Dienstags) oder an bestimmten Monatstagen (immer am 1. oder so) eine Funktion ausführt. Wenn das Script per Cron oder von Hand täglich ausgeführt wird, kein Problem. Wie kann ich das aber machen wenn das Script *nicht* täglich aufgerufen wird? Also ausrechnen, wieviele Dienstage zwischen dem letzten Aufruf sind und die dazugehörigen Timestamps zurückgibt?

    Bisher hab ich folgendes:

    Code:
    while($zeile=$db->fetch_array($sql)){
    	$intervall=explode(":",$zeile['interval']);
    	if($intervall[0]=="weekly"){
    		$date=date("w");
    	}
    	if($intervall[0]=="monthly"){
    		$date=date("j");
    	}
    
    	if($intervall[1]==$date && $zeile['lasttime']!=get_twelve()){
    		dieshierausfuehren($zeile['id']);
    	}
    }
    Das Feld "interval" hat jeweils den Inhalt weekly:2 für Dienstags, weekly:3 für Mittwochs... oder monthly:1 bis monthly:28.
    Die Funktion get_twelve() gibt nur den Timestamp von heute, 12 Uhr zurück.
    Die Funktion die aufgerufen werden soll (dieshierausfuehren() aktualisiert den Datensatz in der Ursprungstabelle so, dass lasttime auf heute, 12 Uhr steht, so dass es irgendwie rechnerisch gehen sollte.

    Hat jemand mein wirres Gefasel verstanden und eine Idee wie ich das machen kann?


  • #2
    Ich bin zu müde um noch klar zu denken.
    Aber wie wäre es, wenn du den nächsten Termin in die DB einträgst
    (oder wo auch immer du die Daten speicherst) und das Script fragst
    ob der Termin schon vergangen war.

    PHP-Code:
    <?
    // $fixeddate ist der nächste Termin, der ausgeführt werden soll
    // den muss man natürlich aus der DB auslesen (oder Textdatei)
    if (time() >= $fixeddate)
    {
        mach_was();
        $bla = 1;
    }
    if ($bla == 1)
    {
        schreib_den_naechsten_termin_in_die_db();
    }
    ?>
    Sorry, keine Lust hier vernünftigen Code zu schreiben, ich geh jetzt schlafen.
    Vielleicht hilft dir das ja irgendwie weiter, oder gibt dir irgendeinen Denkansatz.

    Ich hab auch oft genug so eine Denkblockade.

    Kommentar


    • #3
      Edit: So, ich habs hinbekommen, warum auch immer. Danke dafür dass du es versucht hast, trotz der Uhrzeit

      Kommentar


      • #4
        Und wie?

        Kommentar


        • #5
          get_twelve() sucht wieder den 12-Uhr-Timestamp raus von dem Datum, zu dem der Timestamp gehört der eingegeben wird, machwas() macht was es soll und aktualisiert das lasttime-Feld in der Datenbank.

          Code:
          while($zeile=$db->fetch_array($sql)){
          	$intervall=explode(":",$zeile['interval']);
          	if($intervall[0]=="weekly"){
          		$date=date("w");
          	}
          	if($intervall[0]=="monthly"){
          		$date=date("j");
          	}
          	if($zeile['lasttime']==0 && $intervall[1]==$date){
          		$anzahl=1;
          		$timeversatz=get_twelve();
          		}elseif($zeile['lasttime']==0 && $intervall[1]!=$date){
          		$anzahl=0;
          		$timeversatz=0;
          		}else{
          		if($intervall[0]=="weekly"){
          			$anzahl=floor((get_twelve()-$zeile['lasttime'])/(86400*7));
          			$timeversatz=604800;
          		}
          		if($intervall[0]=="monthly"){
          			$anzahl=round((get_twelve()-$zeile['lasttime'])/(86400*31));
          			$timeversatz=86400*31;
          		}
          	}
          	for($x=1;$x<=$anzahl;$x++){
          		$newtime=$zeile['lasttime']+$x*$timeversatz;
          		if($intervall[0]=="monthly" && $zeile['lasttime']!=0){
          			$monatstag=date("j",$newtime);
          			$anzahlversatz=$monatstag-$intervall[1];
          			$newtime=$newtime-$anzahlversatz*86400;
          		}
          		$newtime=get_twelve($newtime);
          		machwas($newtime);
          	}
          }

          Kommentar

          Lädt...
          X