我有简单的脚本,存储时间/ IP / PATH只有多少在线访问者脚本
$timeoutseconds= 50;
$timestamp=time();
$timeout=$timestamp-$timeoutseconds;
它将为任何访问者时间插入以下信息$timestamp
IP $REMOTE_ADDR
和主要路径$PHP_SELF
$sql= "insert into online VALUES ('$timestamp','$REMOTE_ADDR','$PHP_SELF')";
executeupdate($sql);
仅在timestamp<$timeout
$sql= "delete from online WHERE timestamp<$timeout";
executeupdate($sql);
但这意味着,如果有人开始在$timeout
结束之前为页面重新加载Zillions将会反复计算!
所以如何修改它以便它依赖于IP $REMOTE_ADDR
并且如果存在则不插入它以便为同一个访问者重复重复,因为我愿意将它放在所有页面中的页脚中我的网站! 〜谢谢
答案 0 :(得分:1)
假设您正在使用MySQL,请将ip字段作为主键,并使用此查询:
$sql= "
INSERT INTO
online
VALUES
('$REMOTE_ADDR','$timestamp','$PHP_SELF')
ON DUPLICATE KEY UPDATE
`timestamp` = '$timestamp',
`page` = '$PHP_SELF'
";
(假设以下列名称为:ip
,timestamp
,page
)
顺便说一下,如果你还没有这样做,你应该防范SQL injection。不要在数据库中逐字插入外部数据。但要使用适当的逃逸机制;优选参数化的准备语句。这个can be done例如PDO。
答案 1 :(得分:0)
您应该在$ REMOTE_ADDR上添加UNIQUE约束。
答案 2 :(得分:0)
使用UPDATE而不是INSERT
$sql= "UPDATE online SET timestampColumnName ='$timestamp' WHERE remoteColumnName ='$REMOTE_ADDR'";
答案 3 :(得分:0)
我认为更多细节会有所帮助,但您可以使用索引来影响存储的内容。如果您只想为每个IP命中一次,则可以在ip列上添加唯一索引。要存储来自IP的最新命中,您可以将重复键更新添加到查询结尾。对于你想要强制间隔的情况,最好的选择可能是首先选择 - 选择max(时间戳),其中ip ='$ ip' - 如果没有结果,记录命中,否则检查时间。