Hugo Egon Balder: Richtiges Datensatz-Updatedatum in einer SQL DB

Beitrag lesen

Hallo Dedlfix!

Ich glaube, Du setzt bei mir um _Welten_ mehr Wissen und Verständnis voraus, als ich tatsächlich bieten kann. Ich bin jetzt an einem Punkt angelangt, wo ich mich _endgültig_ nicht mehr auskenne und resigniere.

Vor 3 Tagen habe ich gefragt: "Was für ein Kommando muss ich nach dem Verbindungsaufbau durch mysqli noch darunter schreiben, um meine gewünschte Zeitzone festzulegen?" Da sagtest Du: "Soweit ich weiß, geht das mit einem Statement 'SET time_zone = timezone'". OK, ich _war_ auf der Seite, dort steht auch nur die Syntax 'mysql> SET time_zone = timezone;'.  Ich bin völliger Anfänger und habe keine Ahnung, wo und wie das jetzt einzubauen ist. Darum habe ich auch extra nach der Syntax gefragt! Direkt zu verwenden, so, wie ich Dich ursprünglich verstanden habe, ist es jedenfalls _nicht_! Denn egal, ob ich die Verbindung so aufbaue…

$db=@new mysql('mysql5.example.com','db_foo','password','db_foo');  
$db->set_charset('utf8');  
mysql> SET time_zone = 'Europe/Athens';

…oder so…

$db=@new mysql('mysql5.example.com','db_foo','password','db_foo');  
$db->set_charset('utf8');  
SET time_zone='Europe/Athens';

…es kommt in beiden Fällen ein "Parse error: syntax error, unexpected T_STRING in…"! Gut, daraufhin habe ich das in verschiedensten Variationen bei Google eingegeben und fand dann eben irgendeine Seite, wo nach dem Verbindungsaufbau ein '$db->query("set time_zone='+02:00'");' stand. Das habe ich dann auch versucht und es kam keine Fehlermeldung mehr. Daraus habe ich geschlossen, dass _das_ offenbar die Syntax ist, in der ich das von Dir gemeinte 'SET time_zone = timezone' verwenden muss.

SET liefert kein Resultset. Du kannst für dessen Aufruf die Methode exec() nehmen.

Aha. Was heißt jetzt "kannst"? Muss ich oder muss ich nicht? Ich kenne mich überhaupt nicht mehr aus. Soll ich jetzt nach dem Verbindungsaufbau nach der utf-8 Festlegung irgendswas mit exec() hinschreiben?

Definiere dein Geschehen.

Das habe ich doch! *seufz* Ich weiß nicht, wie ich meine Problematik noch genauer erklären soll.

Bei mir hat sowohl mit der +/-0:00-Syntax als auch nach dem Füllen der Timezone-Tabellen mit Zonen-Namen alles bestens funktioniert.
SET time_zone='Europe/Berlin';
INSERT INTO test (t) VALUES ('1970-01-01 03:00:00');
SELECT t, UNIX_TIMESTAMP(t) FROM test;

Ausgabe; 1970-01-01 03:00:00, 7200

Und jetzt steige ich völlig aus. Bedeutet das, dass das überhaupt nicht zum Verbindungsaufbau hingehört sondern in den Query? Ich habe das getestet und es kommt natürlich eine Fehlermeldung.

So war der Query vorher - funktionierend und ohne Fehlermeldung:

$query="SELECT id, time, datum, nameFROMtabelleWHEREid = 15";

So, jetzt erweitere ich das wie von Dir hingeschrieben direkt im Query:

$query="SET time_zone='Europe/Athens' SELECT id, time, datum, nameFROM15_testWHEREid = 15";

Und es kommt die Fehlermeldung "Parse error: syntax error, unexpected T_STRING in..."!

SET time_zone='UTC';
SELECT t, UNIX_TIMESTAMP(t) FROM test;

Ausgabe; 1970-01-01 02:00:00, 7200

Abgesehen davon, dass das bei mir nicht funktioniert - verstehe ich das richtig? Du läßt Dir praktisch das, was in der Tabelle steht, 2 mal ausgeben. Einmal als Timestamp (also in der Form '0000-00-00 00:00:00'), so wie es gespeichert ist, und einmal gleich von SQL umgewandelt von Timestamp auf Unix-Timestamp?

Der Unix-Timestamp-Wert ändert sich nicht, denn er gibt ja immer die Sekunden in UTC aus

