Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Wenn ein Datum aktuell oder erreicht ist, sollte in ein DB-Feld geschrieben werden.

Frage Entwicklung PHP

Mitglied: helmuthelmut2000

helmuthelmut2000 (Level 2) - Jetzt verbinden

18.01.2012 um 14:04 Uhr, 4930 Aufrufe, 21 Kommentare

Hallo,

Ich habe eine PHP-Seite und eine MSSQL-DB.
Da gibt es ein Datum Feld (Datetime) wo ein Datum und Uhrzeit reingeschrieben wird.

Jetzt hätte ich gern, das wenn das Datum jetzt mit dem aktuellen Datum übereinstimmt oder abgelaufen ist,
sollte in ein anderes DB-Feld etwas geschrieben werden.

Wie realisiert man das am besten?

Danke.
Mitglied: dark3zz
18.01.2012 um 14:22 Uhr
Mein Vorschlag:

1. Du setzt alles in Variablen.
2. "jedesmal beim aufruf deiner seite" vergleichst du die dann mit Grösser/Kleiner (< >)
3. und agierst dann danach....

bsp:
// variablen setzen
$jetzt = datumFormat mit php. warum habt ihr keine unixtime? viel einfacher zum handlen als date/time, anyway;
$datumsfeld = query zu deiner msssql;


01.
if($jetzt < $datumsfeld
02.
03.
echo "Leider ist das Datum noch nicht überschritten :)"
04.
05.
else 
06.
07.
schreibe in das neue msssql feld etwas; 
08.
}
Bitte warten ..
Mitglied: Arano
18.01.2012 um 15:49 Uhr
Hi

Das kann man auch gleich von der DB erledigen lassen ! (Kenne MSSQL nicht)

Pseudocode:
01.
UPDATE `tabelle` 
02.
   SET `anderesFeld` = 'unbekannter Wert' 
03.
 WHERE `datum` <= NOW() 
04.
   AND `anderesFeld` = NULL
NOW() heißt es in MySQL, für MsSQL müsste es, glaube ich, GETDATE() heißen.

AND `anderesFeld` = NULL ist wichtig, sonst würden natürlich auch alle "alten" Datensätze bearbeitet werden bei denen der Wert schon gesetzt ist. Sonst werden deren Werte immer mit neuen/aktuellen überschrieben - das kann man sich ja auch sparen...


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
18.01.2012 um 22:20 Uhr
Hallo,

Die variante gefällt mir sehr gut und ich hab das mal so versucht.
Bei mir kommt aber folgende Fehlermeldung:

Warning: mssql_query() [function.mssql-query]: message: Falsche Syntax in der Nähe von '00'. (severity 15) in C:\

Meine Datum in der DB werden so gespeichert.

2011-12-29 00:00:00.000

Wo könnte da noch ein Fehler sein?

Danke
Bitte warten ..
Mitglied: Arano
19.01.2012 um 16:56 Uhr
Hm... wie sieht den der Query aus !?
Bitte warten ..
Mitglied: Biber
19.01.2012 um 17:32 Uhr
Moin Arano,

bist du sicher, dass der Vergleich "`WHERE anderesFeld` = NULL" akzeptiert wird?
Wäre nicht ein "WHERE IFNull(`anderesFeld`) oder am lesbarsten "WHERE `anderesFeld` is NULL" angemessener?

Abgesehen davon würde ich die beiden WHERE-Filter umdrehen.

Also statt
01.
UPDATE `tabelle` 
02.
   SET `anderesFeld` = 'unbekannter Wert' 
03.
 WHERE `datum` <= NOW()     
04.
      AND `anderesFeld` is NULL
...lieber so herum..
01.
UPDATE `tabelle` 
02.
   SET `anderesFeld` = 'unbekannter Wert' 
03.
 WHERE `anderesFeld` is NULL  
04.
     AND`datum` <= NOW()   
-> denn im Lauf der Zeit wird sicherlich eine Prüfung auf "`anderesFeld` is NULL" viel selektiver sein (die meisten `anderesFeld` sind ja schon mit Werten gefüllt).
Wird zuerst das Datumsfeld geprüft , dann muss ja jeder Datensatz verglichen werden mit jedesmal dem (volatilen) Wert von NOW().

