<?php
header("Content-Type:text/html;charset=gbk");
$s = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js");
preg_match('/{.+}/',$s,$r);
$p = json_decode($r[0]);
$city = $p->city;
?>
//<?php echo $SA_IP?>//
还有这样调用,好像返回的是服务器IP,不是用户的IP,使用JS返回的好像正常,PHP要怎么样修改一下
<?php echo $SA_IP?>输出乱码,查看源文件是正常的,怎么样说这个参数输出正常

解决方案 »

  1.   

    是utf-8的编码
    header("Content-Type:text/html;charset=utf-8");
      

  2.   

    乱码问题如楼上关于IP的问题你这样写肯定是获得服务端的ip所对应的城市,因为你是放在服务端用php去请求的,你得到的永远都是服务端的ip所对应的城市,如果你想得到客户端的ip可以用script标签来加载这个js
      

  3.   


    <?php
    //phpinfo();
    ?>
    <script src="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"></script>
    <script type="text/javascript">
    var showName = function(ip_info)
    {
    alert(ip_info.city);
    }
    showName(remote_ip_info);
    </script>
      

  4.   

    能不能不使用JS的方法获取,这样浏览器会输出获取IP的JS文件,我想隐藏获取IP的代码用PHP实现
      

  5.   


    function getIP(){
    if (getenv("HTTP_CLIENT_IP"))
    $ip = getenv("HTTP_CLIENT_IP");
    else if(getenv("HTTP_X_FORWARDED_FOR"))
    $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if(getenv("REMOTE_ADDR"))
    $ip = getenv("REMOTE_ADDR");
    else 
    $ip = false;
    return $ip;
    }
    $ip = getIP();
    if (empty($ip)) {
    echo '无法获得IP';
    } else {
    $json = file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=' . $ip);
    $info = json_decode($json);
    var_dump($info);
    }这样的话你自己测试估计不能通过,因为你获得的ip是你内网的ip,只有别人通过外网访问你的时候才能获得真实的ip
      

  6.   

    他是可以返回指定 ip 的位置的header('Content-type: text/html;charset=gbk');
    $ip = '202.101.200.5';
    //$ip = '114.112.73.200';
    $s = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=$ip");
    preg_match('/{.+}/',$s,$r);
    $p = array_map(function($s) { return iconv('utf-8', 'gbk', $s); }, json_decode($r[0], 1));
    print_r($p);Array
    (
        [ret] => 1
        [start] => -1
        [end] => -1
        [country] => 中国
        [province] => 江西
        [city] => 萍乡
        [district] => 
        [isp] => 
        [type] => 
        [desc] => 
    )
    获取用户的 ip 应该都会吧?
      

  7.   

    http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json 可以直接输出json,不用再做正则匹配
      

  8.   

    <?php
    header("Content-Type:text/html;charset=utf-8");
    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); 

    function getIPLoc_sina($queryIP){ 
        $url = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=' . $queryIP; 
        $ch = curl_init($url);//初始化url地址 
        curl_setopt($ch, CURLOPT_ENCODING, 'utf8');//设置一个cURL传输选项 
        curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回 
        $location = curl_exec($ch);//执行一个cURL会话 
        $location = json_decode($location);//对 JSON 格式的字符串进行编码 
        curl_close($ch);//关闭一个cURL会话 
        $loc = ""; 
        if ($location === FALSE) return "地址不正确"; 
        if (empty($location->desc)) { 
            $loc = $location->city;
        } else { $loc = $location->desc;} 
        return $loc; 

     
    $SA_IP=getip();
    $city = getIPLoc_sina($SA_IP);
    ?>
     
    //<?php echo $city?>//
    我修改后如下,能获取到IP和城市,但是PHP获取出来的IP和百度查询的IP不一样,我百度查询IP地址是中国上海,长城宽带,实际上我是这个网络,但上面代码PHP输出来的IP不一样,是北京的。是不是没写对。