Php 页面命中计数器工作,但希望将其限制为每个IP地址

Php 页面命中计数器工作,但希望将其限制为每个IP地址,php,views,counter,Php,Views,Counter,我目前有一个工作脚本,它计算视图的数量并将它们存储在.txt文件中 它的工作很好,但我如何使它限制到您的IP地址 我试过了,但不算 // Get filename of Page $pageName = basename($_SERVER["SCRIPT_FILENAME"], '.php'); $ip = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']); // Re

我目前有一个工作脚本,它计算视图的数量并将它们存储在.txt文件中

它的工作很好,但我如何使它限制到您的IP地址

我试过了,但不算

// Get filename of Page
$pageName = basename($_SERVER["SCRIPT_FILENAME"], '.php');
$ip = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);

// Remove .php extension
$counterName = basename($pageName, ".php").".txt";

// Open the file for reading
// "a+" Read & write the file. Create file if not exist.
$fp = fopen($counterName, "a+");
$fpIP = fopen("ip_".$counterName, "a+");

fwrite($fpIP, $ip."-");

// Get the existing count
$count = fread($fp, 1024);

// Close the file
fclose($fp);

// Add 1 to the existing count
$count = $count + 1;

// Reopen the file and erase the contents
$fp = fopen($counterName, "w");

$ipRead = file_get_contents('ip_index.txt');

if(strpos($ipRead, "$ip") !== FALSE) {
     echo $count;
}
else {
    fwrite($fp1, $count);
    echo $count;    
}
fclose($fp);
下面是我的更新代码和Barmar的代码(完全有效),它将根据每个访问者的IP地址显示他们访问您的页面的次数

// Get filename of Page
$pageName = basename($_SERVER["SCRIPT_FILENAME"], '.php');

// Remove .php extension
$counterName = basename($pageName, ".php").".counter";

// Get IP
$ip = $_SERVER['REMOTE_ADDR']?:($_SERVER['HTTP_X_FORWARDED_FOR']?:$_SERVER['HTTP_CLIENT_IP']);


$count_text = @file_get_contents($counterName);
$counters = $count_text ? json_decode($count_text, true) : array();
if (isset($counters[$ip])) {
    $counters[$ip]++;
} else {
    $counters[$ip] = 1;
}
file_put_contents($counterName, json_encode($counters));
echo $counters[$ip];

在计数器文件中存储键控关闭的关联数组
$ip

$count_text = @file_get_contents($counterName);
$counters = $count_text ? json_decode($count_text, true) : array();
if (isset($counters[$ip])) {
    $counters[$ip]++;
} else {
    $counters[$ip] = 1;
}
file_put_contents($counterName, json_encode($counters));
echo $counters[$ip];

在这种设计中,您不需要
ip_XXX.txt
文件。

在计数器文件中存储一个键控关闭的关联数组
$ip

$count_text = @file_get_contents($counterName);
$counters = $count_text ? json_decode($count_text, true) : array();
if (isset($counters[$ip])) {
    $counters[$ip]++;
} else {
    $counters[$ip] = 1;
}
file_put_contents($counterName, json_encode($counters));
echo $counters[$ip];

在本设计中,您不需要使用
ip_XXX.txt
文件。

将计数存储在文件中是否有特定原因?如果您回显$ip,值是多少?您需要将ip放入文件名中,或者将由ip键入的关联数组放入文件中。是否有特定原因将计数存储在文件中?如果您回显$ip,值是多少?您需要将ip放入文件名中,或者将由ip键入的关联数组放入文件中。感谢您的帮助,我想我就快到了,但是我的脚本出现了以下错误:警告:不能在****/test/index.php的第29行将标量值用作数组我已经更新了上面的代码:)我取消了编辑。如果要显示新代码,请将其作为添加项添加,不要删除问题涉及的原始代码。是否清空原始计数器文件?我的代码希望该文件包含JSON数组或为空,在这种情况下,它将使用空数组对其进行初始化。如果它仍然包含您版本中的数字,它将无法工作。Doh抱歉,我的错误!是的,我现在删除了它,第一次计数为1,第二次出现这个错误“致命错误:无法在第26行的/home/******/test/index.php中使用stdClass类型的对象作为数组。然后当我查看计数器文件时,它说“{”my.ip.addr.ess::1}”对不起,忘记使用
json\u decode()的第二个参数
。感谢您的帮助,我想我已经差不多做到了,但是我的脚本中出现了以下错误:警告:无法在****/test/index.php第29行使用标量值作为数组。我已更新了上面的代码:)我取消了编辑。如果要显示新代码,请将其作为一个附加项添加,不要删除出现问题的原始代码关于。您是否清空了原始计数器文件?我的代码希望该文件包含JSON数组或为空,在这种情况下,它将使用空数组对其进行初始化。如果它仍然包含您的版本中的数字,则它将不起作用。Doh抱歉,我的错误!是的,我现在删除了它,第一次计数为1,第二次出现此错误”致命错误:无法在第26行的/home/*****/test/index.php中将stdClass类型的对象用作数组。然后,当我查看计数器文件时,它会显示“{”my.ip.addr.ess“:1}”对不起,忘了使用
json\u decode()
的第二个参数。