Der Unix-Zeitstempel gibt mir doch Auskunft über die vergangenen Sekunden seit Donnerstag, den 1. Januar 1970 00:00 Uhr UTC. Aber diese Zeit ist doch für alle gleich, egal, wo man sich auf der Welt befindet. Deshalb ist mir Deine Definition "Sekunden in UTC" nicht ganz klar.

Dann machst du vielleicht was falsch oder ziehst die falschen Schlüsse.

Glaub mir, lieber Dedlfix, ich recherchiere seit Tagen und versuche alles, um Deine Hinweise so zu realisieren, dass ich das mit den Zeitzonen handeln kann!

Der PMA macht auch nur ein SELECT und hat einen Verbindungsaufbau, bei dem er ohne weiteres keine Zeitzone setzt. Bei mir sehe ich ohne vorheriges SET im PMA immer die Lokalzeiten. Über den Startbildschirm vom PMA kann man sich die Variablen anzeigen lassen, und sogar bearbeiten (Version 3.5.2.2). Ich sehe bei 'time zone' ein SYSTEM und bei 'system time zone' ein CEST. Bearbeite ich 'time zone' zu UTC, sehe ich beim einfachen Anzeigen nun die UTC-Werte. Man muss das aber nicht dort ändern, sondern kann das angezeigte SQL-Statement bearbeiten und ein 'SET time_zone...;' voranstellen.

OK, diesen Absatz habe ich jetzt an die 10 Mal gelesen, ich glaube, ich hab jetzt endlich verstanden, wie er gemeint ist. Nur bzgl. dem "sich die Variablen anzeigen lassen": Auf meiner PMA Startseite steht "phpMyAdmin - 2.11.11.3". Das erklärt dann wohl, wieso ich diesen Punkt nirgendwo finden kann.

Du musst es nur richtig machen :-)

Wie gesagt, das versuche ich jetzt seit Tagen!

PS: Was ich natürlich _nicht_ weiß, ist, ob das $db->query("set time_zone='+02:00'"); auch wirklich der richtige Weg zur Festlegung einer Zeitzone ist.
Jein.

Du hast mir doch ein paar Zeilen darüber geschrieben, dass das falsch ist, weil "SET kein Resultset liefert"! Jetzt ist es nur mehr ein jein?

Du brauchst also die gefüllten Zeitzonentabellen, um das Zeitzonenhandling namensbasiert dem MySQL überlassen zu können.

Und wie finde ich heraus, ob das bei mir der Fall ist?

Sonst geht nur UTC-Speicherung in MySQL mit Lokal-Umrechnung in PHP.

Ja aber wenn dem so ist, dann ist doch unser ganzer tagelanger Diskurs völlig umsonst, oder? Wozu dann überhaupt das ganze umständliche Hin-und-her? Ist es da nicht am unkompiziertesten, einen Zeitpunkt als UTC Zeitstempel zu speichern, den ohne irgend eine Umwandlung von der DB ausgeben zu lassen und dann mit php in einen Zeitpunkt einer Zeitzone seiner Wahl umzuwandeln?

Was mich zu meiner letzten Frage führt: Du schreibst etwas weiter oben von der Funktion 'gmdate()'. Aber wenn ich besagten UTC Timestamp in einen Datum-Zeit-Stempel einer bestimmten Zeitzone bringen möchte, dann mache ich das doch so, dass ich den String in die Einzelteile zerlege und dann mit date() und mktime() arbeite. zB:

date_default_timezone_set('Europe/Berlin');  
echo date('c',mktime(1,2,3,4,5,2006));

Oder gibt es einen einfacheren Weg?

Wie gesagt, wenn das alles so umständlich und kompliziert ist, dann bleibe ich dabei, den Automatismus abzuschalten, die Zeitpunkte als UTC-Timestamp zu speichern diesen und vor der Ausgabe für den User mit php in ein lesbares Datum/Zeitpunkt einer gewünschten Zeitzone umzuwandeln.

Mich würden natürlich trotzdem die Antworten/Erklärungen zu meinen oben geschriebenen Unklarheiten interessieren!

Und bei der Gelegenheit möchte ich nochmal dafür bedanken, dass Du Dir da immer so viel Zeit nimmst und die Geduld aufbringst, immer wieder zu antworten. Auch, wenn jemand so unfähig ist wie ich! :-)

MfG

Hugo Egon Balder