function getip() {
        if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
            $ip = getenv("HTTP_CLIENT_IP");
        } else
            if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
                $ip = getenv("HTTP_X_FORWARDED_FOR");
            } else
                if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
                    $ip = getenv("REMOTE_ADDR");
                } else
                    if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
                        $ip = $_SERVER['REMOTE_ADDR'];
                    } else {
                        $ip = "unknown";
                    }
        return ($ip);getenv("HTTP_CLIENT_IP")
getenv("HTTP_X_FORWARDED_FOR")我百度了下getenv里没有这2个参数啊。
还有strcasecmp是不是返回0 1 -1吗  这里怎么理解? 

解决方案 »

  1.   

    这些是 PHP 的预定义变量,在手册上的确是没有记录的.
    HTTP_CLIENT_IP 代理端的IP HTTP_X_FORWARDED_FOR 用户在哪个IP使用的代理为什么不用 == 来做比较,因为比较的两个对象类型要严格相等才能返回true.
    我们做个实验:echo 0 == "CSDN" 这里的结果显然不是我们想要的,他返回的是 true,所以显然简单的==比较是不可靠的。Strcasecmp 的作用是比较两个字符是否相等.注意是二进制比较 也就是一个字母一个字母.碰到不同的地方它就会停下来并且返回结果.
    前者比后者大,则返回大于0的整数;如果前者比后者小,则返回小于0的整数;如果两者相等,则返回0.
    用 Strcasecmp 就可以取得 -3  为什么是-3 当比较第一个数的时候 1 和4 就不相同了 所以返回了 -3.
    用Strcasecmp进行字符串的比较就能够避免一些我们不愿意看到的错误发生.所以在手册上说是二进制安全比较字符串。
      

  2.   

    Strcasecmp测试的例子
    echo Strcasecmp(10,4);//-3
      

  3.   

    那这里拿来和unknown比较返回的是什么啊?
      

  4.   

    例子:
    if (strcasecmp('127.0.0.1', "unknown")){
    echo '127.0.0.1';
    }判断返回1 的话那么就是获取到了IP地址.所以将IP地址 赋值给变量
    $ip = getenv("HTTP_CLIENT_IP");例子2:
    if (strcasecmp('unknown', "unknown")){
    echo '127.0.0.1';
    }else{
    echo '没有IP地址继续操作...';
    }
    如果 getenv("HTTP_CLIENT_IP") 返回的结果是 unknown(返回判断结果是0 if 将判断为假) 那么将继续循环下面的操作.
    能看明白了?
      

  5.   

    strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")
    ==>
    strtolower(getenv("HTTP_CLIENT_IP")) != "unknown"  
      

  6.   

    我记得,apache和IIS有一点区别,getenv("REMOTE_ADDR")只能在前者有效,后者要用$_SERVER["REMOTE_ADDR"];
    不知道有没有记错。