PHP - MYSQL Timestamp mit DATETIME Timestamp vergleichen?
Hallo,
ich arbeite momentan an einer Anzeige, ob ein Nutzer eingeloggt oder offline ist. Dazu trage ich bei "jedem" Seitenaufruf den aktuellen Timestamp in eine MYSQL Datenbank bei dem User ein. Dadurch sieht man, wann er zuletzt aktiv ist. Dabei gibt es auch keinerlei Probleme.
Nun muss ich allerdings prüfen, ob der Timestamp mehr als fünf Minuten von der aktuellen Zeit abweicht. Sollte der Abstand zwischen dem Timestamp und der aktuellen Zeit geringer als fünf Minuten sein, ist er natürlich online und sonst offline.
Wisst ihr, wie ich das Problem lösen kann und sozusagen den MYSQL Timestamp mit dem DATETIME Timestamp vergleichen kann? Die Spalte in der MYSQL Tabelle besitzt im Übringen das Format DATETIME.
Nun entweder vergleichst du das direkt im SQL-Query und prüfst im PHP-Script ob du ein Resultat erhalten hast, oder du lässt dir die letzte Onlinezeit des Benutzers von mySQL in einen Unix-Timestamp umwandeln, welchen du anschließend mit time() vergleichst.
Natürlich gibt es auch noch die Möglichkeit, das von mySQL zurückgegebene Datum im PHP-Script zu verarbeiten, weil die Datenbankabfrage aber die eindeutig bessere Lösung ist, solltest du diese vorziehen. mySQL stellt dir dazu jedenfalls einige Funktionen zur Verfügung, erstens UNIX_TIMESTAMP() und weiter eventuell noch FROM_UNIXTIME(), TIMEDIFF(), NOW() und DATE_SUB().
FROM_UNIXTIME() wandelt einen Unix-Timestamp in ein von mySQL verstehbares Datums- und Zeitformat um, mit welchem du im Query selbst rechnen kannst. TIMEDIFF() kann die Zeitdifferenz zwischen zwei Datum- & Zeitwerten berechnen, beide müssen aber im selben Format vorliegen. NOW() gibt die aktuelle Zeit im Standardformat von DATETIME aus. DATE_SUB() zieht von einem Datums- & Zeitwert etwas ab.
Mit all diesen Zeitfunktionen kannst du dir direkt ein SQL-Query basteln, welches dir die Differenz zwischen zwei Zeitwerten berechnet und abhängig von einer WHERE-Klausel entscheidet, ob die von dir erwarteten 5 Minuten überschritten sind oder nicht.
Die einfachere, weil deutlich unkompliziertere, Lösung wäre aber die direkte Berechnung im PHP-Script, dazu musst du das Query nur ein wenig umwandeln und schon erhältst du statt einem DATETIME-Format einen Unix-Timestamp. Danach musst du diesen nur noch mit time() vergleichen.
- Code: Alles auswählen
SELECT UNIX_TIMESTAMP(letzte_aktivitaet_aus_db) AS letzte_aktivitaet FROM tabelle WHERE userid="123"
if($db['letzte_aktivitaet']+300>time()) {
// zeit ist innerhalb 5 minuten
} else {
// der benutzer war inaktiv (mehr als 5 minuten
// seit dem letzten Seitenaufruf)
}
Würde es ebenfalls funktionieren, wenn man einfach die Spalte ausliest, den Wert mit 300 addiert und dann prüft, ob dieser größer als der Wert für die aktuelle Zeit ist (time())? Oder braucht man dafür einen UNIX_TIMESTAMP? Wenn ja, was bedeutet/bewirkt dieser bei einer Abfrage?
Ich habe es einmal so probiert, doch leider gibt er mir bei "jedem" Benutzer den Status "offline" aus. Weißt du, wo mein Fehler liegen könnte?
- Code: Alles auswählen
$abfrage = "SELECT UNIX_TIMESTAMP(lastaction) FROM memberlist WHERE id='$id'";
$ergebnis = mysql_query($abfrage) OR die (mysql_error());
if(($row->lastaction+300)>time()) {
echo "Online";
} else {
echo "offline";
}
Ich habe es jetzt hin bekommen. Für alle, die das selbe oder ein ähnliches Problem habe, hier noch einmal die Lösung, wie ich das Problem lösen konnte:
- Code: Alles auswählen
$abfrage = "SELECT id FROM `memberlist` WHERE `lastaction` > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$ergebnis = mysql_query($abfrage) OR die (mysql_error());
while($row = mysql_fetch_object($ergebnis)){
if($row->id == $id) {
echo "Online";
} else {
echo "offline";
}
}
Mir ist gerade ein Bug aufgefallen. Da else bei dem Durchlauf einer Datenbank eigentlich immer true liefern müsste, da auch die id abweichen wird, empfehle ich es lieber mit zwei Abfragen zu lösen:
- Code: Alles auswählen
$abfrage = "SELECT id FROM `memberlist` WHERE `lastaction` > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$ergebnis = mysql_query($abfrage) OR die (mysql_error());
while($row = mysql_fetch_object($ergebnis)){
if($row->id == $id) {
echo "<font face='Arial' color='#008000'><span style='font-size: 11pt'><b>$firstname $lastname ist online.</b></font>";
}
}
$abfrage = "SELECT id FROM `memberlist` WHERE `lastaction` < DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$ergebnis = mysql_query($abfrage) OR die (mysql_error());
while($row = mysql_fetch_object($ergebnis)){
if($row->id == $id) {
echo "<font face='Arial' color='#CC0000'><span style='font-size: 11pt'><b>$firstname $lastname ist offline.</b></font>";
}
}
Dieser Code sollte jetzt einwandfrei dafür funktioniert. Natürlich müssen die Tabellennamen und Spaltennamen bei euch noch angepasst werden.
Link dieser Seite https://www.talkteria.de/forum/topic-140461.html
Ähnliche Themen
Weitere interessante Themen
- Schöne Blatt Pflanze für die Wohnung 1027mal aufgerufen · 1 Antworten · Autor: Rubbelfeld · Letzter Beitrag von Verbena
Forum: Garten & Pflanzen
- Schöne Blatt Pflanze für die Wohnung
- Palmen für die Wohnung 2987mal aufgerufen · 1 Antworten · Autor: Dreddi · Letzter Beitrag von Verbena
Forum: Garten & Pflanzen
- Palmen für die Wohnung
- Was kann man gegen eine tropfende Birkenfeige tun? 1840mal aufgerufen · 1 Antworten · Autor: helgak62 · Letzter Beitrag von Verbena
Forum: Garten & Pflanzen
- Was kann man gegen eine tropfende Birkenfeige tun?
- Verträgt Banane chemisches Anti Insekten Mittel? 1336mal aufgerufen · 1 Antworten · Autor: Wawa666 · Letzter Beitrag von Verbena
Forum: Garten & Pflanzen
- Verträgt Banane chemisches Anti Insekten Mittel?