PHP Google Geocode с curl отказва да работи

В момента се опитвам да получа параметрите lat и lng за адрес чрез използването на API на Google Geocode в PHP страница.

В момента имам следния код, но по някакъв начин той не работи чрез php, докато копирането на генерирания адрес в Google Chrome изглежда работи.

Може ли някой да види грешката в кода по-долу?

Благодаря предварително!

Том

====================================================

Върнатата грешка е:

( [error_message] => The 'sensor' parameter specified in the request must be set to either 'true' or 'false'. [results] => Array ( ) [status] => REQUEST_DENIED ) An error has occured: 1

Стар код с остарели части:

$googleQuery = $_POST['txtAdres'] . ',+' . $_POST['txtPostcode'] . '+' . $_POST['txtStad'] . ',+' . $_POST['txtLand'];
$googleQuery = str_replace(' ', '+', $googleQuery);

// retrieve the latitude & longitude from the address
$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode($googleQuery) . '&sensor=false';
$url = htmlspecialchars($url);

echo $url;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = json_decode(curl_exec($ch), true);
if ($response['status'] != 'OK') {
  echo 'An error has occured: ' . print_r($response);
} else {
    $geometry = $response['results'][0]['geometry'];
    $longitude = $geometry['location']['lat'];
    $latitude = $geometry['location']['lng'];
}

====================================================

РЕДАКТИРАНЕ 1 - Добавен е HTML код към всяка уеб страница, за да работи

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

РЕДАКТИРАНЕ 1 - Фиксиран и работещ код:

// create address string
$googleQuery = $_POST['txtAdres'] . ', ' . $_POST['txtPostcode'] . ' ' . $_POST['txtStad'] . ', ' . $_POST['txtLand'];

// retrieve the latitude & longitude from the address
$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode($googleQuery) . '&sensor=false';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = json_decode(curl_exec($ch), true);
if ($response['status'] != 'OK') {
  echo 'An error has occured: ' . print_r($response);
} else {
    $geometry = $response['results'][0]['geometry'];
    $longitude = $geometry['location']['lat'];
    $latitude = $geometry['location']['lng'];
}

person Tom    schedule 02.10.2013    source източник


Отговори (2)


Имате невалиден $url. Не правете $url = htmlspecialchars($url); преди да извикате CURL.

промяна:

// ...
$url = htmlspecialchars($url);
echo $url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// ...

към (или нещо):

// ...
echo htmlspecialchars($url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
// ...

Редактиране 1:

И генерирането на вашия адрес е невалидно. Вместо:

$googleQuery = $_POST['txtAdres'] . ',+' . $_POST['txtPostcode'] . '+' . $_POST['txtStad'] . ',+' . $_POST['txtLand'];
$googleQuery = str_replace(' ', '+', $googleQuery);

do:

$googleQuery = $_POST['txtAdres'] . ', ' . $_POST['txtPostcode'] . ' ' . $_POST['txtStad'] . ', ' . $_POST['txtLand'];

Редактиране 2:

Ето валиден пример:

$googleQuery = 'Sint Elooisstraat 30, 8800 Roeselare, België';
$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode($googleQuery) . '&sensor=false';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = json_decode(curl_exec($ch), true);
print_r($response);
person Glavić    schedule 02.10.2013
comment
Премахването на htmlspecialchars го направи още по-лошо. Сега съобщението за грешка е { резултати : [], състояние : INVALID_REQUEST } - person Tom; 02.10.2013
comment
Можете ли да покажете изход за променлива $url? p.s. Току-що тествах този скрипт и работи за мен. - person Glavić; 02.10.2013
comment
върнат url с тестови данни (без htmlspecialchars): maps.googleapis.com/maps/api/geocode/ Съобщението за грешка е: Array ( [резултати] =› Array ( ) [статус] =› INVALID_REQUEST ) Възникна грешка: 1 URL адресът с htmlspecialchars: maps.googleapis.com/maps/api/geocode/ - person Tom; 02.10.2013
comment
Вашият адрес е невалиден. Опитайте това. Изтрийте този str_replace(), който замества интервалите до + и тези + от свързването на публикуваните данни в низ; всичко това се прави от функцията urlecnode(). - person Glavić; 02.10.2013
comment
Изходният url сега е: maps.googleapis.com/maps/api/geocode/ и съобщението за грешка все още е: Array ( [резултати] =› Array ( ) [status] =› INVALID_REQUEST ) Грешка се е случило: 1 - person Tom; 02.10.2013
comment
var_dump =› string(44) Sint Elooisstraat 30, 8800 Roeselare, Белгия - person Tom; 02.10.2013
comment
Да, направих, това работи с твърдо кодирания адрес, но формулярът ми е за уебсайт на клиент. Така че трябва да анализира $_POST променливи и по някакъв начин по този начин дава друг резултат. - person Tom; 02.10.2013
comment
Тогава имате проблеми с кодирането. Вашият HTML вероятно не е в utf-8? Можете да го конвертирате чрез iconv. - person Glavić; 02.10.2013
comment
Благодаря ви, че посочихте този проблем с кодирането! Добавих ‹meta http-equiv=Content-Type content=text/html; charset=utf-8 /› към различните страници и проблемът е решен! - person Tom; 03.10.2013

са имали този проблем в рамките на CLI скрипт.

трябваше да се уверя, че данните ми (които бяха импортирани от CSV файл) са UTF-8 кодирани:

$address = utf8_encode($address);
$address = rawurlencode($address);  

също низ, който трябваше да предам от скрипта, който трябваше първо да конвертирам в ASCII, преди да го конвертирам в UTF-8 (или htmlentities, което също работи):

mb_convert_encoding('Österreich', 'US-ASCII', 'UTF-8')

or

htmlentities('Österreich', ENT_COMPAT, 'UTF-8')
person n0mad    schedule 07.11.2015