php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005-2

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.10.2005, 12:44  
Erfahrener Benutzer
 
Registriert seit: 14.05.2008
Beiträge: 183
netti befindet sich auf einem aufstrebenden Ast
Standard ein counter - und berechnungen

Heyho

Ich habe mir nun einen Counter geschreiben. Allerdings habe ich (wies sollte es anders sein) 'nen kleines Problem.
Fähigkeiten des Counters sind Counter gesamt, Besucher gestern und Besucher heute - gespeichert wird in einer db.
Beim Counter funktioniert auch alles, bis auf die Umschaltung zwischen Besucher gestern / heute. Um Punkt Mitternacht, soll das Script die besucher von heute auf gestern schieben und den heute counter auf 0 setzten (natürlich nur, wenn besucher da sind zur ausführung des scripts.).
Soweit so gut, klappt auch.
Zur Funktionsweise: Ich habe mir hierzu überlegt, dass ich das mit timestamps mache, die ja bekanntlich seit dem 1.1.1970 00:00,00 uhr laufen. Jede Sekunde einer mehr. Also nehme ich den timestamp time() und teile ihn durch (60*60*24) um auf die tage seit 1970 zu kommen. Das ganze schneide ich nach dem Komma ab und setzte es in die datenbank für jemweils heute / gestern (gestern ein tag weniger). Sobal die anzahl der Tage umspringt, wird der counter wie oben beschrieben, geleert / verschoben.
Klappt ebenfalls. Allerdings berechnet er mir nicht um 12 uhr nachts, sondern um 2 uhr morgens.
Zur Überprüfung: Wenn ich mit date() einen timestamp aus 0 erzeuge bekomme ich 1.1.1970 um 1:00,00 uhr. Gut, dass schiebe ich auf die Zeitzonen. Aber woher kommt die zweite stunde? wieso ist erst morgens um 2 uhr ein weiterer kompletter tag um und nicht um 1 uhr?

Hier mal ein Beispiel, wie man das Überprüfen kann. EInfach Ausgabe von:

PHP-Code:
<?php
print date("d. M Y, H:i"0) ."
"
//timestamp bei 0
print (time()+3600+(3600*1)) / (60 60 24) ."
"
//timestamp wird anfangs um 2 stunden vergrößert (Die 1 steht für Zeitzone UTC+1)
print (time()+3600) / (60 60 24) ."
"
//Vergrößerung um eine Stunde
print time() / (60 60 24) ."
"
//normalzeit
?>
Nun setzt mal den Rechner auf kurz vor 12 startet nen php-server und schaut welches Zeile den Anbruch eines neuen Tag zeigt. Ich verstehe nicht, warum 2 stunden nötig sind...

Das Gesamtproblem sehr schwer zu erklären, wenn es Verständnissprobleme gibt, bitte melden. Mir liegt viel daran, das hier zu verstehen!!

Danke euch sehr!
netswipe
netti ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 22.10.2005, 15:04  
Gast
 
Beiträge: n/a
Standard

Zitat:
Klappt ebenfalls. Allerdings berechnet er mir nicht um 12 uhr nachts, sondern um 2 uhr morgens.
Sind sich DB und PHP einig über die Uhrzeit?
Für den Fall, dass es um mysql geht:
PHP-Code:
<?php
$db 
mysql_connect('...''...''...') or die(mysql_error());

$sql 'SELECT Now(), Unix_Timestamp(Now())';
$result mysql_query($sql) or die(mysql_error());
$row mysql_fetch_row($result);

$now = array();
$now[1] = time();
$now[0] = date('Y-m-d H:i:s'$now[1]);

echo 
"DB : $row[0] , $row[1]\
\nPHP: $now[0] , $now[1]"
;
?>
 
Alt 22.10.2005, 15:19  
Erfahrener Benutzer
 