Das dürfte teurer sein, jedenfalls wenn auf keinem der Felder ein index liegt.

Grüße
Biber
Bitte warten ..
Mitglied: Arano
19.01.2012 um 17:58 Uhr
Hallo Biber,

bist du sicher, dass der Vergleich "`WHERE anderesFeld` = NULL" akzeptiert wird?
Wäre nicht ein "WHERE IFNull(`anderesFeld`) oder am lesbarsten "WHERE `anderesFeld` is NULL" angemessener?
Also ähm, ich denke schon aber sicher bin ich mir jetzt nicht mehr -.-
Also wenn es NULL als Standardwert hat, dann... ach Mist !
Das muss ich mir irgendwann mal genauer anschauen.

Abgesehen davon würde ich die beiden WHERE-Filter umdrehen.
Jetzt wo du es sagst - ich auch :D

"volati":
Zitat von PONS.eu - volatil
vo-la-til ADJ. (lat.)
verdunstend; flüchtig
Das musste ich erst mal nachschlagen.
Also NOW() liefert zwar immer den selben Zeitwert (the time at which the statement began to execute), berechnet ihn aber für jeden Vergleich auf ein neues !?

Das dürfte teurer sein, jedenfalls wenn auf keinem der Felder ein index liegt.
Stimmt.


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
20.01.2012 um 12:35 Uhr
Hallo,

Ich hätte jetzt noch etwas hilfe gebraucht wo genau schreib ich das rein.
Meine Seite schaut jetzt so aus.

01.
$db_link=mssql_connect(MSSQL_HOST,MSSQL_USER,MSSQL_PASS); 
02.
$select=mssql_select_db(MSSQL_DATABASE); 
03.
 
