Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php JSON符号转换导致错误_Php_Geocode_Ampersand - Fatal编程技术网

Php JSON符号转换导致错误

Php JSON符号转换导致错误,php,geocode,ampersand,Php,Geocode,Ampersand,当我试图解析我的地理代码链接时,由于amp;陈述在我“json_decode”字符串之前,我有一个名为www.something.com/something?bla=bla&sensor=true的链接,但当我将其作为参数发送到函数时,它的&character正在转换为&。链接如 http://maps.googleapis.com/maps/api/geocode/json?address=Bekirdere,%20%C4%B0zmir&sensor=true 工作正常,但链

当我试图解析我的地理代码链接时,由于amp;陈述在我“json_decode”字符串之前,我有一个名为www.something.com/something?bla=bla&sensor=true的链接,但当我将其作为参数发送到函数时,它的&character正在转换为
&。链接如

http://maps.googleapis.com/maps/api/geocode/json?address=Bekirdere,%20%C4%B0zmir&sensor=true 
工作正常,但链接类似

http://maps.googleapis.com/maps/api/geocode/json?address=Bekkirdere,%20%C4%B0zmit&sensor=true 
没有给出任何结果。(
&
转换为
&

我怎样才能阻止它被转换

我的解析器函数:

function get_url_contents($url) 
{
    $url = str_replace(' ', '%20', $url); 
    $crl = curl_init();
    $timeout = 5;
    curl_setopt ($crl, CURLOPT_URL,$url);
    curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
    $ret = curl_exec($crl);
    curl_close($crl);
    return $ret;
}

function __construct($url)
{
    $json = $this->get_url_contents($url);
    $this->_jsonArray = json_decode($json, true);
}
PHP函数比str_替换更好,您应该只对URL中属于GET值的部分进行编码;您不应该对整个URL进行编码,因为正如您所指出的,这也会对将变量彼此分离的符号进行编码

您需要构建如下URL:

$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=';
$url .= urlencode('Bekirdere, Izmir');
$url .= '&sensor=true';
然后按照上面的方法执行
curl
调用

我已经测试了下面的测试脚本,它可以正常工作:

$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=';
$url .= urlencode('Bekirdere, Izmir');
$url .= '&sensor=true';

$crl = curl_init();
$timeout = 5;
curl_setopt ($crl, CURLOPT_URL,$url);
curl_setopt ($crl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
$ret = curl_exec($crl);
curl_close($crl);

$returned_data = json_decode($ret, true);
var_dump($returned_data);

您需要将其融入您的代码结构或重构您的类,以接收
$address
参数(例如“Izmir,Turkey”),而不是完整的URL(现在的情况)。这样,在构建完整的URL以传递给
curl

之前,您就可以避开地址部分。您的问题与JSON编码/解码无关。在页面上回显您的URL和“查看源代码”,您将看到它是
&一直。我确实回显了它,是的,它有“amp;”但是当我访问带有amp;上面写着“请求被拒绝”。但是,如果我手动将“amp;”替换为“&”,链接将返回正确的结果在那里。它的出现是因为在代码中的某个地方,您正在使用
htmlspecialchars()
或类似代码对URL进行编码。如果您正在输出HTML或XML,这将是正确的,但是由于您直接使用URL,因此您就有问题了。你应该放弃这个问题,创建一个与你的问题相关的新问题。我很感激你的回答,但我不知道编码地址会有什么帮助?最后,这没有帮助。也许我误解了这个问题。您的
curl
请求失败是因为Google无法处理包含转义符号的请求URL吗?通过只对URL中需要编码的部分进行编码,
curl
将请求不带转义符号的页面,从而成功返回JSON(当您
JSON\u decode()
it时会有结果)。它过去可以工作,但现在不行了。我认为,这与编码有关。因为当我手动访问页面时(使用replacement&;to&manually),页面返回值。这对我来说绝对是一样的,curl应该以完全相同的方式工作。如果只对邮政地址(“Bekirdere,Izmir”)进行编码,URL中的符号将保持未编码状态,因此,您将获得预期的JSON。你试过了吗?没有用。我只删除了str_replace发生的行。我是否应该删除任何其他行以防止编码?