Вставьте строку только в том случае, если для этого дня и этого пользователя строка еще не существует - PullRequest
3 голосов
/ 26 ноября 2010

Когда кто-то посещает 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 ]

2 голосов
/ 26 ноября 2010

Вот то, что я придумал .. похоже, работает:

//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 голос
/ 26 ноября 2010

Попробуйте

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;

И проверьте, есть ли возвращенный если это так, то есть добавлен новый журнал.

0 голосов
/ 26 ноября 2010

В своем последнем запросе вы не проверяете, есть ли запись старше 24 часов, вы проверяете, существует ли запись старше NOW.

Правильная процедура:

Создать индекс по записям для времени входа в систему.
ВЫБЕРИТЕ последнюю запись по этому возрастающему индексу для пользователя ('who').
Если есть последний, а последний менее чем через 24 часа (time ()), тогда пропустите создание новой записи.
В противном случае создайте его сейчас (time ()).

0 голосов
/ 26 ноября 2010
  1. Я бы вставил $time, а не $timedifference.
  2. Вам необходимо проверить, меньше ли time time() - 86400.Если вы сделали столбец time a datetime, вы можете сделать это непосредственно в запросе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...