2017-06-09 62 views
1

我想用我的網站通過PHP要知道用戶的國家獲得用戶的國家,所以我寫此功能檢測:不能用PHP

$details = json_decode(file_get_contents("http://ipinfo.io/")); 

我嘗試用其他環節

$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}")); 
$details = json_decode(file_get_contents("http://api.hostip.info/country.php?ip=$ip")); 

我用這兩個網站,一個是舞臺,一個是生活(不同的服務器)

在舞臺上它的工作完美。但在現場它總是返回錯誤。爲什麼會發生?我怎樣才能在我的生活網站上獲得用戶的國家?

謝謝> _ <

+0

有沒有想過谷歌分析的loulous? https://analytics.google.com/ – Twinfriends

+0

無法解析主機'api.hostip.info'。 – axiac

+0

這些免費服務中的大多數對每天/每小時的通話次數有限制!你超過了一些限制? – RiggsFolly

回答

0

file_get_contents只在php.ini文件中打開allow_url_fopen時才起作用。

出於安全原因,這在大多數生產環境中都是禁用的。

要麼你應該在php.ini中啓用它或使用cURL(我會建議使用cURL)。 INI設定低於:

; Disable allow_url_fopen for security reasons 
allow_url_fopen = 1 
+0

沒錯,我使用curl的這個,它的工作。謝謝最佳歡迎 –

+0

... –

-1

試試這個代碼

$getlocation=json_decode(file_get_contents("http://ip-api.com/json/".$ip."")); 

這種方法獲取IP的區域名稱。

+0

這裏我描述得到區域名稱 –

+0

所有使用file_get_contents的鏈接在我的現場網站上返回false。我認爲是因爲服務器配置。 –

1

試試這個代碼:

function getLocationInfoByIp(){ 
$client = @$_SERVER['HTTP_CLIENT_IP']; 
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; 
$remote = @$_SERVER['REMOTE_ADDR']; 
$result = array('country'=>'', 'city'=>''); 
if(filter_var($client, FILTER_VALIDATE_IP)){ 
    $ip = $client; 
}elseif(filter_var($forward, FILTER_VALIDATE_IP)){ 
    $ip = $forward; 
}else{ 
    $ip = $remote; 
} 
$ip_data = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=".$ip));  
if($ip_data && $ip_data->geoplugin_countryName != null){ 
    $result['country'] = $ip_data->geoplugin_countryCode; 
    $result['city'] = $ip_data->geoplugin_city; 
} 
return $result; 

}

http://php.net/manual/en/function.geoip-country-name-by-name.php

+0

我已經嘗試過了,返回所有關於暫存的信息,並在現場返回false。我想在服務器上的一些配置塊:( –

+0

對不起,錯誤的代碼 –

0

嘗試另一種方法:

<?php 

function ip_info($ip = NULL, $purpose = "location", $deep_detect = TRUE) { 
$output = NULL; 
if (filter_var($ip, FILTER_VALIDATE_IP) === FALSE) { 
    $ip = $_SERVER["REMOTE_ADDR"]; 
    if ($deep_detect) { 
     if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP)) 
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; 
     if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP)) 
      $ip = $_SERVER['HTTP_CLIENT_IP']; 
    } 
} 
$purpose = str_replace(array("name", "\n", "\t", " ", "-", "_"), NULL, strtolower(trim($purpose))); 
$support = array("country", "countrycode", "state", "region", "city", "location", "address"); 
$continents = array(
    "AF" => "Africa", 
    "AN" => "Antarctica", 
    "AS" => "Asia", 
    "EU" => "Europe", 
    "OC" => "Australia (Oceania)", 
    "NA" => "North America", 
    "SA" => "South America" 
); 
if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support)) { 
    $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip)); 
    if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2) { 
     switch ($purpose) { 
      case "location": 
       $output = array(
        "city"   => @$ipdat->geoplugin_city, 
        "state"   => @$ipdat->geoplugin_regionName, 
        "country"  => @$ipdat->geoplugin_countryName, 
        "country_code" => @$ipdat->geoplugin_countryCode, 
        "continent"  => @$continents[strtoupper($ipdat->geoplugin_continentCode)], 
        "continent_code" => @$ipdat->geoplugin_continentCode 
       ); 
       break; 
      case "address": 
       $address = array($ipdat->geoplugin_countryName); 
       if (@strlen($ipdat->geoplugin_regionName) >= 1) 
        $address[] = $ipdat->geoplugin_regionName; 
       if (@strlen($ipdat->geoplugin_city) >= 1) 
        $address[] = $ipdat->geoplugin_city; 
       $output = implode(", ", array_reverse($address)); 
       break; 
      case "city": 
       $output = @$ipdat->geoplugin_city; 
       break; 
      case "state": 
       $output = @$ipdat->geoplugin_regionName; 
       break; 
      case "region": 
       $output = @$ipdat->geoplugin_regionName; 
       break; 
      case "country": 
       $output = @$ipdat->geoplugin_countryName; 
       break; 
      case "countrycode": 
       $output = @$ipdat->geoplugin_countryCode; 
       break; 
     } 
    } 
} 
return $output; 
} 

?> 

使用方法:

<?php 

echo ip_info("173.252.110.27", "Country"); // United States 
echo ip_info("173.252.110.27", "Country Code"); // US 
echo ip_info("173.252.110.27", "State"); // California 
echo ip_info("173.252.110.27", "City"); // Menlo Park 
echo ip_info("173.252.110.27", "Address"); // Menlo Park, California, United States 

print_r(ip_info("173.252.110.27", "Location")); // Array ([city] => Menlo Park [state] => California [country] => United States [country_code] => US [continent] => North America [continent_code] => NA) 

?> 
0

嘗試這一個在兩行

$ip =(!ini_get('register_globals'))? $_SERVER['REMOTE_ADDR']:@$REMOTE_ADDR; //Get User Ip 

$user_country = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=".$ip); //Get his country by IP 
echo $user_country->geoplugin_countryName; //Et l'affiche enfin :p 

的其他細節,如:

echo "City"; 
echo $user_country->geoplugin_city; 

濟精確闕CE代碼fonctionne的確,MAIS IL EST ineficace SI le client est derriere un proxy。

在另一方面,如果你想進一步去恢復躲在代理 sibheke lokhu ezingeni