$ _SERVER ['REMOTE_ADDR']返回值0

时间:2011-11-08 20:31:43

标签: php ip

这个问题让我摸不着头脑。大多数情况下,它返回的IP地址很好,但有时它会将其记录为“0”,这会导致我出现问题,因为我正在使用它进行投票。正如您在下面的代码中看到的,我将其切换为长格式并使用条件if if ip == 0然后允许投票。我用17小时的饼干对它进行双重保护,但如果我能干净整洁,我想解决这个问题。此外,我认为有一些聪明的人清除他们的cookie并多次投票。这是我正在使用的代码:

$ip = $_SERVER['REMOTE_ADDR'];
$iplong = ip2long($ip);

$fetch = mysql_query("SELECT * FROM ip WHERE ipaddress='$iplong' AND 
url='$urlupdate'");
if(mysql_num_rows($fetch) == 0) {
$query = mysql_query("INSERT INTO ip (url,ipaddress) VALUES ('$urlupdate','$iplong')");
}
$update = "UPDATE pages SET counter = counter +1 WHERE url = '$urlupdate'";
$result = mysql_query($update);

就像我说的那样,大部分时间这都像魅力一样,而cron的工作每天都会清除它,没有任何问题。起初我认为这是一个noscript问题,但它是通过onclick触发的。这意味着代码永远不会被解析,值不会被插入,实际上链接只是将它们带回结果页面而不记录信息。我对于导致这种情况的原因感到非常难过!

1 个答案:

答案 0 :(得分:2)

在32位PHP安装中使用ip2long很棘手。对于简单的MySQL操作,最好将IP作为字符串传递,并使用MySQL的本机inet_ntoa / inet_aton函数转换为存储。

$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']);
$sql = "INSERT INTO ... VALUES (INET_ATON('$ip'));";

然后

$sql = "SELECT INET_NTOA(ipaddress) AS ip ..."; 

供以后检索。