04.
  $res = mssql_query("SELECT *, SUBSTRING(CONVERT(VARCHAR(8), erhalten,4),1,8) AS erhalten, 
05.
                                SUBSTRING(CONVERT(VARCHAR(8), datum,4),1,6) AS datum from Ergebnisse WHERE abt = '2'"); 
06.
  $num = mssql_num_rows($res);
Dann kommt die Tabelle wo mir die ganzen Zeilen angezeigt werden.
01.
echo "<table>"; 
02.
echo '<tr>"; 
03.
echo "<td class='td1 tdcenter'>" . $dsatz["abt"] . "</td>"; 
04.
echo "<td class='td2 tdcenter'>" . $dsatz["datum"] . "</td>"; 
05.
echo "</tr>"; 
06.
echo "</table>";
Dann wird die Seite alle 90sec aufgefrischt mit:

01.
<meta http-equiv="refresh" content="90">
Jetzt kommt da ein Feld dazu das heist markierung und in der db heist das auch markierung.
und alle 90sec oder wenn die Seite aufgerufen wird sollte auch das datum das jetzt in dem Feld datum steht
kontrolliert werden, und wenn es vorbei ist dann sollte in das Feld markierung ein Eintrag geben.

Wo genau schreibe ich den code rein?
Bitte warten ..
Mitglied: Arano
21.01.2012 um 00:23 Uhr
Hi,

Wo genau schreibe ich den code rein?
Na, da es ein Statement ist, muss es natürlich an die Datenbank übergeben werden, damit diese das ausführen kann.
An welcher Stelle, am besten wohl an eine Stelle __bevor__ du die aktualisierten Daten abrufst/brauchst.
ich vermute mal das es zwischen dem DB-Select und deinem erstem Query kommt:
01.
<?php 
02.
$select=mssql_select_db(MSSQL_DATABASE); 
03.
// Aktualisiere Datensatzmarkierungen unter Bedingungen X, Y und Z 
04.
$strQueryUpdTabMarks = "UPDATE `tabelle` 
05.
                           SET `markierung` = 'x' 
06.
                         WHERE `markierung` is NULL  
07.
                           AND `datum` <= NOW()"; 
08.
$bolUpdTabMarks = @mssql_query($strQueryUpdTabMarks); 
09.
if( FALSE===$bolUpdTabMarks
10.
11.
    echo 'Behandle den Fehlerfall'
12.
    // zeige Fehlerseite, was auch immer... 
13.
    exit(); 
14.
15.
 
16.
// Jetzt lese die aktualisierten Daten aus der Datenbank 
17.
$res = mssql_query("SELECT *, SUBSTRING(CONVERT(VARCHAR(8), erhalten,4),1,8) AS erhalten, 
18.
                                SUBSTRING(CONVERT(VARCHAR(8), datum,4),1,6) AS datum from Ergebnisse WHERE abt = '2'"); 
19.
 
20.
// Dein weitere Quelltext 
21.
?>

Schönes Wochenende
~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
22.01.2012 um 13:16 Uhr
Hallo,

Ich bekomme jetzt noch den Fehler:
Behandle den Fehlerfall
und es macht auch noch nix.

Kann man das noch etwas genauer anzeigen lassen, wo der Fehler liegt?

Wie sollte denn das datum Feld in der DB Formatiert sein? date oder datetime?

Und wie sollte es Richtig angelegt sein damit das funktioniert?

Gruß
Helmut
Bitte warten ..
Mitglied: Arano
22.01.2012 um 15:07 Uhr
Moin.

Wie sollte denn das datum Feld in der DB Formatiert sein? date oder datetime?
Das ist natürlich von dem Verwendungszweck abhängig !
Wenn du das Feld als Typ "date" definierst, dann wird z.B. bei allem von Heute die Markierung gesetzt - auch bei denen von heute Abend, denn das Datum ist das gleiche.
Wenn du das Feld aber vom Typ "datetime" definierst, ist das Logischerweise noch von der Uhrzeit abhängig und es wird nur das markiert, was ÄLTER als JETZT ist. Alles was noch in der Zukunft liegt (und sei es nur eine Sekunde) bleibt unberührt.

Jetzt könnte man noch mal überlegen ob "datetime" oder "timestamp"...
"datetime" verbraucht zwar mehr Speicherplatz 8bytes und "timestamp" nur 4bytes dafür kann man den Timestamp schlecht lesen und müsste ihn für die Ausgabe erst formatieren lassen.
"date" wiederum verbraucht nur 3 bytes...
MySQL - Reference: 10.5. Data Type Storage Requirements

Richtiges Wissen darüber habe ich allerdings auch nicht, würde mich dennoch, sofern der Datums-/Zeitwert nicht ausgegeben wird für "timestamp" entscheiden.

Funktionieren sollte es aber mit allen dreien (beachte logische Einschränkungen beim Type "date")

Ich bekomme jetzt noch den Fehler:
Behandle den Fehlerfall
und es macht auch noch nix.
Okay, da liegt wohl noch ein Fehler im Query !
Und das nur "Behandle den Fehlerfall" ausgegeben wird und sonst nichts weiter Passiert haben wir ja so geschrieben (exit();)

Nun, jetzt sollten wir uns, zumindest für den Moment, noch ein paar Zusatzangaben ausgeben lassen, z.B.: Das Query das den Fehler verursacht hat / beteiligt ist und die Fehlermeldung von der Datenbank.
01.
$bolUpdTabMarks = @mssql_query($strQueryUpdTabMarks);  
02.
if( FALSE===$bolUpdTabMarks )  
03.
{  
04.
    echo 'Behandle den Fehlerfall';  
05.
    // zeige Fehlerseite, was auch immer...  
06.
    // +++ 
07.
    echo '<b>Fehlermeldung:</b><br>'.$mssql_error().'<br><br>'
08.
    echo '<b>Query:</b><br><pre>'.$sql.'</pre>'
09.
    exit(); 
10.
} 
Wie gesagt, __nur für den Moment__, den den Benutzer interessieren diese hässlichen Fehlermeldungen nicht - falls er sie überhaupt versteht. ;)
Das exit() ist natürlich auch nicht schön (einfach so "abzuwürgen") aber ein weiterarbeiten, ohne aktualisierte Daten macht vermutlich auch nicht viel Sinn !?


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
22.01.2012 um 17:01 Uhr
Hallo Arano,

Danke erstmal für die gute Erklärung.

Jetzt bekomme ich noch die Fehlermeldung:

1. Behandle den Fehlerfall
2. Notice: Undefined variable: mssql_error in C:\Apache\htdocs\...... .php on line 288
3. Fatal error: Function name must be a string in C:\Apache\htdocs\...... .php on line 288


Gruß
Helmut
Bitte warten ..
Mitglied: Arano
22.01.2012 um 17:18 Uhr
Hi

Hm... ich hätte jetzt etwas andere Ausgaben erwartet, z.B. noch den Query...

Aber hier habe ich z.B. gleich zwei Fehler gemacht:
01.
echo '<b>Fehlermeldung:</b><br>'.$mssql_error().'<br><br>'; 
  1. Sollte es "mssql_error()" heißen (sollte ja ein Funktionsaufruf zur Ausgabe der DB-Fehlermeldung sein), daher die Fehlermeldungen Nr 2 und 3
  2. gibt es kein "mssql_error()" *g* Das hatte ich einfach so von MySQL (mysql_error()) übernommen und abgewandelt.

Schau mal hier nach dem MSSQL Pendant: PHP-Manual - Mssql-Funktionen


Es erfreut mich das du meine Bemühungen annimmst, jedoch... etwas Eigeninitiative deinerseits wäre auch nicht schlecht.
Nächstes mal !


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
22.01.2012 um 17:46 Uhr
Hallo,


echo 'Fehlermeldung:<br>'.mssql_get_last_message().'<br><br>';

Dann bekomm ich die Meldung:


Falsche Syntax in der Nähe von '<'.
Bitte warten ..
Mitglied: Arano
22.01.2012 um 18:15 Uhr
Nun, diese Fehlermeldung bedeutet das etwas in dem Query nicht der Syntax entspricht in der es erwartet wird und das in der Nähe von dem Zeichen '<'.
Wie gesagt, ich habe keine Erfahrungen mit MSSQL.

Außerdem ist das, ohne den tatsächlich verwendeten Query zu sehen, immer etwas wage.
  • Fehler die durchs anpassen an deine Gegebenheiten entstanden sind,
  • Tippfehler
  • vergessene/übersehen Zeichen
  • ...

Alles was ich so noch sehe ist die falsche Funktion "NOW()" die, wie weiter oben schon mal erwähnt, MSDN - GETDATE() heißen sollte.

Allerdings ist das vermutlich nicht der Fehler denn dann müsste in der Fehlermeldung die Rede von den Zeichen "<=" sein, und nicht nur von einem Zeichen beliebig weiter vorn... *think so*


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
22.01.2012 um 20:11 Uhr
Hallo,

Hab ich da ein Fehler beim auslesen vomdatum.

$strQueryUpdTabMarks = "UPDATE Ergebnisse SET markieren = '#555555' WHERE markieren is NULL AND " . $dsatz["datum"] . " <= GETDATE()";

Wenn ich das Probiere mit der Zeile.

echo "" . $dsatz["datum"] . "";

Dann kommt es so raus.

22/jan/2012 0:00

Ist da was nicht Richtig?
Bitte warten ..
Mitglied: Arano
22.01.2012 um 20:34 Uhr
Ohje, schon so spät !?

1. Bei einem UPDATE-Query, kommt nichts raus, höchsten TRUE oder FALSE als Rückgabewerte !
So weiss ich also schon nicht einmal mehr wo du die Zeichenkette "22/jan/2012 0:00" überhaupt her hast !?

2. Hast du da in deinem Query etwas durcheinander gebracht, in der WHERE-Klausel:
01.
... 
02.
WHERE markieren is NULL 
03.
  AND " . $dsatz["datum"] . " <= GETDATE()
Was möchtet du denn nach dem AND vergleichen ?
Im Moment wird irgendein Datum mit dem aktuellem Datums- und Zeitwert verglichen - allerdings hat das überhaupt keinen Bezug auf die Datensätze in der Tabelle.
Und weil der Vergleich höchst wahrscheinlich immer scheitert, wird auch kein Datensatz aktualisiert !
(Noch dazu müsste die Ausgabe der Variabel in dem Query noch in Anführungszeichen stehen)

Du wolltest doch ein Feld der Tabelle vom Type "datetime" mit dem aktuellem Datums-/Zeitwert vergleichen...
also:
01.
... 
02.
AND `datumsFeldDerTabelleVomTypeDATETIME` <= GETDATE()
um alle Datensätze zu treffen, die älter als "jetzt" sind.


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
26.01.2012 um 14:02 Uhr
Hallo Arano,

Jetzt gehts.

Da war mein Fehler, so muss es aussehen:

AND datum <= GETDATE()

Wie schreibt man das wenn ich den Heutigen Tag nicht mit markieren will?
Kann man das an das datum plus einen Tag mit dranschreiben?

Danke.
Bitte warten ..
Mitglied: Arano
26.01.2012 um 17:14 Uhr
Hallo Helmut.

Das dürfte auch kein Problem sein aber zunächst mal etwas anderes.
Ich habe nun das Problem, dass ich nicht genau weiss von welchem Typ dein Feld "datum" ist !
Dem Namen nach würde ich denken das es sich lediglich um ein Feld vom Typ "date" handelt, dann wäre die Lösung eine ganz einfache:
WHERE `date` < GETDATE()
"Datum kleiner als Heute/Jetzt"
Das klappt aber nicht wenn das Feld vom Typ "datetime" ist, denn dann ist ja noch die Zeit mit im Spiel und ein einfaches "ist kleiner als" würde auch auf alles zutreffen das nur eine Sekunde alt ist !

Hier wäre wohl die Überlegung eines neuen Feldnamens angebracht ;)

Einfach einen Tag abziehen klappt allerdings auch nicht den der Zeitwert bliebe erhalten und wir hätten ein "datetime" von gestern __zur jetzigen Zeit__ !
Was wieder zur Folge hätte, das alles was gestern nach der jetzigen Zeit existiert NICHT berücksichtigt würde...
Genau genommen müsstest du dir also ein "datetime" erzeugen, dass das heutige Datum enthält aber den Zeitwert vom Anfang des Tages (00:00:00). Allerdings könnte es auch reichen wenn du nur das Datum hast, das weiss ich jetzt nicht - das muss du mal selber ausprobieren.
Dafür wiederum schau dir mal die Beispiele auf der MSDN - GETDATE() Seite an, da solltest du fündig werden.
MySQL zumindest macht dies mit.


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
26.01.2012 um 21:35 Uhr
Hallo Arano,

Mein datum Feld hat den Typ datetime. Die Datum stehen da alle mit dem Zeitwert 00:00:00.

Mich hätte das mal interessiert ob das überhaupt geht, das mit z.B. 1 Tag dazu Zählen.
Meine Überlegung ist noch ob ich evt. 2Tage vor dem Datum eine Farbe mach und dann 1Tag vorher in eine andere
und dann am Tag wo im datum Feld steht wieder eine andere.

Deshalb wollte ich mal einen Tag dazu Zäheln.

Danke.

Gruß
Helmut
Bitte warten ..
Mitglied: Arano
26.01.2012 um 22:00 Uhr
Hi.

Dein Datum ist vom Typ "datetime" - da bin ich ganz stumpf auch mal von ausgegangen weil das hier im Forum ja so erwähnt wird.
ABER warum ist der Zeitwert bei allen auf 00:00:00 !?
Wenn der IMMER Null Uhr ist, kannst du auch auf Typ "date" wechseln... sofern da nicht eben ein andere Sinn hinter steckt !?

Ja ja, das geht !
Schau doch z.B. noch einmal in die MSDN da hast du auf der linken Seite, eigentlich unübersehbar ;) , die "Datums- und Zeitfunktionen" wie z.B. DATEADD() oder DATEDIFF()


~Arano
Bitte warten ..
Mitglied: helmuthelmut2000
27.01.2012 um 15:00 Uhr
Hallo Arano,

Jetzt hab ich es hinbekommen.
So muß das aussehen:

WHERE DATEADD(day,1,datum) <= GETDATE()

Danke.
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Windows 10
gelöst Windows 10 - Datum und Zeitfehler bei Update (3)

Frage von swisstom zum Thema Windows 10 ...

Outlook & Mail
gelöst Outlook 2013 Von Feld in alten Entwürfen (2)

Frage von Xartor zum Thema Outlook & Mail ...

Windows Userverwaltung
gelöst Datum einer Gruppenmitgliedschaft (1)

Frage von slansky zum Thema Windows Userverwaltung ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...