2016-01-07 51 views
1

我正在嘗試使用geoplugin在PHP中獲取用戶的位置和城市。PHP反序列化偏移量的錯誤?

然而,當我運行這段代碼,我得到了以下錯誤:

Notice: unserialize(): Error at offset 0 of 172 bytes in ndex.php on line 21 

這是我的全部代碼:

$user_ip = getenv('REMOTE_ADDR'); 
echo $user_ip; 
$geo = unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=".$user_ip."")); 
$city = $geo["geoplugin_city"]; 
$region = $geo["geoplugin_regionName"]; 
$country = $geo["geoplugin_countryName"]; 
echo "City: ".$city."<br>"; 
echo "Region: ".$region."<br>"; 
echo "Country: ".$country."<br>"; 

和在錯誤中所示的線21是這樣的:

$geo = unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=".$user_ip."")); 

我已經使用其他服務器上的代碼和工作得很好,但在新服務器上,我得到臨屋t錯誤,我不知道爲什麼。

可能有人請告知這個問題?

任何幫助,將不勝感激。

編輯:

我修改了代碼以下,仍然得到了同樣的錯誤:

$user_ip = getenv('REMOTE_ADDR'); 


$geo = file_get_contents("http://www.geoplugin.net/php.gp?ip=".$user_ip.""); 
$string = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $geo); 
$geo = unserialize($string); 

$city = $geo["geoplugin_city"]; 
$region = $geo["geoplugin_regionName"]; 
$country = $geo["geoplugin_countryName"]; 
echo "City: ".$city."<br>"; 
echo "Region: ".$region."<br>"; 
echo "Country: ".$country."<br>"; 
+2

你檢查了什麼文件獲取內容返回?可能是服務器問題 –

+0

一切都可以與您的代碼。我得到充分的迴應:https://www.dropbox.com/s/n2xzt01isbpdcn8/Screenshot%202016-01-07%2014.03.28.png?dl=0 – CroiOS

+0

@AndreyMussatov,我做了'var_dump($ geo)'和我在頁面上看到:'bool(false)' – rooz

回答

1

從URL中的輸出似乎不正確序列化,至少在英國

http://www.geoplugin.net/php.gp?ip=81.201.130.8

其中給出: - IP地址我通過手動去到URL測試

a:18:{s:17:"geoplugin_request";s:12:"81.201.130.8";s:16:"geoplugin_status";i:206;s:16:"geoplugin_credit";s:145:"Some of the returned data includes GeoLite data created by MaxMind, available from <a href=\'http://www.maxmind.com\'>http://www.maxmind.com</a>.";s:14:"geoplugin_city";s:0:"";s:16:"geoplugin_region";s:0:"";s:18:"geoplugin_areaCode";s:1:"0";s:17:"geoplugin_dmaCode";s:1:"0";s:21:"geoplugin_countryCode";s:2:"GB";s:21:"geoplugin_countryName";s:14:"United Kingdom";s:23:"geoplugin_continentCode";s:2:"EU";s:18:"geoplugin_latitude";s:4:"51.5";s:19:"geoplugin_longitude";s:5:"-0.13";s:20:"geoplugin_regionCode";s:0:"";s:20:"geoplugin_regionName";N;s:22:"geoplugin_currencyCode";s:3:"GBP";s:24:"geoplugin_currencySymbol";s:6:"&#163;";s:29:"geoplugin_currencySymbol_UTF8";s:2:"£";s:27:"geoplugin_currencyConverter";s:6:"0.6834";} 

粘貼到這一個在線unserializer(如http://blog.tanist.co.uk/files/unserialize/)確認它不工作 - 我認爲這是監守它的治療的井號爲2個字符(因爲它是UTF-8) - 如果我更換S:2:」 £「與s:1:」£「它正確地反序列化。

+0

完美適用於我的英國ipaddress,它雖然 – RiggsFolly

+0

沒有提供太多的實際數據我可以使用IP正確地反序列化結果:「81.201.130.8」 – segFault

+0

出於興趣,所有人都使用哪種版本的PHP?我正在使用5.6.15所有5.5.30版本,而舊版本似乎遇到了'geoplugin_currencySymbol_UTF8'字段的問題。可以理解的 – RiggsFolly