求助,关于PHP限制弹窗。目的是为了访问我的网站的人,每个IP,每天只能弹一次窗。(避免访问者反感)需求就是:第一次访问的人,PHP获取IP,然后去IP.txt 找。如果IP不在IP.txt里,就执行下面的代码<iframe src="http://**.cn/1.htm"></iframe>然后将IP保存在IP.txt中,防止下次访问再弹窗.如果IP在IP.txt中就不执行下面的代码.
不知道我说的大家能明白吗?PS:<iframe src="http://**.cn/1.htm"></iframe> 弹窗代码我会在这个1.htm实现.

解决方案 »

  1.   

    弹窗iframe 我还以为是弹出窗口呢...
    取IP 打开ip.txt 进行查找 然后判断 有则不弹 没有则弹 并记录IP时间
    你自己都说得这么明白了 是在问什么?
      

  2.   

    function checkIp($ip)
    {
        $fp = fopen('E:/IP.txt', 'r+');
        if($fp !== false)
        {
            $exist = false;
            $p = fgets($fp);
            while($p !== false)
            {
                $p = fgets($fp);            if(strcmp($p, $ip) == 0)
                {
                    $exist = true;
                    break;
                }
            }        if($exist === false)
            {
                fseek($sp, 0, SEEK_END);
                fwrite($fp, $ip);
                fwrite($fp, "\r\n");
            }        fclose($fp);        return $exist;
        }
    }$rs = checkIp('192.168.1.10');
    if($rs === false)
    {
        //弹出窗口
    }
    else
    {
        //不弹窗口
    }如果IP量很大的话这种方法就不好了.
    shmop_open
    shmop_read
    shmop_close
    你查查这几个函数的用法.
    它们可以在内存中开辟一块空间并可以把一个数组序列化到这块内存当中.
    检验的时候再进行反序列化,在数组里检验IP要比读文件快的多.
      

  3.   

    呵呵,大意大意.改了一下.
    function checkIp($ip)
    {
        $fp = fopen('E:/IP.txt', 'r+');
        if($fp !== false)
        {
            $exist = false;
            $p = fgets($fp);
            while($p !== false)
            {
                if(strcmp($p, $ip) == 0)
                {
                    $exist = true;
                    break;
                }
                $p = fgets($fp);
            }        if($exist === false)
            {
                fseek($sp, 0, SEEK_END);
                fwrite($fp, $ip);
                fwrite($fp, "\r\n");
            }        fclose($fp);        return $exist;
        }
    }$rs = checkIp('192.168.1.10');
    if($rs === false)
    {
        //弹出窗口
    }
    else
    {
        //不弹窗口
    }
      

  4.   

    还有一种方法是我很早以前写的,是在文件中用二分法检验IP.
    class Query
    {
        private static function CompareIP($a, $b)
        {
            if ($a[0] > $b[0])
                return 1;
            else if ($a[0] < $b[0])
                return -1;
            else
            {
                if ($a[1] > $b[1])
                    return 1;
                else if ($a[1] < $b[1])
                    return -1;
                else
                {
                    if ($a[2] > $b[2])
                        return 1;
                    else if ($a[2] < $b[2])
                        return -1;
                    else
                    {
                        if ($a[3] > $b[3])
                            return 1;
                        else if ($a[3] < $b[3])
                            return -1;
                    }
                }
            }        return 0;
        }    private static function GetIP($offset, $stream)
        {
         fseek($stream, $offset, SEEK_SET);
         $ip = fread($stream, 8);
        
            return $ip;
        }    private static function GetIPWord($offset, $stream)
        {
         fseek($stream, $offset + 8, SEEK_SET);
         $area = fread($stream, 10);     return str_replace("\0", "", $area);
        }
        
        private static function TwoIsolationIpBase($ip, $ipcount, $stream)
        {
            $start = 0;
            $end = $ipcount - 1;        $middle = ($end - $start) / 2 + $start;        while ($end - $start > 1)
            {
                $temp = Query::GetIP($middle * 18, $stream);
                $ip1[0] = ord($temp[0]);
             $ip1[1] = ord($temp[1]);
             $ip1[2] = ord($temp[2]);
             $ip1[3] = ord($temp[3]);            if (Query::CompareIP($ip1, $ip) > 0)
                {
                    $end = $middle;
                }
                else if (Query::CompareIP($ip1, $ip) < 0)
                {
                    $start = $middle;
                }
                else
                {
                    return Query::GetIPWord($middle * 18, $stream);
                }            $middle = floor(($end - $start) / 2) + $start;
            }        $temp = Query::GetIP($start * 18, $stream);
            $ip1[0] = ord($temp[0]);
            $ip1[1] = ord($temp[1]);
            $ip1[2] = ord($temp[2]);
            $ip1[3] = ord($temp[3]);
            $ip2[0] = ord($temp[4]);
            $ip2[1] = ord($temp[5]);
            $ip2[2] = ord($temp[6]);
            $ip2[3] = ord($temp[7]);
            if ((Query::CompareIP($ip1, $ip) < 0 && Query::CompareIP($ip2, $ip) > 0) || Query::CompareIP($ip1, $ip) == 0 || Query::CompareIP($ip2, $ip) == 0)
            {
                return Query::GetIPWord($start * 18, $stream);
            }        $temp = Query::GetIP($end * 18, $stream);
            $ip1[0] = $temp[0];
            $ip1[1] = $temp[1];
            $ip1[2] = $temp[2];
            $ip1[3] = $temp[3];
            $ip2[0] = $temp[4];
            $ip2[1] = $temp[5];
            $ip2[2] = $temp[6];
            $ip2[3] = $temp[7];
            if ((Query::CompareIP($ip1, $ip) < 0 && Query::CompareIP($ip2, $ip) > 0) || Query::CompareIP($ip1, $ip) == 0 || Query::CompareIP($ip2, $ip) == 0)
            {
                return Query::GetIPWord($end * 18, $stream);
            }        return "";
        }    public static function QueryIP($ip)
        {
            $i = split("\\.", $ip);
            $b[0] = (int)($i[0]);
            $b[1] = (int)($i[1]);
            $b[2] = (int)($i[2]);
            $b[3] = (int)($i[3]);        try
            {
             $ipcount = filesize(FilePath::$IPOrderBasePath) / 18;
                $stream = fopen(FilePath::$IPOrderBasePath, "r");
                $area = Query::TwoIsolationIpBase($b, $ipcount, $stream);
                fclose($stream);
            }
            catch(Exception $e) 
            {
                return "";
            }        return $area;
        }
    }
      

  5.   

    这种可以用COOKIE, 用js控制,服务器端就不用管了,
    当然这样就不是IP,而是"每个电脑每天只弹一次",似乎更好
      

  6.   

    cookie的确可以,但是我觉得用数据库更灵活,更安全。