PHP/MySQL ange ett värde för tid.

Permalänk
Medlem

PHP/MySQL ange ett värde för tid.

Hej!

Håller på med mitt projekt där jag behöver spara ner ett värde för tid i en databas.
Problemet är att hur jag än vrider och vänder på min kod så verkar jag bara få 0000-00-00 00:00:00 och liknande(!) sparade, antalet nollor och tecknen emellan dem verkar bero på vad jag väljer för data typ, men jag har för tillfället timestamp valt, jag har testat de flesta och värdet som jag försöker sätta in är date("Y-m-d H:i:s"), att printa detta resulterar i te.x. 2012-04-22 13:37:00.
Och jag tycker därför att det borde matcha med valda datatypen?

Hela koden för att sätta in timestampen är:

$time = getdate();
$time = date("Y-m-d H:i:s", strtotime("GMT-2"));
$user_id = $_SESSION['user']['user_id'];

mysql_query("UPDATE users SET user_servertime = $time WHERE user_id = $user_id");

Men detta resulterar alltså bara i nollor som ser ut såhär:

Jag använder wamp om det spelar någon roll, och inställningarna för user_servertime ser ut såhär för tillfället:

Kan någon hjälpa mig att få in ett fungerande värde? Jag ska nämligen läsa av detta och exekvera en/ett par funktion(er) ifall jag har passerat den specifika tiden.

Tack i förhand!
Mvh

Visa signatur

[ i7 8700k | MSI Z370 Krait | 16GB | MSI 3080 Ventus 3X OC ]

Permalänk

Ändra datatyp på "user_servertime" till datetime så ska det fungera.
Timestamp används oftast för att visa när en post i databasen senast är ändrad, då med attributet "on update current_timestamp".

Permalänk

Använd unix timestamp istället för datetime. Mycket enklare att jobba med eftersom det är antalet sekunder sedan 1970, och enkelt att konvertera till vilket format som helst när det ska visas. Du kanske inte alltid vill att det ska skrivas ut i sin helhet (YYYY-MM-DD hh:mm:ss).

I php:

$timestamp = time(); // Unix timestamp $datetime = date("Y-m-d G:i:s"); // Vanligt datetime

När det sedan ska skrivas ut:

$format = "Y-m-d G:i:s"; echo date($format, $timestamp);

Permalänk
Medlem
Skrivet av mel0dy:

Ändra datatyp på "user_servertime" till datetime så ska det fungera.
Timestamp används oftast för att visa när en post i databasen senast är ändrad, då med attributet "on update current_timestamp".

Skrivet av infinity08:

Använd unix timestamp istället för datetime. Mycket enklare att jobba med eftersom det är antalet sekunder sedan 1970, och enkelt att konvertera till vilket format som helst när det ska visas. Du kanske inte alltid vill att det ska skrivas ut i sin helhet (YYYY-MM-DD hh:mm:ss).

I php:

$timestamp = time(); // Unix timestamp $datetime = date("Y-m-d G:i:s"); // Vanligt datetime

När det sedan ska skrivas ut:

$format = "Y-m-d G:i:s"; echo date($format, $timestamp);

Tack för svaren, dessvärre så verkade det inte fungera något utav alternativen :/
Jag testade att ställa om till datetime såhär:

Men fortfarande nollor överallt

Och jag testade unix grejen såhär:
$timestamp = time();
$datetime = date("Y-m-d G:i:s");
$user_id = $_SESSION['user']['user_id'];
mysql_query("UPDATE users SET user_servertime = $datetime WHERE user_id = $user_id");

forfarande en massa nollor

Visa signatur

[ i7 8700k | MSI Z370 Krait | 16GB | MSI 3080 Ventus 3X OC ]

Permalänk
Skrivet av infinity08:

Använd unix timestamp istället för datetime. Mycket enklare att jobba med eftersom det är antalet sekunder sedan 1970, och enkelt att konvertera till vilket format som helst när det ska visas. Du kanske inte alltid vill att det ska skrivas ut i sin helhet (YYYY-MM-DD hh:mm:ss).

Det beror ju på, datetime har också sina fördelar. Man kan tex köra sql-satser som ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)").
Och det är lätt att konvertera till UNIX timestamp ("SELECT UNIX_TIMESTAMP(my_datetime)").
Finns för och nackdelar med båda alternativen, men är man nybörjare borde datetime vara enklast.

Hur blir det om du gör såhär?:
mysql_query("UPDATE users SET user_servertime = NOW() WHERE user_id = $user_id");

Permalänk
Skrivet av SayZk:

Tack för svaren, dessvärre så verkade det inte fungera något utav alternativen :/
Jag testade att ställa om till datetime såhär:
http://i49.tinypic.com/110zj95.png

