2015-12-21 84 views
1

我正在嘗試編寫一個系統,顯示誰登錄到我的網站。「誰登錄」不工作

我已經嘗試過這麼多的東西,而且我覺得我正在用這個東西 - 但它不工作。我需要幫助,試圖找到我出錯的地方。

這裏是我的顯示代碼(我知道我不應該用表格的格式,但我用它來測試):

<? 
$loggedInUsers2 = "SELECT * FROM techs WHERE Level='0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; 
$loggedInUsers3 = "SELECT * FROM techs WHERE Level>'0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; 
?> 
<div class="col-sm-4"> 
    <div class="thumbnail"> 
     <center><h4 style="height:35px;">Users Online</h4></center> 
     <div class="modal-body" style="min-height:498px;"> 
      <table> 
       <tr><td> 
       <? 
       mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con)); 
       while($row2 = mysqli_fetch_array($loggedInUsers2)) { //if level less than 1 
        echo $row2['Name']."<br/>"; 
       } 
       ?> 
       </td><td> 
       <? 
       mysqli_query($con, $loggedInUsers3) or die("Error " . mysqli_error($con)); 
       while($row3 = mysqli_fetch_array($loggedInUsers3)) { //if level more than 1 
        echo $row3['Name']."<br/>"; 
       } 
       ?> 
       </td></tr> 
      </table> 
     </div> 
    </div> 
</div> 

這是我保存到數據庫:

$userId = $_SESSION['UserId']; 
$loggedInUsers1 = "UPDATE techs SET LastTimeSeen=NOW() WHERE UniqueID='$userId'"; 
mysqli_query($con, $loggedInUsers1) or die("Error " . mysqli_error($con)); 

這輸出到我的數據庫(在LastTimeSeen字段)到類似2015-12-21 08:35:43(更新每隔幾秒鐘通過jquery重新加載頁面的頁腳)

基本上,只有沒有從第一頁輸出到表格中。

編輯:

有人建議使用的登錄按鈕來設置用戶激活,註銷按鈕設置無效 - 這是我給的迴應:

"The problem with that is people won't use the logout button. They will just close the browser. I want this to keep track of only users that are online. The footer updates the time in the database, every couple of seconds, and then the table is listed on a part of the page that reloads every few seconds aswell, so they are both always up to date. It should only list people that have been on a page in the past 5 minutes."

回答

0

當您使用mysqli_query時,它返回一個結果對象。您需要將此對象傳入mysqli_fetch_array而不是查詢字符串。

<? 
    $loggedInUsers2 = "SELECT * FROM techs WHERE Level='0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; 
    $loggedInUsers3 = "SELECT * FROM techs WHERE Level>'0' AND LastTimeSeen>DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; 
?> 
<div class="col-sm-4"> 
    <div class="thumbnail"> 
     <center><h4 style="height:35px;">Users Online</h4></center> 
     <div class="modal-body" style="min-height:498px;"> 
      <table> 
       <tr><td> 
        <? 
        $results1 = mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con)); 
        while($row2 = mysqli_fetch_array($results1)) { //if level less than 1 
         echo $row2['Name']."<br/>"; 
        } 
        ?> 
       </td><td> 
        <? 
        $results2 = mysqli_query($con, $loggedInUsers3) or die("Error " . mysqli_error($con)); 
        while($row3 = mysqli_fetch_array($results2)) { //if level more than 1 
         echo $row3['Name']."<br/>"; 
        } 
        ?> 
       </td></tr> 
      </table> 
     </div> 
    </div> 
</div> 
+0

是的,因爲我說這是我認爲問題是 –

0

我認爲是因爲last seen = now僅在查詢不運行時等於NOW?這意味着它現在僅僅是一瞬間?我可能是錯的,但把想法扔出去。說實話,我認爲有一個更簡單的方法來做到這一點!

當您登錄用戶在還運行查詢來更新字段..等等日誌中

//Code to log in 
if password and email comp is found in database then log user in 

//Code to set user active 
UPDATE user WHERE username& password match, SET active = TRUE or 1 or something of the sort. 

然後在退出設置激活=假或0,我希望你能看到的邏輯我嘗試在這裏解釋一下,我會寫代碼,但是laravel太深了,而且現在一段時間沒有觸及vanilla db管理。

+0

問題在於人們不會使用註銷按鈕。他們將關閉瀏覽器。我想要這樣只跟蹤在線用戶。 頁腳每隔幾秒鐘更新一次數據庫中的時間,然後表格會在每隔幾秒重新加載的頁面部分列出,因此它們都始終保持最新狀態。它應該只列出過去5分鐘內在網頁上的人。 –

+0

@Grumpy您可能想要將此作爲您問題的目標添加,您認爲它是因爲您沒有爲查詢結果設置值嗎?即$ query_1 = mysqli_query($ con,$ loggedInUsers2),然後通過while循環運行$ query_1變量 –

+0

您能否爲此做出答案? –

0

我認爲這個任務不應該用MySQL來完成。因爲當數以千計的訪問者每秒都會打開一個新頁面時,您將面臨巨大的過載和數據庫死鎖。

通過使用基於RAM的數據庫(如Redis(http://redis.io)),您會更好。

在Redis中,您可以爲當前活動的訪問者設置自動過期條目(假設5分鐘)。如果該條目未更新5分鐘,則會自動刪除。我建議使用Redis命令SETEX。

你不需要擔心沒有註銷的人,你就可以高效地實現你想要的東西。

+0

將有最多約30個用戶。 –

0

因此,如前所述,您需要在兩行代碼中更改以下內容。

mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con)); 
while($row2 = mysqli_fetch_array($loggedInUsers2)) { //if level less than 1 
         echo $row2['Name']."<br/>"; 
        } 

TO

$query_1 = mysqli_query($con, $loggedInUsers2) or die("Error " . mysqli_error($con)); 
while($row2 = mysqli_fetch_array($query_1)) { //if level less than 1 
         echo $row2['Name']."<br/>"; 
        } 

的問題是,傳遞到mysqli_fetch_array參數不是查詢對象,這意味着環正要通過MySQL的聲明不是對象。