PHP中的数据库插入语句

时间:2011-08-26 22:50:24

标签: php

我有简单的脚本,存储时间/ 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并且如果存在则不插入它以便为同一个访问者重复重复,因为我愿意将它放在所有页面中的页脚中我的网站! 〜谢谢

4 个答案:

答案 0 :(得分:1)

假设您正在使用MySQL,请将ip字段作为主键,并使用此查询:

$sql= "
    INSERT INTO
        online
    VALUES
        ('$REMOTE_ADDR','$timestamp','$PHP_SELF')
    ON DUPLICATE KEY UPDATE
        `timestamp` = '$timestamp',
        `page` = '$PHP_SELF'
";

(假设以下列名称为:iptimestamppage

顺便说一下,如果你还没有这样做,你应该防范SQL injection。不要在数据库中逐字插入外部数据。但要使用适当的逃逸机制;优选参数化的准备语句。这个can be done例如PDO

答案 1 :(得分:0)

您应该在$ REMOTE_ADDR上添加UNIQUE约束。

  1. 如果您需要更新此密钥的某些字段,可以使用INSERT INTO ... ON DUPLICATE KEY UPDATE timestamp = CURRENT_TIMESTAMP。
  2. 如果您不需要更新任何内容,请运行INSERT IGNORE INTO ....

答案 2 :(得分:0)

使用UPDATE而不是INSERT

$sql= "UPDATE online SET timestampColumnName ='$timestamp' WHERE remoteColumnName ='$REMOTE_ADDR'";

答案 3 :(得分:0)

我认为更多细节会有所帮助,但您可以使用索引来影响存储的内容。如果您只想为每个IP命中一次,则可以在ip列上添加唯一索引。要存储来自IP的最新命中,您可以将重复键更新添加到查询结尾。对于你想要强制间隔的情况,最好的选择可能是首先选择 - 选择max(时间戳),其中ip ='$ ip' - 如果没有结果,记录命中,否则检查时间。