php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 12-06-2007, 11:51
andi234
 Newbie
Links : Onlinestatus : andi234 ist offline
Registriert seit: Jul 2006
Beiträge: 25
andi234 ist zur Zeit noch ein unbeschriebenes Blatt
Standard Problem bei Datumsvergleich

Hallo,

ich möchte ein Feld "date" aus einer MySQL-Datenbank (Typ: TIMESTAMP) mit der aktuellen Uhrzeit vergleichen

PHP-Code:
  if ($row->date mktime())
     {
        echo 
"Zeitpunkt in Datenbank liegt in der Vergangenheit";
     }
     else     
     {
        echo 
"Zeitpunkt in Datenbank liegt in der Zukunft;
     } 
Leider funktioniert es nicht, so wie ich es mache. Ich habe mir zum Test die Daten ausgeben lassen und bekomme für heute

12:55 Uhr den TIMESTAMP 1188823442 ausgegeben (date-Feld)
und für
12:44 Uhr den TIMESTAMP 1181641442 (aktuelle Uhrzeit)

Als Ausgabe hab ich dann "Zeitpunkt liegt in der Vergangenheit" bekommen, was ja nicht stimmt.

Kann mir jemand sagen, was ich falsch mache?

Danke, Andi
Mit Zitat antworten
  #2 (permalink)  
Alt 12-06-2007, 11:53
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Der Mysql-Timestamp ist anders aufgebaut als der normale Unix-Timestamp. Du kannst ihn beim Auslesen umwandeln.
PHP-Code:
SELECT UNIX_TIMESTAMP(datum) AS datum ... 
__________________
ich glaube
Mit Zitat antworten
  #3 (permalink)  
Alt 12-06-2007, 12:17
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Und die Zeitstempel in der DB sind mit Sicherheit UNIX_TIMESTAMP und keine MySql Date Fields ?
Wenn ja: Warum lässt du dann nicht die DB die Auswahl machen
PHP-Code:
//Zukunft
$sql "SELECT * FROM table WHERE date > UNIX_TIMESTAMP(now())";
//Vergangenheit
$sql "SELECT * FROM table WHERE date < UNIX_TIMESTAMP(now())"
Mit Zitat antworten
  #4 (permalink)  
Alt 12-06-2007, 12:22
andi234
 Newbie
Links : Onlinestatus : andi234 ist offline
Registriert seit: Jul 2006
Beiträge: 25
andi234 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@jahlives:

In meinem Programm sollen nur Datensätze geändert werden dürfen, deren Datumswert im date-Feld noch in der Zukunft liegt. Deshalb zeige ich über meine SQL-Abfrage (genauso wie Du es vorgeschlagen hast) nur die Datensätze an, die bearbeitet werden dürfen. Um aber zu vermeiden, dass jemand die zu bearbeitenden Datensätze anzeigen lässt, dann etwas wartet (bis der Datensatz in der Vergangenheit liegt) und dann erst auf OK klickt, möchte ich per PHP nochmal eine zusätzliche Überprüfung durchführen, bevor ich die Daten in die DB schreibe.
Mit Zitat antworten
  #5 (permalink)  
Alt 12-06-2007, 12:38
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
...dann etwas wartet (bis der Datensatz in der Vergangenheit liegt) und dann erst auf OK klickt, möchte ich per PHP nochmal eine zusätzliche Überprüfung durchführen, bevor ich die Daten in die DB schreibe.
Dann müsstest du beim Klick auf Okay noch irgendeine MySql Referenz für den Datensatz übertragen (z.B. die MySql ID). Vor dem Eintragen rufst du das date für diesen Datensatz mittels einer Query ab
PHP-Code:
$sql "SELECT date FROM table WHERE date > UNIX_TIMESTAMP(now()) and id=".mysql_real_escape_string($_POST['id']); 
Wenn du kein Resultat kriegst auf diese Anfrage, dann weisst du, dass das Datum nun in der Vergangenheit liegt
Mit Zitat antworten
  #6 (permalink)  
Alt 12-06-2007, 12:39
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von jahlives
Vor dem Eintragen rufst du das date für diesen Datensatz mittels einer Query ab
Warum nicht einfach gleich das UPDATE machen - und da neben der ID des Datensatzes als Auswahledingung auch noch unterbringen, dass dessen Datum größer als NOW() sein muss?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #7 (permalink)  
Alt 12-06-2007, 12:43
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Warum nicht einfach gleich das UPDATE machen...
Best Practice
Mit Zitat antworten
  #8 (permalink)  
Alt 12-06-2007, 15:20
andi234
 Newbie
Links : Onlinestatus : andi234 ist offline
Registriert seit: Jul 2006
Beiträge: 25
andi234 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Gleich das UPDATE zu machen funktioniert leider nicht. Ich möchte ja dem Benutzer ausgewählte Datensätze zur Sichtung und zum Bearbeiten zur Verfügung stellen (eben nur die, die "noch in der Zeit" sind) und sie dann nach der Änderung Speichern.

Deshalb hab ich es jetzt mit

