2016-07-27 14 views
0

Es tut mir leid, wenn das schon einmal gefragt wurde oder wenn ich nicht in der Lage bin, es gut zu erklären. Ich habe stundenlang versucht, meinen Kopf um das Problem zu wickeln und ich kann das Problem scheinbar nicht beheben. Der Code funktioniert lokal gut, aber wenn ich ihn auf meinen Server hochlade, scheint es ein Problem zu geben, wie der Server Zeitunterschiede zwischen Server und Client behandelt/prüft. Nicht sicher, wie oder was genau zu denken ist. Mir ist auch bewusst, dass ich Daten falsch in PDO-Anweisungen einfüge, das ist mir im Moment egal. Ich werde das alles zu einem späteren Zeitpunkt aufräumen.Zeit/Datum-Unterschied mit Client und Server?

Der Teil der Anwendung, mit der ich Probleme habe, ist, wenn es eine aktive Sendung überprüft (es ist eine Art Spiel). Ich möchte den Zeitstempel von der Datenbank mit der aktuellen Zeit vergleichen, um zu sehen, ob die Zeit abgelaufen ist. Wenn die Ankunftszeit vorbei ist, möchte ich den Status der Sendung auf "geliefert" setzen und die Daten in eine andere Tabelle namens "Lagerung" hinzufügen.

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"); 
     } 
    } 
    } 

Lassen Sie mich wissen, ob es irgendwelche Informationen gibt, die ich nicht teilen möchte.

+0

Ist Ihre Datenbank auf einem anderen Server gehostet hinzufügen? Wenn ja, wird es auf einem Server mit anderer Zeit/Zeitzone gehostet? –

+0

überprüfen Sie die Zeitzone. – eronax59

+0

Alles ist auf dem gleichen Server, Dateien und Datenbank. Ich weiß nicht, welche Zeitzone es ist, aber wenn man bedenkt, dass der Server in Stockholm ist, nehme ich Europa/Stockholm an. Irgendwelche Ideen, wie man die Server/Datenbank Zeitzone findet? –

Antwort

0

würde die Zeit vom Server bekommen, anstatt die Zeit() Funktion, die Sie Problem lösen.

tun entweder eine separate Abfrage

SELECT NOW() 

oder es auf Ihre vorhandene Abfrage

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

Ich weiß nicht, warum ich nicht daran gedacht habe, aber das hat Wunder gewirkt! Danke PaulF! –

0
Haben Sie versucht, die DateTime Klasse zu verwenden? Vielleicht verhält es sich ähnlich wie man es erwartet hatte ... Hier ist ein Ausschnitt auf, wie es in Ihrem Fall zu verwenden:
<?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

Ich habe versucht, die DateTime-Klasse zu verwenden, obwohl ich es mit GetTimestamp nicht versucht habe. Leider bekomme ich nach dem Versuch das gleiche Ergebnis. Es scheint immer noch, als ob es irgendwie einen Unterschied in der Zeit gibt. Danke für die Antwort. –