Men fortfarande nollor överallt

Och jag testade unix grejen såhär:
$timestamp = time();
$datetime = date("Y-m-d G:i:s");
$user_id = $_SESSION['user']['user_id'];
mysql_query("UPDATE users SET user_servertime = $datetime WHERE user_id = $user_id");

forfarande en massa nollor

Nej, alltså så här:

Sätt fälttyp till "bigint" i databasen istället för datetime. Sen i PHP:

$timestamp = time(); $user_id = $_SESSION['user']['user_id']; mysql_query("UPDATE users SET user_servertime = '$timestamp' WHERE user_id = '$user_id'");

Permalänk
Medlem
Skrivet av mel0dy:

Hur blir det om du gör såhär?:
mysql_query("UPDATE users SET user_servertime = NOW() WHERE user_id = $user_id");

Det fungerar, kan man lägga till timmar på detta då? Annars får jag göra en ny rad som innehåller antalet timmar, och kolla dem när man kör funktionen

Visa signatur

[ i7 8700k | MSI Z370 Krait | 16GB | MSI 3080 Ventus 3X OC ]

Permalänk
Skrivet av mel0dy:

Det beror ju på, datetime har också sina fördelar. Man kan tex köra sql-satser som ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)").
Och det är lätt att konvertera till UNIX timestamp ("SELECT UNIX_TIMESTAMP(my_datetime)").
Finns för och nackdelar med båda alternativen, men är man nybörjare borde datetime vara enklast.

Håller inte med faktiskt, även om DATETIME har fördelen att mysql har inbyggda funktioner för det, så är det enormt mycket smidigare att jobba med både i php och mysql. För att lägga på en timme tex är det ju bara $timestamp + 60*60; Och om man jobbar med olika tidszoner eller olika format så är det i princip standard. Tycker inte det är svårare ens för nybörjare

Permalänk
Skrivet av SayZk:

Det fungerar, kan man lägga till timmar på detta då? Annars får jag göra en ny rad som innehåller antalet timmar, och kolla dem när man kör funktionen

Kan tyvärr inte testa nu men typ, NOW() + INTERVAL 2 HOUR.

Permalänk
Medlem
Skrivet av mel0dy:

Det beror ju på, datetime har också sina fördelar. Man kan tex köra sql-satser som ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)").
Och det är lätt att konvertera till UNIX timestamp ("SELECT UNIX_TIMESTAMP(my_datetime)").
Finns för och nackdelar med båda alternativen, men är man nybörjare borde datetime vara enklast.

Hur blir det om du gör såhär?:
mysql_query("UPDATE users SET user_servertime = NOW() WHERE user_id = $user_id");

Skrivet av mel0dy:

Kan tyvärr inte testa nu men typ, NOW() + INTERVAL 2 HOUR.

Det fungerade, tackar Återkommer om jag har fler problem, kan bli ett med javascript

Visa signatur

[ i7 8700k | MSI Z370 Krait | 16GB | MSI 3080 Ventus 3X OC ]

Permalänk
Medlem

Angående datetime/timestamp. Om värdet kommer figurera i olika tidsrelaterade formler är datetime förmodligen bättre av två anledningar: man slipper overhead av att omvandla timestamps till datum, och man låter systemet ta hand om krångligheter som skillnader mellan tidszoner, skottår, daylight saving, veckonumrering och annat bökigt som vi dödliga inte vill bry oss om.

Om man bara vill spara och hämta en punkt i tiden är Unix-time mest effektivt ur både prestanda- och lagringssynpunkt.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Nu så försöker jag jämför om tiden är överstriden igenom följande funktion:

$user_id = $_SESSION['user']['user_id'];
$timeA = mysql_query("SELECT user_servertime FROM users WHERE user_id = $user_id");
$timeB = mysql_fetch_assoc($timeA);
if(date("Y-m-d H:i:s") > $timeB){
return false;
}
else{
return true;
}

Men den ger inte true trots att tiden är ställd 1 dygn framåt :/
Jämför jag med fel när jag väljer date?

Visa signatur

[ i7 8700k | MSI Z370 Krait | 16GB | MSI 3080 Ventus 3X OC ]

Permalänk
Skrivet av SayZk:

Nu så försöker jag jämför om tiden är överstriden igenom följande funktion:

$user_id = $_SESSION['user']['user_id'];
$timeA = mysql_query("SELECT user_servertime FROM users WHERE user_id = $user_id");
$timeB = mysql_fetch_assoc($timeA);
if(date("Y-m-d H:i:s") > $timeB){
return false;
}
else{
return true;
}

