InternInhaltsverzeichnisGlossarBausteineLinklisteTutorialsKommentare

Thema: MySQL - Eintrag schreiben Artikel anzeigen

Peter schrieb am Samstag, den 11 August 2018 #1
Ich habe ein Spalte Geburtsdatum mit dem Spaltentyp "Date" mit Default Wert Null.

Bei Eintragen einer Person mit und ohne Geburtsdatum funktioniert es auch tadellos. Auch das Sortieren nach Geburtsdatum ist kein Problem.

Auch Einträge, wo Geburtsdatum leer bleibt, ist kein Problem.

Probleme fangen bei "Update" an. Sobald ich einen Datensatz mit leerem Geburtsdatum update, wird die Spalte Geburtsdatum das 0000-00-00 immer auf 1970-01-01 geändert. Die Spalte sollte aber leer bleiben, wie zuvor, wenn ich kein Geburtsdatum bei Update eingebe.

Den Spaltentyp auf Varchar umändern ist auch nicht schön, vor allem habe ich dann vermutlich wieder Probleme beim Sortieren nach dem Datum.
Werner schrieb am Samstag, den 11 August 2018 #2
Hallo Peter,
Wenn in der DB-Tabelle: 1970-01-01 drin steht, dann ist es meistens ein Eingabefehler oder eine PHP-Funktion (z.b. date(), mktime()) wurde falsch angewendet!

Leere Eingabefelder sollten vermieden werden wenn mit den Werten noch gearbeitet wird oder diese irgendwo eingetragen werden.
Das musst du dann überprüfen und bei einem leeren Wert einen Standard-Wert setzen.
Ungefähr so:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if ($_POST["jahr"] == '' ||
    
$_POST["jahr"] < '1900' ||
    !
is_numeric($_POST["jahr"])) {
 
$jahr '0000';
 
// oder
 
$jahr date("Y");
}
 else {
  
$jahr $_POST["jahr"];
 }
?>

Vorschläge:
Generell würde ich keine normalen Eingabefelder für das Datum verwenden, sondern
Auswahllisten, eine für den Tag, den Monat und eine für das Jahr.
Das hat den Vorteil, das Fehleingaben seitens des Benutzers vermieden werden.

Besser wäre es, einen Default-Wert in der DB-Tabelle zu setzen:
`geburtstag` DATE NOT NULL DEFAULT '0000-00-00',
Semikolon schrieb am Mittwoch, den 15 August 2018 #3
Nur zur Info ...
0000-00-00 ist kein gültiger Wert für ein Datum. Dafür gibt es den Wert NULL.
Peter schrieb am Mittwoch, den 15 August 2018 #4
@Werne;

Das ist ja das Eigenartige. Es handelt sich um ein Geburtstagsfeld für meinen private Adress-Datenbank und Organizer (Termine, Notizen, Geburtstage, Veranstaltungen usw). Das Geburtstagsfeld wird über Auswahllisten eingetragen und auch korrekt eingetragen.

Die Spalte ist auf NULL gestellt. Wenn im Personen-Eingabeformular kein Geburtsdatum eingegeben wird, dann ist alles korrekt.

Wenn ich aber im Update-Formular den Datensatz (zB Vorname) ändere, dann wird das auf NULL stehende Geburstagsfeld mit 1970-01-01 überschrieben. Wenn ich ein Geburtsdatum eingebe, dann passt es auch. Also mit der Eingabe und Umwandlung vom Deutschen Format hat es nichts zu tun.

Muss mir das Update-Formular nochmals genauer anschauen. Danke für eure Hinweise.
Peter schrieb am Freitag, den 17 August 2018 #5
Ich sehe den Fehler einfach nicht.

Das Update-Formular ist gegenüber dem Erst-Eingabeformular nicht anders programmiert (ausgenommen die Insert und Update Komponenten).

Wenn man beim Eingabeformular kein Geburtsdatum eingibt, dann wird wie gewünscht nichts ausgegeben.

Wenn man beim Update-Formular kein Geburtsdatum eingibt, wird plötzlich 1970-01-01 eingetragen.
Peter schrieb am Freitag, den 17 August 2018 #6
Nachtrag:

Bis ich den Fehler in der Prüfung gefunden habe, behelfe ich mir mit einer sehr "unschönen" Lösung.

"....
WHERE ...
AND `geburtsdatum` != '1970-01-01'
ORDER BY..."
Werner schrieb am Freitag, den 17 August 2018 #7
Hallo Peter,
wie der Fehler zustande kommt das würde mich auch interessieren.
Wenn du möchtest, kannst du mir das Script per E-Mail zusenden, ich schaue dann wo der Fehler liegt.
Peter schrieb am Freitag, den 17 August 2018 #8
Danke Werner für dein Angebot.

Ich möchte es gerne noch selbst ein paar Tage versuchen wegen dem Lerneffekt und werde auf alle Fälle berichten, ob positiv oder negativ. Gerne stelle ich auch den Organizer dann bereit.

Danke und beste Grüße, Peter
Peter schrieb am Sonntag, den 26 August 2018 #9
Hallo Werner,

vielen Dank für deine Hilfe. Es lag tatsächlich an der Funktion strtotime().
Ich update jetzt direkt mit englischem Format - also mit 0000-00-00 - und das funktioniert jetzt genau so wie gewollt.

Die Abfrage mit deutschem Format sieht jetzt so aus - vielleicht hilfst anderen...
Habe auch noch eine Abfrage hinzugefügt, damit wenn 00.00.0000 vorhanden ist, dieses Feld einfach leer bleibt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26


$select = $db->query("SELECT .....  
        DATE_FORMAT(`geburtsdatum`,'%d.%m.%Y') AS `geburtsdatum`,
        DATE_FORMAT( from_Days( DATEDIFF( CURDATE( ), `geburtsdatum` ) + 1 ), '%y' ) AS `alter`,......
        FROM .....`
        LEFT JOIN ....        
        ORDER BY ...."); 
$rows = $select->fetchAll(PDO::FETCH_OBJ);

// Ausgabe über eine Foreach-Schleife 
foreach ($rows as $ausgabe) {    

// Leeres Geburtsdatum ausblenden
$gebdatum = $ausgabe->geburtsdatum;
    if ($gebdatum == '00.00.0000') {
    $gebdatum = '';
    }
    
echo '... viele Echos';
echo '<li><b>Geboren am:</b> ' . htmlspecialchars($gebdatum) . '</li>';
echo '<li><b>Alter:</b> ' . htmlspecialchars($ausgabe->alter) . '</li>';
echo '... viele Echos';




Funktioniert prima - Danke.
Werner schrieb am Montag, den 27 August 2018 #10
Danke Peter für deinen hilfreichen Kommentar (Script) 👍
Bis jetzt hatte ich nur DB Einträge in denen das Datum Pflichtangabe war oder es wurde mit NOW() autom. hinzugefügt.