2016-07-27 3 views
0

Прошу прощения, если это было задано раньше или я не могу объяснить в отличной форме. Я потратил часы, пытаясь обернуть голову вокруг проблемы, и я просто не могу исправить эту проблему. Код работает нормально локально, но когда я загружаю его на свой сервер, похоже, есть какая-то проблема с тем, как сервер обрабатывает/проверяет разницу во времени между сервером и клиентом. Не уверен точно, как и что думать. Я также знаю, что неправильно вставляю данные в инструкции 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"); 
     } 
    } 
    } 

Сообщите мне, если есть какая-либо информация, которую мне не хватает, чтобы поделиться.

+0

размещается база данных на другом сервере? Если да, то он размещен на сервере с разным временем/часовым поясом? –

+0

проверить часовой пояс. – eronax59

+0

Все находится на одном сервере, файлах и базе данных. Я не знаю, что это за часовой пояс, но, учитывая, что сервер находится в Стокгольме, я беру на себя Европу/Стокгольм. Любые идеи о том, как узнать часовой пояс сервера/базы данных? –

ответ

0

Would получать время с сервера, а не с помощью функции времени() решать вам проблему.

Либо сделать отдельный запрос

SELECT NOW() 

или добавить его в существующий запрос

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

Я не знаю, почему я не думал об этом, но это сработало чудеса! Спасибо, PaulF! –

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... 
      } 
     } 
+0

Я пробовал использовать класс DateTime, хотя я не пробовал его с getTimestamp. К сожалению, после того, как я попробовал, я получил тот же результат. По-прежнему кажется, что есть какая-то разница во времени. Спасибо за ответ, хотя. –