kostenloser Webspace werbefrei: lima-city


Zeitrechnungen mit Php

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    manta22

    manta22 hat kostenlosen Webspace.

    Hallo Lima-City!

    Ich will folgendes Problem realisieren/lösen:

    Ein µC schreibt alle 3 Stunden Daten in meine DB (Daten + Timestamp).
    Ich würde allerdings gerne eine Art "Sicherung" einbauen, die verhindert, dass er dies zu oft macht.
    (Ja es ist mit 3 Stunden im µC verankert - ich würde das allerdings auch gerne im php script unterbringen - doppelt hält besser)
    Meine Idee war jetzt folgende:

    1) µC sagt er will einen Eintrag machen
    2) Hole Timestamp vom letzten Eintrag
    3) Rechne zu diesem 2:59h (1 Min Spielraum)
    4) Vergleiche mit der Uhrzeit jetzt
    5) Wenn alter Timestamp + 2:59h = jetztige Uhrzeit (oder mehr) dann Eintrag erlaubt sonst verwerfen.

    Allerdings kommt jetzt das "Problem" mit den Zeitumrechnungen, daher 3 Vorschläge und ich würde gerne wissen was ihr meint welcher der bessere wäre:

    1) Jedes mal umrechnen:

    $mysqldate = date( 'Y-m-d H:i:s', $phpdate );
    $phpdate = strtotime( $mysqldate );


    2) MySQL die Arbeit machen lassen:

    $query = "SELECT UNIX_TIMESTAMP(Datum)
    FROM table WHERE...";


    3) Nur Php Timestamps verwenden - was allerdings dann bei der Ausgabe der Tabelle auf das Problem mit dem Umrechnen kommt weil das ja nur INT zahlen sind oder?

    lg manta22
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. je nach dem welcher UNIX Timestamp der mit der richtigen Zeit ist ;)

    Habe es schon gesehen, das Unix und PHP timestamp unterschiedlich waren weil die zeitzone nicht richtig eingestellt war.

    Ich würde es halt mit PHP machen, weil da die time() korrekt aus gibt, wenn du die Zeitzone auch richtig eingestellt hast.

    EDIT:
    Was die INT angaben betrifft, wäre es damit einfacher ;)

    mktime nutzen und 2 unix_ts erstellen und die mit mysql in verbindung mit BETWEEN abfragen ;) wenn ergebnis der Abfrage gleich 1 und höher ist, dann abbrechen oder zulassen kp ;)

    Beitrag zuletzt geändert: 22.2.2012 22:37:02 von dexus85
  4. Hallo,

    mit folgender SQL-Abfrage bekommst Du genau das Ergebnis, was Du haben möchtest! Wenn Du alles innerhalb von MySQL machst, bekommst Du auch nicht das Problem mit verschiedenen Zeitzonen bzw. unterschiedlichen Formaten.

    SELECT `last_update` FROM `timecalc` WHERE `last_update` + INTERVAL '2:59' HOUR_MINUTE < NOW() LIMIT 1

    Hier bekommst Du als Ergebnis entweder 1 Zeile, wenn das Update gestartet werden soll oder ein leeres Resultat (keine Zeile), wenn das letzte Update noch keine 2 Stunden 59 Minuten her ist!

    Nachdem Dein Update gelaufen ist, musst Du nur Deinen TIMESTAMP auch wieder mit SQL aktualisieren.
    UPDATE `timecalc` SET `last_update`=CURRENT_TIMESTAMP WHERE 1;

    Die Tabelle habe ich wie folgt angelegt...
    CREATE TABLE IF NOT EXISTS `timecalc` (
      `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    INSERT INTO `timecalc` (`last_update`) VALUES (CURRENT_TIMESTAMP);


    Beitrag zuletzt geändert: 23.2.2012 0:09:00 von staymyfriend
  5. Autor dieses Themas

    manta22

    manta22 hat kostenlosen Webspace.

    Hallo!

    Danke mal an euch beide für die Antworten!

    staymyfriend schrieb:
    Wenn Du alles innerhalb von MySQL machst, bekommst Du auch nicht das Problem mit verschiedenen Zeitzonen bzw. unterschiedlichen Formaten.
    SELECT `last_update` FROM `timecalc` WHERE `last_update` + INTERVAL '2:59' HOUR_MINUTE < NOW() LIMIT 1

    Hier bekommst Du als Ergebnis entweder 1 Zeile, wenn das Update gestartet werden soll oder ein leeres Resultat (keine Zeile), wenn das letzte Update noch keine 2 Stunden 59 Minuten her ist!


    Die Idee find ich super;). Funktioniert bei mir auch fast, da ich aber bereits Einträge in der Tabelle habe die Timestamps beinhalten, findet "er" immer welche die auch plus 3h < als jetzt sind. Lösung einfach die Ungleichung umdrehen:

    SELECT `last_update` FROM `timecalc` WHERE `last_update` + INTERVAL '2:59' HOUR_MINUTE > NOW() LIMIT 1


    Anschließend genau umgekehrtes Spiel mit 0 und 1 bei den rows!

    Danke nochmals für die Lösungen, es freut mich echt, dass zumindest das jetzt mal klappt;).

    lg manta22
  6. manta22 schrieb:
    Hallo!

    Danke mal an euch beide für die Antworten!

    staymyfriend schrieb:
    Wenn Du alles innerhalb von MySQL machst, bekommst Du auch nicht das Problem mit verschiedenen Zeitzonen bzw. unterschiedlichen Formaten.
    SELECT `last_update` FROM `timecalc` WHERE `last_update` + INTERVAL '2:59' HOUR_MINUTE < NOW() LIMIT 1

    Hier bekommst Du als Ergebnis entweder 1 Zeile, wenn das Update gestartet werden soll oder ein leeres Resultat (keine Zeile), wenn das letzte Update noch keine 2 Stunden 59 Minuten her ist!


    Die Idee find ich super;). Funktioniert bei mir auch fast, da ich aber bereits Einträge in der Tabelle habe die Timestamps beinhalten, findet "er" immer welche die auch plus 3h < als jetzt sind. Lösung einfach die Ungleichung umdrehen:

    SELECT `last_update` FROM `timecalc` WHERE `last_update` + INTERVAL '2:59' HOUR_MINUTE > NOW() LIMIT 1


    Anschließend genau umgekehrtes Spiel mit 0 und 1 bei den rows!

    Danke nochmals für die Lösungen, es freut mich echt, dass zumindest das jetzt mal klappt;).

    lg manta22


    So ist Deine Lösung noch einfacher und Du brauchst nichts umzudrehen oder sonst etwas...
    SELECT `last_update` FROM `timecalc` WHERE `last_update` + INTERVAL '2:59' HOUR_MINUTE < NOW() ORDER BY `last_update` DESC LIMIT 1

    Wenn Du mehr als eine Zeile auch als Ergebnis brauchst, lass einfach das 'LIMIT 1' am Ende weg...
  7. Autor dieses Themas

    manta22

    manta22 hat kostenlosen Webspace.


    Wenn Du mehr als eine Zeile auch als Ergebnis brauchst, lass einfach das 'LIMIT 1' am Ende weg...


    Das ist mir schon klar!
    Es war gemeint, dass ich mehrere Einträge habe und damit automatisch einen der auch plus 3h kleiner als jetzt ist.
    Deinen zweiten Vorschlag muss ich erst ausprobieren schaut aber auch gut aus;)

    lg manta22
  8. in punkto zeitzonen ist die lage momentan so:
    $j = date('Y');
    was leider (ich 'glaube') seit php5.1.0 die warnung von sich gibt:
    [Sat Feb 25 01:42:15 2012] [error] [client fe80::219:dbff:fece:438b] PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CET/1.0/no DST' instead in /<pathto>/test.php on line N
    daraus folgend kannst - bevor irgendetwas mit datum-uhrzeit in deinem kode passiert -
    ...
    date_default_timezone_set('Europe/Vaduz');
    ...
    oder so ausführen. (siehe noch unterstützte zeitzonen)
    damit ist zeitzonenprob. die vergangenheit.

    Beitrag zuletzt geändert: 25.2.2012 1:55:33 von hemiolos
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!