Registriert seit: 14.05.2008
Beiträge: 183
netti befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
DB : 2005-10-22 15:17:40 , 1129987060\
PHP: 2005-10-22 15:17:40 , 1129987060
Ja, völlig identisch. Aber selbst wenn nicht, wird das Script bzw. Abfolge vollständig über php gesteuert.
netti ist offline  
Alt 23.10.2005, 16:03  
Gast
 
Beiträge: n/a
Standard

dann zieh doch einfach die 2 Stunden ab....
also timestamp - 2 * 60 * 60
 
Alt 23.10.2005, 16:27  
Erfahrener Benutzer
 
Registriert seit: 14.05.2008
Beiträge: 183
netti befindet sich auf einem aufstrebenden Ast
Standard

ja mache ich ja auch.

Aber ich verstehe einfach nicht wieso. 2 ist alles andere als logisch. Nur 1 ist sinnvoll! Ich fände es eben toll das zu verstehen... :/
netti ist offline  
Alt 24.10.2005, 01:39  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hi.

Ich verstehe leider dein Problem nicht ganz (wie auch dein letztes, auf das ich geantwortet habe). Auf den ersten Blick sieht mir das jedoch danach aus, dass du hier die Mitteleuropäische Sommerzeit erwartest, jedoch davon ausgehst, dass diese der UTC nur 1 Stunde vorausläuft, obwohl sie eben 2 Stunden vorgeht. Ich würde in dem Fall hier übrigends die Datumsfunktionen von MySQL bemühen.

Basti
Basti ist offline  
Alt 24.10.2005, 01:55  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Basti
Ich würde in dem Fall hier übrigends die Datumsfunktionen von MySQL bemühen.
Und dann auch nicht sowas wie
Zitat:
Zitat von netswipe
Sobal die anzahl der Tage umspringt, wird der counter wie oben beschrieben, geleert / verschoben.
machen, sondern die relevanten Datensätze/Aggregate abfragen. Wenn der Index richtig gesetzt ist, tut das überhaupt nicht weh. Daten verschieben, löschen, ändern kannst Du immer noch zu einem (viel) späteren Zeitpunkt.
 
Alt 24.10.2005, 16:21  
Erfahrener Benutzer
 
Registriert seit: 14.05.2008
Beiträge: 183
netti befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
de.wikipedia.org:
Die deutsche Standardzeit ist die Mitteleuropäische Zeit (MEZ, oder auch CET für "Central European Time"), die gleich der UTC plus einer Stunde ist.
Habe ich gelesen - aaaaber: Die nicht richtig Lesenden werden mal wieder bestraft, denn der nächste Satz lautet:
Zitat:
de.wikipedia.org:
Während der Sommerzeit gilt die Mitteleuropäische Sommerzeit (MESZ/CEST), die der UTC plus zwei Stunden entspricht.
Damit hat sich das dann auch erledigt. Entschuldigt meine Unwissenheit und die Tatsache, dass ich nicht richtig geblättert habe. Werde ich mir noch was mit der Winterzeit überlegen müssen. Eine Möglickeit wäre natürlich noch, einfach per getdate() (jahr - einrichtungsjahr des counters) * 365 + tag des jahres.

Was ist im Übrigen der genaue Vorteil der Nutzung von MySQL's eingebauter Zeitfunktion?

Bei der Gelegenheit: Ich glaube es wäre mal ein Forum nicht schlecht, in dem Beiträge nicht gezählt werden, aber auch mal Dinge gefragt werden dürfen, die man ganz einfach vergessen/übersehen hat und bei denen Google nicht viel helfen würde (dies insbesondere mit Blick auf den genannten anderen Beitrag von mir ).
netti ist offline  
Alt 24.10.2005, 16:51  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard Re: ein counter - und berechnungen

Zitat:
Zitat von netswipe
Das Gesamtproblem sehr schwer zu erklären
Eigentlich ist es doch weder schwer zu erklären, noch es zu lösen.
Du willst offenbar täglich ermitteln, wieviele Besucher deine Seite besucht haben.
Ich weiß jetzt nicht auf welchem Speichersystem dein Counter funktionieren soll, Datei oder DB.

