与客户端和服务器的时间/日期差异?

时间:2016-07-27 12:00:57

标签: php mysql

如果之前有人问过这个问题,或者我无法以很好的方式解释,我很抱歉。我花了好几个小时试图解决这个问题,我似乎无法解决这个问题。代码在本地工作正常,但是当我将其上传到我的服务器时,服务器如何处理/检查服务器和客户端之间的时间差异似乎存在某种问题。不确定如何或如何思考。我也知道我正在错误地将数据插入到pdo语句中,我现在不关心这一点。我稍后会整理所有这些。

我遇到问题的应用程序部分是检查活动货件时(这是一种游戏)。我想比较数据库中的时间戳和当前时间,看看时间是否已经过去。如果到货时间已过,那么我想将货件的状态设置为“已交货”,并将数据添加到另一个名为“存储”的表中。

function check_active_shipment(){
    $pdo = pdo();
    $username = $_SESSION['username'];
    $statement = $pdo->prepare("SELECT * FROM shipments WHERE username LIKE '$username' AND status LIKE 'active' LIMIT 1");
    $statement->execute();
    $rows = $statement->fetch();
    $id = $rows['id'];

    if($rows['type'] == "purchase"){
      if(time() >= strtotime($rows['arrival'])){
        $statement = $pdo->prepare("UPDATE shipments SET status='delivered' WHERE id LIKE '$id'");
        $statement->execute();

        $statement = $pdo->prepare("INSERT INTO storage (username, crate_type_id, quantity) VALUES (?, ?, ?)");
        $statement->bindParam(1, $username);
        $statement->bindParam(2, $rows['crate_type_id']);
        $statement->bindParam(3, $rows['quantity']);
        $statement->execute();
        //header("location:index.php");
      }
    }
    else if($rows['type'] == "sale"){
      if(time() >= strtotime($rows['arrival'])){
        $statement = $pdo->prepare("UPDATE shipments SET status='delivered' WHERE id LIKE ?");
        $statement->bindParam(1, $id);
        $statement->execute();

        $statement = $pdo->prepare("SELECT cash FROM users WHERE username LIKE ?");
        $statement->bindParam(1, $username);
        $statement->execute();
        $user = $statement->fetch();
        $cash = $user['cash'] + $rows['value'];

        $statement = $pdo->prepare("UPDATE users SET cash=?");
        $statement->bindParam(1, $cash);
        $statement->execute();
        //header("location:index.php");
      }
    }
  }

如果有任何我想要分享的信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用DateTime课程?也许它的行为与你预期的一样......以下是关于如何在你的案例中使用它的片段:
    <?php
        // ...SOME CODE...
        if($rows['type'] == "purchase"){
            // TRY USING DateTime CLASS
            $arrival    = new DateTime($rows['arrival']);
            $arrivalTS  = $arrival->getTimestamp();

            if(time() >= $arrivalTS){
                // REST OF THE CODE...
            }

        }else if($rows['type'] == "sale") {
            // TRY USING DateTime CLASS AGAIN
            $arrival    = new DateTime($rows['arrival']);
            $arrivalTS  = $arrival->getTimestamp();

            if (time() >= $arrivalTS) {
                // REST OF THE CODE...
            }
        }

答案 1 :(得分:0)

从服务器获取时间,而不是使用time()函数解决您的问题。

要么单独进行查询

SELECT NOW() 

或将其添加到现有查询

SELECT *, NOW() as curtime FROM shipments WHERE .....