如果当天和该用户只插入一行,则不存在任何行

时间:2010-11-26 12:16:12

标签: php mysql time

当有人第一次访问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 . "'");

有人可以告诉我它是否正确?

4 个答案:

答案 0 :(得分: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());  
}

答案 1 :(得分: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,
如果是这样,意味着添加了新日志。

答案 2 :(得分:0)

  1. 我会插入$time,而不是$timedifference
  2. 您需要检查time是否小于time() - 86400。如果您将time列为datetime列,则可以直接在查询中执行此操作。

答案 3 :(得分:0)

在上一次查询中,您没有检查是否有超过24小时的条目,您只是检查是否有比NOW更旧的条目。

正确的程序是:

在登录时间的记录上创建索引 对于用户('who'),按此升序索引选择最后一条记录 如果有最后一个,并且距离现在不到24小时(时间()),则跳过创建新记录。
否则,立即创建一个(time())。