2010-11-26 73 views
3

當某人第一次訪問X頁時,我用當前的unix time()標記向表中插入一個新行。如果當天和該用戶沒有存在行,只插入一行

我想插入新行,對於用戶,每24小時..因此,例如:

例A)鮑勃,去我的網站,它插入一個一行..,12小時後,鮑勃來到回來,它沒有插入一個新的行,因爲24小時還沒有通過。

示例B)鮑勃,去我的網站,它插入一行.. 24小時後,鮑勃回來了,它插入一個新的行作爲24小時已經通過。

我在這附近玩耍,但由於我的大腦被炸,無法想象這是否正確。

$time = time(); 
$difference = 86400; 
$timedifference = $time + $difference; 

當插入該行:

mysql_query("INSERT INTO `logs` (`time`, `who`, `site`, `type`) 
VALUES('" . $timedifference . "', '" . $ip . "', '" . $rid . "', 'out') ") 
or die(mysql_error()); 

當檢查,看它是否已經超過24小時:

mysql_query("SELECT * FROM `logs` 
WHERE `time` < '" . time() . "' AND `type` = 'out' 
AND `site` = '" . $rid . "' AND `who` = '" . $ip . "'"); 

有人能告訴我,如果它是正確的?

+0

請問`time`領域有哪些類型? – 2010-11-26 12:23:39

回答

2

這裏是我想出來的。它似乎工作:

//log check 
$ip = ip2long($_SERVER['REMOTE_ADDR']); 
$time = time(); //current time 
$difference = 86400; //one day in seconds 
$timedifference = $time + $difference; //time difference 
$logQ = mysql_query("SELECT * FROM `logs` WHERE `time` > '" . time() . 
     "' AND `type` = 'out' AND `site` = '" . $id . 
     "' AND `who` = '" . $ip . "'"); 
$logR = mysql_num_rows($logQ); 
if ($logR <= 0){ 
    mysql_query("INSERT INTO `logs` (`time`, `who`, `site`, `type`) VALUES('" . 
    $timedifference . "', '" . $ip . "', '" . $id . "', 'out') ") or 
    die(mysql_error()); 
} 
+0

不錯,請確保Web服務器和數據庫服務器的時間都是同步的 – ajreal 2010-11-26 12:45:44

0
  1. 我會插入$time,而不是$timedifference
  2. 您需要檢查time是否小於time() - 86400。如果您製作了time a datetime列,則可以直接在查詢中執行此操作。
0

在上次查詢中,您並未檢查是否有超過24小時的條目,而只是檢查是否存在比NOW舊的條目。

正確的程序是:

在登錄時間的記錄上創建一個索引。
用戶('who')按此升序索引選擇最後一條記錄。
如果有最後一個,最後一個距離現在(時間())少於24小時,則跳過創建新記錄。
否則,現在創建一個(時間())。

1

嘗試

insert ignore into logs 
    select unix_timestamp(now()), who, site, type 
    from logs 
    where 
    who='{$ip}' and 
    site='{$rid}' and 
    type='out' and 
    unix_timestamp(time)<=unix_timestamp(now())-86400 limit 1; 

並檢查是否有回報affected_rows,
如果是這樣,這意味着新的日誌添加。

相關問題