2016-07-27 8 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

うサーバーから時刻を取得するのではなく、時間を使用して()関数は、あなたの問題を解決します。

別のクエリ

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で試してみませんでした。残念なことに、それを試した後も同じ結果が得られます。何とか時間差があるようです。しかし、返事をありがとう。 –