我使用此函数,当$hexIpStr
存在时,Fine on Local表示函数返回false
,否则返回true
,
但是,当我在服务器上部署项目时,此函数仅返回True,
$ arr是2D数组。
function ipChecker($arr, $hexIp)
{
$hexIpStr = "HEX=" . $hexIp;
foreach ($arr as $members) {
if (in_array($hexIpStr, $members)) {
return false;
} else {
return true;
}
}
}
例如,使用以下值调用该函数:
$hexIp = 'f528764d624db129b32c21fbca0cb8d6';
$arr = array(
0 => [
0 => 'FullName=mehdi',
1 => 'Email=test@gmail.com',
2 => 'IP=127.0.0.1',
3 => 'HEX=f528764d624db129b32c21fbca0cb8d6',
4 => '=>',
5 => 'Opinion=1 ',
],
1 => [
0 => '',
],
);
没有答案,因为它在服务器上很好我得到了
FullName = asd电子邮件=kingblack5230@gmail.com IP = 192.119.160.197 HEX = dd029394f038b0775138a23df8d9cddd =>意见= 1及其权利和我 使用此功能获取用户ip:
function GetRealIp()
{
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;}
答案 0 :(得分:1)
f528764d624db129b32c21fbca0cb8d6
(#)为md5('127.0.0.1')
,这可能不是您期望的/ $members
中的值(IP)。您可能希望使用公共IP。
如果您依靠$_SERVER['REMOTE_ADDR']
,可能会遇到问题。如果您的服务器将请求代理到同一台计算机上的PHP工作者(而不是直接使用mod_php
),则REMOTE_ADDR
将是代理的IP(127.0.0.1
/ {{1 }}),而不是访客。
在这种情况下,您应该转储localhost
并检查变量$_SERVER
/使用该变量而不是HTTP_X_FORWARDED_FOR
,代理服务器可能会将其添加为包括原始IP。 / p>
答案 1 :(得分:1)
在检查第一个孩子的 HEX = ... 字符串后,您的函数“提前返回”(从而中断foreach
)。这意味着您只能检查第一个成员。
鉴于此$arr
,您的成员就在那里,只是不在第一位置:
array(
0 => [
0 => 'FullName=blub',
1 => 'Email=blub@gmail.com',
2 => 'IP=1.2.3.4',
3 => 'HEX=6465ec74397c9126916786bbcd6d7601',
],
1 => [
0 => 'FullName=mehdi',
1 => 'Email=test@gmail.com',
2 => 'IP=127.0.0.1',
3 => 'HEX=f528764d624db129b32c21fbca0cb8d6',
],
)
它将返回true
,因为仅检查了in_array('HEX=f528764d624db129b32c21fbca0cb8d6', ['HEX=6465ec74397c9126916786bbcd6d7601'])
。
您应该重组函数,以便它只能在找到成员的情况下“ return
提前”,否则,它将继续检查所有成员,并仅在最后返回另一种情况:
function ipChecker($arr, $hexIp)
{
$hexIpStr = "HEX=" . $hexIp;
foreach ($arr as $members) {
if (in_array($hexIpStr, $members)) {
return false;
}
}
return true;
}