簡體   English   中英

SQL查詢返回錯誤的時間戳

[英]SQL query returns wrong timestamp

我正在研究一個涉及Sever-Sent事件的項目,並使用庫libSSE: https : //github.com/licson0729/libSSE-php

一個事件從數據庫獲取時間戳,對其進行一些處理,然后在數據庫中更新所述時間戳值。 PHP代碼如下所示:

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

require_once('lib/libsse/src/libsse.php');

//create the event handler
class messages extends SSEEvent {

    public function update($messages){
        //send notification data to the user
        return $messages;
    }

    public function check(){
          $sql = mysqli_connect("localhost", "username", "password");
          mysqli_select_db($sql, "db");

          $username = 'name';
          $a = mysqli_query($sql, "SELECT `last_checked` FROM `users` WHERE `name` = '".$username."';");
          $a = mysqli_fetch_row($a);

          mysqli_query($sql, "UPDATE `users` SET `last_checked` = now() WHERE `name` = '".$username."';");

          $b = mysqli_query($sql, "SELECT `last_checked` FROM `users` WHERE `name` = '".$username."';");
          $b = mysqli_fetch_row($b);

          return json_encode($a[0]."---".$b[0]);
    }
}

$sse = new SSE();//create a libSSE instance
//adjust libSSE settings
$sse->exec_limit = 0; //the execution time of the loop in seconds. Default: 600. Set to 0 to allow the script to run as long as possible.
$sse->sleep_time = 5; //The time to sleep after the data has been sent in seconds. Default: 0.5.
$sse->client_reconnect = 2; //the time for the client to reconnect after the connection has lost in seconds. Default: 1.
$sse->keep_alive_time = 10; //The interval of sending a signal to keep the connection alive. Default: 300 seconds.
$sse->addEventListener('messages',new messages());//register your event handler
$sse->start();//start the event loop

它應該將舊值和新值提供給更新函數,然后將數據發送給用戶。 但是,如果數據庫中的值例如為“ 2015-12-16 11:00:00”,而當前時間為“ 2015-12-16 15:11:00”,則會得到以下輸出:“ 2015-12-16 15:11:00 --- 2015-12-16 15:11:00”。

因此,新值是兩次,而不是舊值,然后是新值。

如果我將三個查詢放在單獨的文件中並執行它們,則會得到所需的結果(“ 2015-12-16 11:00:00 --- 2015-12-16 15:10:00”)。 last_checked列的類型為timestamp,默認值為NULL,並且沒有屬性“ on update current timestamp”。

有誰知道為什么在使用SSE時為什么要兩次獲得新的時間戳?

因為timestamp格式僅下降到秒而不是毫秒....並且更新顯然不需要一秒鍾。 嘗試在更新和更新日期查詢之間放置sleep(1)來確認這一點。

     $a = mysqli_query($sql, "SELECT `last_checked` FROM `users` WHERE `name` = '".$username."';");
      $a = mysqli_fetch_row($a);

      mysqli_query($sql, "UPDATE `users` SET `last_checked` = now() WHERE `name` = '".$username."';");

sleep(1); //sleep for 1 second to prove my point

      $b = mysqli_query($sql, "SELECT `last_checked` FROM `users` WHERE `name` = '".$username."';");
      $b = mysqli_fetch_row($b);

      return json_encode($a[0]."---".$b[0]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM