Contao Open Source CMS > Contao-Forum

Zum englischen Forum

Index > Fehler melden > Geburtstag wird nicht richtig gespeichert.

Hallo,

es gibt offensichtlich ein Problem mit dem Geburtstag bei Mitgliedern, wenn diese im Jahre <1939 geboren sind. Gibt man z.b. 07.06.1937 (1937-06-07 in der Online-Demo) ein, so wird aus diesem Datum nach der Speicherung 1966-09-29.

Ich habe es in der Online-Demo nachgestellt.

Gruß
Kester
2008-07-22 10:40
Hi,

der fehler ist kein Fehler, es liegt an der unix Zeitzählung die am 01.01.1970 begann.

Grüße,

Sven.
2008-07-22 12:27
Hi,

bedeutet, dass es keine Lösung gibt? Und wieso ist es dann möglich z.B. den 01.01.1940 zu speichern?

Gruß
Kester
2008-07-22 14:30
markus.milkereit
Partner
Avatar
Beiträge: 441
Heilbronn, Deutschland
dateOfBirth ist als varchar(10) gespeichert, das ist für die nötige Größenordnung mit Minus-Zeichen eine Stelle zu wenig. Man braucht bei einem Char 11 Zeichen um -2147483647 bis 2147483648 abzubilden. (Entspricht dem Werteraum des Unix-Timestamp, Datum 13.12.1901 bis 19.01.2038).

@Leo oder gibt es einen tieferen Grund dafür hier nur 10 Zeichen zu verwenden?

Gruß
Markus
Zuletzt bearbeitet von simplemind, 2008-07-22 17:08
computino.de Webservice Hosting, Domains, Entwicklung, Schulungen
2008-07-22 17:07
leo
Administrator
Avatar
Beiträge: 7045
Wuppertal, Deutschland
Ich glaube kaum, dass es mit der bloßen Umstellung der Datenbank getan ist :-)

Momentan werden hier nur positive Zahlen gespeichert und bei gesetzter "unsigned"-Option ist das Feld immer nur 10 Zeichen lang. Negative Werte zu erlauben ist sicherlich ein guter Ansatz, um das Problem zu beheben. Allerdings wird es ohne Code-Anpassungen wohl nicht funktionieren.
2008-07-22 19:21
markus.milkereit
Partner
Avatar
Beiträge: 441
Heilbronn, Deutschland
Hallo Leo,

ich dachte es passt schon so alles wie es ist, da zum Beispiel das Geburtsdatum 22.07.1955 zum Timestamp in der Datenbank von -455936400 führt, was auch der richtige Timestamp dafür ist.

Und um die "einfach" Theorie zu stützen: stellt man auf varchar(11) um, werden Datumsangaben von 1901 bis 2038 richtig gespeichert - bei größeren Werten kommen jedoch undefinierte Werte, der Timestamp ist als 32-Bit Integer definiert (10 stellen + Vorzeichen als Char).

Gruß
Markus
computino.de Webservice Hosting, Domains, Entwicklung, Schulungen
2008-07-22 19:28
leo
Administrator
Avatar
Beiträge: 7045
Wuppertal, Deutschland
Tja, und so schnell kann man sich irren. Es ist in der Tat mit einer einfachen Umstellung der Datenbank getan (bitte entschuldige, Markus). Das Feld dateOfBirth muss INT(11) werden.
2008-07-22 19:39
Hallo Marcus,

danke für die schnelle Lösung, und vor allem für die gute Erklärung. ;)
Ich werde es mal probieren.

Danke
Gruß
Kester
2008-07-22 20:14
markus.milkereit
Partner
Avatar
Beiträge: 441
Heilbronn, Deutschland
Hallo Kester,

gern geschehen, aber bitte: Markus, irgendwie schleicht sich das gerade ein mit der Ruhrpot-Schreibweise und dem vertrackten c ;)
Ich würde übrigens einen int (10) signed (bzw. eben nicht unsigned) nehmen für das Geburtsdatum.

Gruß
Markus
Zuletzt bearbeitet von simplemind, 2008-07-22 20:25
computino.de Webservice Hosting, Domains, Entwicklung, Schulungen
2008-07-22 20:24
leo
Administrator
Avatar
Beiträge: 7045
Wuppertal, Deutschland
Es muss int(11) heißen wenn es signed sein soll. Wie Du schon festgestellt hast, ist bei 10 Zeichen nicht genug Platz für das Minus. Also entweder "int(10) unsigned" oder "int(11)".
2008-07-22 20:42
markus.milkereit
Partner
Avatar
Beiträge: 441
Heilbronn, Deutschland
Hallo Leo,

ein signed Int braucht im Gegensatz zum Char doch nur 1 Bit (und nicht 1 Byte) für die Darstellung des Minus. Ein unsigned kann keine negativen Timestamps speichern. Und um einen 32Bit-Integer unter zu bekommen reicht locker ein int(10), wobei man mit dem int(11) hier nichts kaputt macht, da sowieso so große Zahlen nicht vorkommen sollten. Verschwendet nur 1 Stelle Speicherplatz ;)

Gruß
Markus
computino.de Webservice Hosting, Domains, Entwicklung, Schulungen
2008-07-22 21:05
leo
Administrator
Avatar
Beiträge: 7045
Wuppertal, Deutschland
Also ich bin einfach nach dem Default-Wert von phpMyAdmin gegangen und der ist int(11). Mag aber gut sein, dass Du Recht hast - ich überlege es mir lieber genau, ob ich noch mal wiederspreche :-)

So oder so sind wir jetzt auf der sicheren Seite, oder?
2008-07-22 21:11
markus.milkereit
Partner
Avatar
Beiträge: 441
Heilbronn, Deutschland
Auf jeden Fall, zumindest bis in PHP6 (vielleicht) der 64Bit-Timestamp kommt ;)

Gruß
Markus
computino.de Webservice Hosting, Domains, Entwicklung, Schulungen
2008-07-22 21:14
Hallo Markus,

werde es mit merken. ;-)

Gruß
Kester
2008-07-23 10:11
RalfPressler
User
Avatar
Hallo Leute, ich stehe vor einem Problem.

Ich wollte für einen User weil er es in seinem Profil im Frontend nicht ändern kann (was schon komisch ist) sein Geburtstag einpflegen.
Im Backend habe ich das Datum in der richtigen Formatierung eingegeben.
Nach der Speicherung allerdings trägt er das Datum von heute ein.

Ist das ein Bug? Wie kann ich das lösen?

Ich nutze für die Frontenduser das member_grouped_helpdesk Template.
2009-05-05 13:30