Men den ger inte true trots att tiden är ställd 1 dygn framåt :/
Jämför jag med fel när jag väljer date?

Exakt vad jag menade med timestamp vs datetime. Hade det varit timestamps hade du enkelt kunnat jämföra två datum på det sättet, men eftersom du valt datetime måste du först konvertera det till sekunder innan du kan jämföra.

Permalänk
Medlem
Skrivet av infinity08:

Exakt vad jag menade med timestamp vs datetime. Hade det varit timestamps hade du enkelt kunnat jämföra två datum på det sättet, men eftersom du valt datetime måste du först konvertera det till sekunder innan du kan jämföra.

De flesta plattformar har funktioner för att jämföra datum med datum — i .NET kan man exempelvis göra sådana jämförelser mellan DateTimes.

PHP lär ha något liknande i sitt enorma globala funktionsbibliotek, men egentligen tycker jag att detta bör lösas på SQL-sidan. Låt databasen göra jobbet istället!

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Ändra SQL till "SELECT TIMEDIFF('user_servertime', NOW()) AS diff"

Sen:

return ($timeB >= 0) ? true : false;

Borde fungera.
Annars kan du som Teknocide säger jämföra datumen om du använder dig av DateTime istället för date.

Permalänk
Medlem
Skrivet av mel0dy:

Ändra SQL till "SELECT TIMEDIFF('user_servertime', NOW()) AS diff"

Sen:

return ($timeB >= 0) ? true : false;

Borde fungera.
Annars kan du som Teknocide säger jämföra datumen om du använder dig av DateTime istället för date.

Typ som:

$servertime = $_SESSION['user']['user_servertime'];
$timeA = mysql_query("SELECT TIMEDIFF('$servertime', NOW()) AS diff");
return ($timeB >= 0) ? true: false;

eller?

Visa signatur

[ i7 8700k | MSI Z370 Krait | 16GB | MSI 3080 Ventus 3X OC ]

Permalänk
Medlem
Skrivet av SayZk:

Typ som:

$servertime = $_SESSION['user']['user_servertime'];
$timeA = mysql_query("SELECT TIMEDIFF('$servertime', NOW()) AS diff");
return ($timeB >= 0) ? true: false;

eller?

SELECT COUNT(*) FROM users WHERE user_id = $user_id AND NOW() > $user_servertime

Får du tillbaka 1 är dagens datum större än $user_servertime, vid 0 är det mindre eller samma.

Om du får mer än 1 har du en trasig databas.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

De flesta plattformar har funktioner för att jämföra datum med datum — i .NET kan man exempelvis göra sådana jämförelser mellan DateTimes.

PHP lär ha något liknande i sitt enorma globala funktionsbibliotek, men egentligen tycker jag att detta bör lösas på SQL-sidan. Låt databasen göra jobbet istället!

Absolut, PHP5 har funktionen date_diff() http://php.net/manual/en/datetime.diff.php. Men man kan inte jämföra datum på det sättet TS försökte göra i PHP. Det vanliga är som sagt att man först konverterar till sekunder med tex. strtotime() och sen gör beräkningen. Här kan du se lite exempel: http://www.thetricky.net/php/Compare%20dates%20with%20PHP

Permalänk
Medlem
Skrivet av infinity08:

Absolut, PHP5 har funktionen date_diff() http://php.net/manual/en/datetime.diff.php. Men man kan inte jämföra datum på det sättet TS försökte göra i PHP. Det vanliga är som sagt att man först konverterar till sekunder med tex. strtotime() och sen gör beräkningen. Här kan du se lite exempel: http://www.thetricky.net/php/Compare%20dates%20with%20PHP

Intressant. Det verkar inte finnas komparatormetoder på klassen, men det är ju PHP så man blir inte jätteförvånad..

Det mest effektiva borde vara query-lösningen ovan så jag rekommenderar den över efterfiltrering i PHP.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av infinity08:

Absolut, PHP5 har funktionen date_diff() http://php.net/manual/en/datetime.diff.php. Men man kan inte jämföra datum på det sättet TS försökte göra i PHP. Det vanliga är som sagt att man först konverterar till sekunder med tex. strtotime() och sen gör beräkningen. Här kan du se lite exempel: http://www.thetricky.net/php/Compare%20dates%20with%20PHP

Note:
As of PHP 5.2.2, DateTime objects can be compared using comparison operators.
<?php
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>

Permalänk
Skrivet av mel0dy:

Note:
As of PHP 5.2.2, DateTime objects can be compared using comparison operators.
<?php
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>

Ja? Var ju precis det jag skrev, du har tillochmed citerat mitt inlägg. Men det förutsätter att man använder objektet DateTime vilket TS inte gjorde.