2010-11-26 76 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,
如果是这样,这意味着新的日志添加。

相关问题