PHP-Code:
SELECT DISTINCT UNIX_TIMESTAMPspieldatum ) AS spieldatumSpiele.spielID, ...

FROM ... 

WHERE spieldatum UNIX_TIMESTAMPnow( ) ) 
versucht, bekomme aber um 16:20h Serverzeit folgende Datensätze ausgegeben:

2007-06-12 18:22:57
2007-06-12 13:55:45
2007-06-11 14:21:35

Irgendwas kann da nicht stimmen..! Hab den Code jetzt ohne PHP direkt in meine DB eingegeben.

Was mir komisch vorkam: Ich habe als MySQL-Feld TIMESTAMP verwendet. Wenn ich jetzt eine Zeit testweise ändern möchte, lässt mich mein phpMyAdmin das zunächst nicht. Erst wenn ich die Funktion "NOW" (als Zusatzeinstellung für mein Datenbankfeld) entferne, kann ich meine Uhrzeit ändern. Sie wird mir dann auch richtig angezeigt, also denke ich, dass das wohl nichts zu bedeuten hat, aber ich fand es nur komisch, dass dieses "NOW" als Funktion immer wieder erscheint, auch wenn ich es nie ausgewählt habe.

Geändert von andi234 (12-06-2007 um 15:24 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 12-06-2007, 15:28
jahlives
 Master
Links : Onlinestatus : jahlives ist offline
Registriert seit: Jun 2004
Ort: Hooker in Kernel
Beiträge: 8.279
jahlives ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Gleich das UPDATE zu machen funktioniert leider nicht
Dann haste was falsch gemacht Das Update kommt natürlich erst zum Zuge, wenn der User seine Änderungen an dein Script schickt
Mit Zitat antworten
  #10 (permalink)  
Alt 12-06-2007, 15:29
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von andi234
Gleich das UPDATE zu machen funktioniert leider nicht.
Du hast nicht verstanden, wie's gemeint war.

Dass du zunächst mal einen SELECT brauchst, um die Daten darzustellen, ist natürlich klar.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #11 (permalink)  
Alt 12-06-2007, 15:31
andi234
 Newbie
Links : Onlinestatus : andi234 ist offline
Registriert seit: Jul 2006
Beiträge: 25
andi234 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Achso, dann hab ich euch falsch verstanden, sorry. Dann würde das mit dem Update natürlich gehen. Trotzdem besteht mein Problem von oben weiterhin. Ich möchte ja die zu ändernden Daten erstmal anzeigen lassen und da stoß ich dann auf das oben beschriebene Problem, dass sowohl Datensätze VOR und NACH der aktuellen Zeit angezeigt werden.

Beim Schreiben in die DB kann ich ja dann tatsächlich beim UPDATE-Statement eine Datums-Einschränkung vornehmen, da hast Du recht.
Mit Zitat antworten
  #12 (permalink)  
Alt 12-06-2007, 15:35
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wenn es denn eine Mysql-Timestampspalte ist, dann ist das mit dem UNIX_TIMESTAMP beim Auslesen richtig, beim Vergleichen mit NOW() überflüssig / verkehrt - so schlau ist MySQL schon, dass es die eigenen Formate mit NOW() vergleichen kann. Also

WHERE spieldatum > NOW().

Das was du sonst meinst, ist wohl "on update current timestamp" - diese Spalte bekommt ja bei jeder Änderung automatisch den Timestamp der letzten Änderung, sofern nichts anderes angegeben wurde. Das passiert normalerweise mit der ersten Timestamp-Spalte.

Quick and Dirty: Eine Timestampspalte "lastchanged" oder so vor deiner einfügen, die bekommt dann das "on update current timestamp".
__________________
ich glaube
Mit Zitat antworten
  #13 (permalink)  
Alt 12-06-2007, 15:36
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von andi234
Ich habe als MySQL-Feld TIMESTAMP verwendet.
Und du hast, trotz Hinweis darauf, noch nicht verstanden, dass das etwas vollkommen anderes als ein Unix Timestamp darstellt.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #14 (permalink)  
Alt 12-06-2007, 15:43
andi234
 Newbie
Links : Onlinestatus : andi234 ist offline
Registriert seit: Jul 2006
Beiträge: 25
andi234 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von wahsaga
Und du hast, trotz Hinweis darauf, noch nicht verstanden, dass das etwas vollkommen anderes als ein Unix Timestamp darstellt.
Aber eben deswegen wandle ich das Feld doch über

PHP-Code:
SELECT UNIX_TIMESTAMP(datum) AS datum ... 
in einen UNIX_TIMESTAMP um. Und da NOW() auch ein UNIX-TIMESTAMP ist, sollte das doch ein gültiger Vergleich sein, oder nicht?
Mit Zitat antworten
  #15 (permalink)  
Alt 12-06-2007, 15:44
ministry
 PHP Junior
Links : Onlinestatus : ministry ist offline
Registriert seit: Jun 2006
Ort: KI / KA
Beiträge: 965
ministry ist zur Zeit noch ein unbeschriebenes Blatt
Standard

*räusper*

Nein, NOW() ist eine SQL Funktion.
__________________
ich glaube
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:11 Uhr.