0

如果 unix 时间戳小于 db 中记录的日期时间并且遇到了一些问题,我试图仅从 db 获取数据。

这是我到目前为止得到的;

date_default_timezone_set("UTC");
$now = date("Y-m-d H:i:s", time());
$timestamp = strtotime($now); 
$timestamp2 = strtotime('-3 days', $timestamp);

$sql = "SELECT g.game_id, UNIX_TIMESTAMP(g.lastdraw)+259200 AS dbtimestamp FROM ".$prefix."_games g 
            INNER JOIN ".$prefix."_gameplayer gp
                ON g.game_id = gp.fk_game_id
            WHERE dbtimestamp < $timestamp2 AND gp.fk_player_id=$currplayer AND g.finished=0";
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
        //if($row['dbtimestamp'] < $timestamp2){
        $thisgameid = $row['game_id'];

        if($thisgameid == 257748){
            echo '<b>GameID: '.$thisgameid.'</b><br>';
        } else {
            echo 'GameID: '.$thisgameid.'<br>';
        }
        echo 'DBtimestamp: '.$row['dbtimestamp'].'<br><br>';
    //}
}

这种方式我没有任何记录。但是,如果我在 sql 查询中删除“dbtimestamp < $timestamp2”并删除“if($row['dbtimestamp'] < $timestamp2){”的结果,一切正常吗?

有什么想法我哪里出错了吗?

提前致谢 :-)

4

3 回答 3

2

当您可以直接在 MySQL 中使用本机日期/时间操作直接执行此操作时,为什么还要搞乱 PHP 时间戳和 MySQL 日期->时间戳值?

SELECT ..
WHERE g.lastdraw < (NOW() - INTERVAL 3 DAY)
于 2012-12-28T15:54:41.247 回答
1

这可能无法直接回答问题。但是,有些事情值得指出,因为太大而无法评论。

以下:

$now = date("Y-m-d H:i:s", time());
$timestamp = strtotime($now); 
$timestamp2 = strtotime('-3 days', $timestamp);

可以改写为:

$timestamp2 = strtotime('-3 days');

此外,MySQL 有几个日期时间函数。使用类似DATE_ADD()的东西而不是类似的东西UNIX_TIMESTAMP(g.lastdraw)+259200

于 2012-12-28T15:56:48.107 回答
0

不仅查询不返回任何行,查询实际上应该抛出如下错误:

Error Code: 1054
Unknown column 'dbtimestamp' in 'where clause'

dbtimestampSQL 语句的问题在于,在语句的 WHERE 子句中引用 SELECT 列表(例如 )中表达式的别名是无效的。

(即使它是有效的,您也不希望在谓词中使用该表达式。您希望您的谓词位于lastdraw用于派生该表达式的裸列上。)

要调试 SQL 语句的问题,规范模式是回显包含 SQL 语句的字符串的内容($sql在您的情况下),然后通过在另一个环境(例如 mysql 命令行客户端)中运行该语句来测试该语句。


一种“修复”是将dbtimestampWHERE 子句中的别名替换为实际表达式。例如

WHERE UNIX_TIMESTAMP(g.lastdraw)+259200 < $timestamp2 

但是......虽然这会让你绕过 1054 错误,但这并不是真正的正确解决方案。为了性能,你真的不想在左边做加法。您最好使用以下形式的谓词:

WHERE UNIX_TIMESTAMP(g.lastdraw) < $timestamp2 - 259200

请注意,如果lastdraw列不是 TIMESTAMP 数据类型,那么您还希望避免调用左侧的 UNIX_TIMESTAMP 函数,而是将右侧包装在 FROM_UNIXTIME 函数中。

WHERE g.lastdraw < FROM_UNIXTIME( expr )
于 2012-12-28T17:12:45.500 回答