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 сделало его еще хуже. Теперь сообщение об ошибке {results: [], status: 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 ( [results] =› Array ( ) [status] =› 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 ( [results] =› Array ( ) [status] =› INVALID_REQUEST ) Ошибка произошло: 1 - person Tom; 02.10.2013
comment
var_dump => string(44) Sint Elooisstraat 30, 8800 Руселаре, Бельгия - person Tom; 02.10.2013
comment
Да, это работает с жестко заданным адресом, но моя форма предназначена для веб-сайта клиента. Поэтому он должен анализировать переменные $_POST и каким-то образом дает другой результат. - person Tom; 02.10.2013
comment
Тогда у вас проблемы с кодировкой. Ваш HTML, вероятно, не в utf-8? Вы можете преобразовать его через iconv. - person Glavić; 02.10.2013
comment
Спасибо, что указали на проблему с кодировкой! Я добавил ‹мета 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