0

これは私のコードです:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php

    class visitors
    {
        static $i;
        function __construct()
        {
            $this->checkIp();
        }
        function createFile()
        {
            $fp=fopen("visit.txt","a+");
            if($fp)
            {
            echo "<br /> File created";
            return $fp;
            }
            else
            {
                echo "File creation Error Check permissions";
                exit;
            }
        }
        function fetchIp()
        {
            $ip=$_SERVER['REMOTE_ADDR'];
            //$ip=ip2long($ip);
            return $ip;
        }
        function writeFile()
        {
            $fp=$this->createFile();
            $ip=$this->fetchIp();
            //echo $ip;
            $space="\r\n";
            fwrite($fp,$ip.$space);
            //self::$i++;
            //echo self::$i;

        }
        function checkIp()
        {
            $fp=$this->createFile();
            $ip=$this->fetchIp();
            while(!feof($fp))
            {
                $data.=fgets($fp);
            }
            $uip=explode("\r\n",$data);
            foreach($uip as $key)
            {
                if(strpos($key,$ip)!==0)
                {
                    $this->writeFile();
                }

            }
        }

    }
    $v=new visitors();
    ?>
    </body>
    </html>

私は各訪問者のIPアドレスをテキストファイルに保存しようとしていますが、同じ訪問者が2回目に来ると、彼のIPがテキストファイルに書き込まれます。これを実装するために、ファイルを読み取って現在のIPと比較します。書き込み関数を呼び出さないのと同じです。問題はすべて機能しますが、ファイルは改行に同じIPで毎回書き込まれます。比較部分は失敗します。これを修正するのを手伝ってください。静的i変数部分を残してください。コメントしましたので問題ありません。ありがとうございます。

注:PHPでIPアドレスをワイルドカードと比較するための最適化された方法を読みましたか?以前はip2longとlong2ipを使用していましたが、同じエラーが発生しました。PHPはここから符号なし整数をサポートしていません。これは、IPアドレスが符号なし32であるため、比較操作に影響しますか。ビット整数。

4

2 に答える 2

3

毎回ループする必要はありません。stristr()を使用してIPが存在するかどうかを確認してください。

機能変更

    function checkIp()
    {
        $fp=$this->createFile();
        $ip=$this->fetchIp();
        while(!feof($fp))
        {
            $data.=fgets($fp);
        }
        $uip=explode("\r\n",$data);
        foreach($uip as $key)
        {
            if(strpos($key,$ip)!==0)
            {
                $this->writeFile();
            }

        }
    }

    function checkIp()
    {
        $fp=$this->createFile();
        $ip=$this->fetchIp();
        while(!feof($fp))
        {
            $data.=fgets($fp);
        }
        if(!stristr($data, $ip)){
            $this->writeFile();
        }
    }
于 2012-08-31T09:23:19.240 に答える
1

IPを覚える一般的な方法は、それらをデータベースに保存することです。そうすれば、あなたは常に彼らのIPの記録を持っており、必要に応じてさらに多くの記録を持っています。=)

幸運を祈ります

于 2012-08-31T09:25:43.847 に答える