Für beides würde ich die date()-Funktion vorschlagen:
date("Y-m-d") liefert dir den aktuellen Tag in der Schreibweise YYYY-MM-DD.
Benutze das doch als Index (Dateinamen bzw. Spalte, die du per WHERE Bedingung ansprichst).

Bei der Dateispeicherung ist das kein Problem, du kannst sie ja schreibend öffnen (wenn sie noch nicht existiert, wird sie neu angelegt), bei MySQL mußt du eben ein UPDATE probieren:

UPDATE counter SET hits = hits + 1 WHERE refDate = UNIX_TIMESTAMP() LIMIT 1

(wenn refDate vom Typ 'Date' ist).

Dann testest du mit mysql_affected_rows() == 1 ob das Update geklappt hat, wenn nicht, hat die WHERE-Bedingung keine Zeile erwischt, daraus folgt es gibt keine, also mußt du sie mit
INSERT INTO counter SET hits = 1, refDate = UNIX_TIMESTAMP()

setzen. Oder hab ich dein Ziel jetzt total verfehlt?
Zergling-new ist offline  
Alt 24.10.2005, 17:55  
Erfahrener Benutzer
 
Registriert seit: 14.05.2008
Beiträge: 183
netti befindet sich auf einem aufstrebenden Ast
Standard

nein...genau das meinte ich. Nur, dass ichs mit time() gemacht habe und den auf tage umrechne. Bei jedem Aufruf wird geprüft, ob de rtag in der db noch der selbe ist, wenn nicht wird aktualisiert.

Allein dadurch, dass ichs mit time() gemacht habe hat das "problem" aufgerufen, da ich aus meiner traumwelt gerüttelt wurde, als ich merkte, dass es erst um 1 nen update gibt (ich überlege vorher erst, wie ich etwas umsetzen will und schreibe dann erst drauf los - denke das ist normal). Ich habe nicht dran gedacht, dass die zeitzonen mit einbezogen werden, obwohl das natürlich logisch ist. Jedenfalls habe ich beim anschließenden googlen überlesen, dass mesz 2 stunden vor utc ist im gegensatz zu 1 im winter / mez.

Tja und dafür wollte ich ne erklärung. Ich hätte natürlich auch einfach richtig lesne können *sich-vorn-kopf-hau* ^^
netti ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Counter Problem Saphira PHP Tipps 2008 3 11.07.2008 19:21
Counter in "selbstgestrickte" Homepage - wie? magro PHP Tipps 2008 11 30.03.2008 16:37
Download mit Counter Smilerr PHP Tipps 2008 1 04.03.2008 22:44
Counter stellt sich unregelmäßig zurück Serena77 PHP Tipps 2007 13 17.05.2007 21:34
Wiederkehrer bei Counter ruferp PHP Tipps 2007 7 15.02.2007 07:08
Ordentlicher Counter mit guter Statistik havvi Off-Topic Diskussionen 6 28.05.2006 00:28
Counter - Daten gelöscht - Erklärung?? havok PHP Tipps 2005-2 9 18.10.2005 20:51
Counter funktioniert, aber trotzdem wird Fehler gezeigt ... PHP Tipps 2005 4 07.03.2005 17:56
Suche Counter Script Beitragsarchiv 8 17.01.2005 13:42
Problem mit counter HTML, Usability und Barrierefreiheit 10 12.01.2005 06:04
cookies setzen schlägt fehl (counter einrichten) PHP Tipps 2005 16 06.01.2005 00:33
Counter für registrierte user PHP Tipps 2004-2 3 26.12.2004 11:32
counter PHP Tipps 2004 2 18.08.2004 11:02
counter für gallerie Sclot PHP Tipps 2004 2 05.07.2004 15:36
Problem mit einem Counter JeeZ PHP Tipps 2004 6 18.06.2004 13:36

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php berechnungs zähler, php zähler mit zeitfunktion, php timestamp heute um 2 uhr, counter berechnung php, php warum liefert date(\h:i\,0) 1:00, php timestamp ist um 2 stunden verschoben

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:43 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.