【问题标题】:php unserialize error at offset? [duplicate]php在偏移处反序列化错误? [复制]
【发布时间】:2016-04-11 20:56:17
【问题描述】:

我正在尝试使用 geoplugin 在 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.""));

我在其他服务器上使用过这段代码并且工作得很好,但是在新服务器上我得到了我不知道为什么的错误。

有人可以就这个问题提出建议吗?

任何帮助将不胜感激。

编辑:

我将代码编辑为以下内容,但仍然出现相同的错误:

$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>";

【问题讨论】:

  • 你检查过什么文件获取内容返回?可能是服务器问题
  • 您的代码一切正常。我得到了完整的回复:dropbox.com/s/n2xzt01isbpdcn8/…
  • @AndreyMussatov,我做了`var_dump($geo)`,我在页面上得到了这个:bool(false)
  • @CroiOS,我知道,因为我在另一台服务器上使用相同的代码没有任何问题,所以问题出在我认为的服务器上,但我不知道这个问题的原因是什么!
  • 考虑使用其他 IP 信息服务,例如:ipinfo.io

标签: php


【解决方案1】:

该 URL 的输出似乎没有正确序列化,至少对于基于英国的 IP 地址而言 - 我通过手动转到该 URL 进行了测试:

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

这给出了:

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";}

将其粘贴到在线反序列化程序(例如 http://blog.tanist.co.uk/files/unserialize/)中确认它不起作用 - 我认为这是因为它将井号符号视为 2 个字符(因为它是 UTF-8) - 如果我替换 s:2:"£ " 与 s:1:"£" 正确反序列化。

【讨论】:

  • 非常适合我的英国 IP 地址,但它并没有提供太多实际数据
  • 我能够使用 IP: "81.201.130.8" 正确反序列化结果
  • 出于兴趣,大家都在用什么版本的PHP??我正在使用 5.6.15 所有版本 5.5.30 和更早的版本似乎与 geoplugin_currencySymbol_UTF8 字段有问题。真的可以理解
  • 问题是完全相同的代码在另一台服务器上运行良好!
猜你喜欢
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2018-09-24
  • 1970-01-01
  • 2013-06-25
相关资源
最近更新 更多