簡體   English   中英

使用php pdo獲取當前的在線用戶

[英]Get Currently online users with php pdo

我想借助他們的上次登錄時間來吸引當前在線用戶。 我在php中的時區是“ Asia / Karachi”。

到目前為止我嘗試過的是:

$stmt = $db_con->prepare("SELECT COUNT(*) AS id 
                        FROM users 
                        WHERE last_login_time > DATE_SUB(NOW(), INTERVAL 5 MINUTE)");
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$total_rows = $row['id'];
echo total_rows;

登錄過程php:

$login_time = date('y-m-d h:i:s');
$stmt =$db_con->prepare("UPDATE users SET last_login_time='".$login_time."',last_login_ip='".$login_ip."' WHERE email='".$user_email."'");
$stmt->execute();

SQL表:

在此處輸入圖片說明

問題:我想在我的php文件中顯示在線用戶,即使我的上次登錄時間小於5分鍾,也總是有數字0。但是當我將INTERVAL 5 MINUTE更改為INTERVAL 50000 MINUTE時,它顯示了在線數量用戶。 我已經嘗試了很多,但沒有任何進展!

請參閱底部的“更新”:

相信您的問題是基於與您的PHP使用不同時區的MySQL。 如果您通過PHP進行的MySQL連接不是 localhost那么幾乎可以肯定是這樣

但是,即使您使用localhost ,您也可能會以某種方式將MySQL設置為與PHP系統使用不同的時區。

所以首先 閱讀這篇文章以獲取MySQL的當前時區,並輸出Hours / Minutes結果:

SELECT TIMEP_FORMAT(TIMEDIFF(NOW(), UTC_TIMESTAMP), '%H%i') as MySQLTime

並將其與從date_default_timezone_get()檢索到的PHP時區值以及您的PHP系統時間進行比較:

print date("r");

比較並發現這些時間值不同后,請在此處使用此答案調整MySQL時區。

在PHP中:

 <?php define('TIMEZONE', 'Europe/Paris'); date_default_timezone_set(TIMEZONE); 

對於MySQL:

 <?php $now = new DateTime(); $mins = $now->getOffset() / 60; $sgn = ($mins < 0 ? -1 : 1); $mins = abs($mins); $hrs = floor($mins / 60); $mins -= $hrs * 60; $offset = sprintf('%+d:%02d', $hrs*$sgn, $mins); //Your DB Connection - sample $db = new PDO('mysql:host=localhost;dbname=test', 'dbuser', 'dbpassword'); $db->exec("SET time_zone='$offset';"); 

更新:

我在php中的時區是“ Asia / Karachi”。

這是你的問題。 您的MySQL使用的是UTC,而您的PHP使用的是“亞洲/卡拉奇”。

因此,假設您希望保留PHP時區並將此時區應用於MySQL,則需要使用此出色答案設置MySQL時區。

如果您不能使用上面鏈接中概述的核心方法,則可以在腳本執行時使用PDO進行此操作:

$pdo = new PDO('mysql:host=localhost;dbname=exampletable', 'user', 
       'pass', [PDO::MYSQL_ATTR_INIT_COMMAND =>"SET time_zone = 'Asia/Karachi'"]);

您將需要手動更新數據庫中已設置的所有時間戳,但是添加的新時間戳將添加到正確的時區中。

這很可能是因為您使用Asia / Karachi作為PHP中的默認時區,但是數據庫默認為UTC。 最好在MySql和PHP中都使用UTC,並且只使用本地時區進行顯示。

如果您必須將日期存儲在亞洲/卡拉奇,則有幾種選擇。 一種方法是將MySql時區設置為Asia / Karachi。 另一種方法是在PHP中執行日期算術。 因此,您可以這樣做:

$five_min_ago = date('Y-m-d H:i:s', strtotime('-5 minutes'));  

$stmt = $db_con->prepare("
    SELECT COUNT(*) AS id FROM users 
    WHERE last_login_time > :five_min_ago");   

$stmt ->execute([':five_min_ago' => $five_min_ago]);

還請注意您的日期格式字符串,使用大寫的YH

暫無
暫無

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

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