Zur Navigation

datum in tag, monat und jahr zerlegen

1 andehrl

hallo jörg,
du hast mir im beitrag "Verwendung von ">=" in Datenbankabfrage" Seite 3 gezeigt wie ich die menufelder tag, monat und jahr zusammenfasse so das sie in der datenbank als datums-typ in einem feld gespeichert werden. ich habe jetzt eine seite erstellt in der der nutzer seine in der datenbank hinterlegeten daten bearbeiten kann. die daten werden beim hochladen der seite automatisch in den menu- und textfeldern eingelesen so das der nutzer sie bequem ändern oder belassen kann wie sie sind. bei den feldern tag, monat und jahr weiss ich allerdings nicht wie ich das machen soll, da ich das datum wieder in seine einzelteile zerlegen muss und entsprechend zuordnen.
der code zur eingabe der veränderten daten in die datenbank schaut so aus:

if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form1")) {
  $updateSQL = sprintf("UPDATE Eingabe SET abfahrtsort=%s, datum='%04d-%02d-%02d', zielort=%s, zeit='%02d:%02d', hinfahrtladeflaeche=%s, hilfeeinausladen=%s, rueckfahrt=%s, rueckfahrtladeflaeche=%s, beschreibung=%s, preis=%s, marke=%s, model=%s, laderaumhoehe=%s, laderaumbreite=%s, laderaumlaenge=%s, laderaumvolumen=%s, treibstoff=%s, getriebe=%s, tempo=%s, nutzername=%s, mail=%s, handy=%s, tel=%s WHERE id=%s",
                       GetSQLValueString($_POST['abfahrtsort'], "text"),
                       GetSQLValueString($_POST['jahr'], "int"),
                       GetSQLValueString($_POST['monat'], "int"),
                       GetSQLValueString($_POST['tag'], "int"),
                       GetSQLValueString($_POST['zielort'], "text"),
                       GetSQLValueString($_POST['stunde'], "int"),
                       GetSQLValueString($_POST['minute'], "int"),...
funktioniert auch gut soweit.


um die daten des gewählten datensatzes automatisch in ein menue-feld einzulesen schreibt dreamweaver diesen code (am beispiel des feldes rueckfahrt):

<select name="rueckfahrt" id="rueckfahrt">
            <option selected="selected" value="-" <?php if (!(strcmp("-", $row_R2['rueckfahrt']))) {echo "selected=\"selected\"";} ?>>-</option>
            <option value="Ja" <?php if (!(strcmp("Ja", $row_R2['rueckfahrt']))) {echo "selected=\"selected\"";} ?>>Ja</option>
            <option value="Nein" <?php if (!(strcmp("Nein", $row_R2['rueckfahrt']))) {echo "selected=\"selected\"";} ?>>Nein</option>
            <?php
do {  
?>
            <option value="<?php echo $row_R2['rueckfahrt']?>"<?php if (!(strcmp($row_R2['rueckfahrt'], $row_R2['rueckfahrt']))) {echo "selected=\"selected\"";} ?>><?php echo $row_R2['rueckfahrt']?></option>
            <?php
} while ($row_R2 = mysql_fetch_assoc($R2));
  $rows = mysql_num_rows($R2);
  if($rows > 0) {
      mysql_data_seek($R2, 0);
      $row_R2 = mysql_fetch_assoc($R2);
  }
?>
          </select>

kann ich das datum wieder zerlegen und ähnlich diesem code in die tag, monat und jahr felder einlesen?

26.10.2010 18:24

2 Jörg Kruse

MySQL bietet Funktionen, mit denen man Teile des Datums extrahieren kann:

http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html

Für deinen Fall eignen sich YEAR(), MONTH() und DAY(). Die SQL-Abfrage könnte in etwa so ausschauen:

SELECT
YEAR(datum) AS jahr,
MONTH(datum) AS monat,
DAY(datum) AS tag
/* weitere Datenfelder */
FROM Eingabe

Die Werte kannst du dann weiter unten als $row_R2['tag'] etc. aufnehmen.

26.10.2010 20:23

3 andehrl

hab den code jetzt verändert. bekomme dann diese fehlermeldung:


Warning: sprintf() [function.sprintf]: Too few arguments in /is/htdocs/wp10548565_XUUKREW8G9/www/s6eAngeboteBearbeiten.php on line 113
Query was empty


zeile 113 schaut jetzt so aus:

$query_R2 = sprintf("SELECT Eingabe.id, Eingabe.abfahrtsort, Eingabe.zielort, Eingabe.YEAR(datum) AS jahr, Eingabe.MONTH(datum) AS monat, Eingabe.DAY(datum) AS tag, TIME_FORMAT(Eingabe.zeit, '%H:%i') AS zeit_formatiert, IF(Eingabe.zeit = '00:00:00', 1, 0) AS bar, Eingabe.hinfahrtladeflaeche, Eingabe.hilfeeinausladen, Eingabe.rueckfahrt, Eingabe.rueckfahrtladeflaeche, Eingabe.beschreibung, Eingabe.preis, Eingabe.marke, Eingabe.model, Eingabe.laderaumhoehe, Eingabe.laderaumbreite, Eingabe.laderaumlaenge, Eingabe.laderaumvolumen, Eingabe.treibstoff, Eingabe.getriebe, Eingabe.tempo, Eingabe.nutzername, Eingabe.passwort, Eingabe.mail, Eingabe.handy, Eingabe.tel FROM Eingabe  WHERE id = %s", GetSQLValueString($colname_R2, "int"));

26.10.2010 21:32

4 Jörg Kruse

sprintf() versucht diese Formatierungsanweisungen, die sich eigentllich an MySQL richten, zu interpretieren:

TIME_FORMAT(Eingabe.zeit, '%H:%i')

Mit einem zweiten Prozentzeichen können diese maskiert werden:

TIME_FORMAT(Eingabe.zeit, '%%H:%%i')

26.10.2010 21:40

5 andehrl

hab die prozentzeichen eingefügt. bekomme jetzt allerdings diese fehlermeldung:

FUNCTION Eingabe.YEAR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual

26.10.2010 21:44

6 Jörg Kruse

Der Tabellenname muss (wie in den anderen Fällen) vor dem Namen des Datenfeldes angefügt werden - in diesem Fall `datum`:

YEAR(Eingabe.datum) AS jahr

26.10.2010 21:50

7 andehrl

super, jetzt funktioniert es. das kann ich doch bestimmt genau so mit der uhrzeit machen. mir ist nur nicht klar ob ich für das "i" einfach minute schreiben kann oder ob das anderst benannt werden muss? für das "H" nehme ich ja wohl "Hour", also


MINUTE(Eingabe.zeit) AS minute

und

HOUR(Eingabe.zeit) AS stunde



26.10.2010 22:08

8 Jörg Kruse

Ja, die beiden Funktionen sind mit dem Namen auf der von mir verlinkten Dokumentationsseite vo MySQL aufgeführt

26.10.2010 22:48 | geändert: 26.10.2010 22:49

9 andehrl

habs grad schon ausprobiert. funktioniert prima, danke dir :-)

26.10.2010 22:59

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]