HTML 表单 - 每个 IP 每小时最多保存 X 个


HTML form - limit to X saves per hour per IP

我有一个问题,我需要接收数据(只是一个来自表单的字符串,它是一个它接收的名称):

$received_data = $_POST['data'];
$ip = checkip();

和"用户"IP(它不需要cookie或会话,我不能使用它们),我必须将数据(数据和ip)保存在数据库中,并允许每小时查看5个,但允许看到已经看到的相同,我的意思是存储在数据库上的"数据"可以无限制地看到,但每小时只有5个不同的数据(名称), 例如:

可以检查

:玛莎,杰克,莉莉,马克和彼得(每小时,下一个小时可以检查其他人,或者可能相同 - 用户)。

在同一小时内可以检查已经检查的五个名称,但直到下一个小时才能检查其他名称。

如果尝试检查玛莎,

杰克,然后再次检查玛莎,(第二个玛莎)不算数,因为它已经在同一小时内检查过了。

我不知道我该怎么做,有人可以帮助我吗?

提前谢谢你,亲切的问候。

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
function maxSavePerHour($data, $ip, $maxSave = 5){
    $data = mysql_real_escape_string($data);
    // Get record matching within last hour
    $res = mysql_query("select * from table where data='$data' and ip='$ip' and lastinsert <= date_sub(NOW(), interval 1 hour)";
     $totalRows = mysql_num_rows($res);
    // If a record was NOT found within last hour matching everything then insert new record.
      // Compare records against max saves
      if($totalRows <= $maxSave){
        $storeData = true;
      }else{
        $storeData = false;
      }  

   if($storeData){
      $res = mysql_query("insert into table set data='$data', ip='$ip'";
      //Add more exception handling here....
    }
}

$ip = getRealIpAddr();
$data = $_POST['data'];
maxSavePerHour($data,$ip);

我会重新考虑使用IP地址。许多组织/ISP 有许多计算机来共享一个 IP 地址。

至于每小时仅验证 5 次,您需要存储收到的最后 5 项数据的时间戳。如果少于五个,那么一切都很好。

否则检查老大的时间。如果超过 1 小时,则确定并通过删除最旧的时间戳并将其替换为新时间戳来更新数据库。否则,它应该失败。