Проверка наличия ключа в объектно-ориентированном программировании - PullRequest
0 голосов
/ 03 марта 2019

Данные из запроса Google API иногда отсутствуют (например, при вводе неверного адреса), и когда это происходит, возникает ужасная ошибка неизвестного ключа.Чтобы попытаться избежать уродливой ошибки, я обернул вызов в условное выражение, но, похоже, не могу заставить его работать таким образом, потому что мои навыки объектно-ориентированного программирования отсутствуют.Ниже приведено то, что я имею, и некоторые попытки, которые отмечены, так что я делаю не так?Мне действительно все равно, только если $ dataset-> results [0] допустимо, так как все, что будет после этого, будет, если это так.

$url = "https://maps.googleapis.com/maps/api/geocode/json?address=$Address&key=$googlekey";

// Retrieve the URL contents
$c = curl_init();
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_FRESH_CONNECT, true);
curl_setopt($c, CURLOPT_URL, $url);
$jsonResponse = curl_exec($c);
curl_close($c);    

$dataset = json_decode($jsonResponse);

if (isset($dataset->results[0])) :
//if (isset($dataset->results[0]->geometry->location)) :
//if (!empty($dataset)) :
//if (!empty($dataset) && json_last_error() === 0) :
    $insertedVal = 1;
    $latitude = $dataset->results[0]->geometry->location->lat;
    $longitude = $dataset->results[0]->geometry->location->lng;
    return "$latitude,$longitude";
endif;

1 Ответ

0 голосов
/ 03 марта 2019

Вы должны знать, что веб-служба API геокодирования также возвращает статус в ответе.Статус указывает, есть ли в ответе действительный элемент или что-то пошло не так, и у вас нет результата.

Просмотрите документацию https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes, и вы увидите, что естьследующие возможные статусы

  • "ОК"
  • "ZERO_RESULTS"
  • "OVER_DAILY_LIMIT"
  • "OVER_QUERY_LIMIT"
  • "REQUEST_DENIED"
  • " INVALID_REQUEST "
  • " UNKNOWN_ERROR "

Итак, прежде чем пытаться получить доступ к $dataset->results[0], сначала проверьте значение $dataset->status.Если все в порядке, вы можете безопасно получить результаты, в противном случае обработайте код ошибки правильно.

Фрагмент кода может быть

 $dataset = json_decode($jsonResponse);

 if ($dataset->status == "OK") {
     if (isset($dataset->results[0])) {
         $latitude = $dataset->results[0]->geometry->location->lat;
         $longitude = $dataset->results[0]->geometry->location->lng;
     }
 } elseif ($dataset->status == "ZERO_RESULTS") {
     //TODO: process zero results response 
 } elseif ($dataset->status == "OVER_DAILY_LIMIT" {
     //TODO: process over daily quota 
 } elseif ($dataset->status == "OVER_QUERY_LIMIT" {
     //TODO: process over QPS quota  
 } elseif ($dataset->status == "REQUEST_DENIED" {
     //TODO: process request denied  
 } elseif ($dataset->status == "INVALID_REQUEST" {
     //TODO: process invalid request response  
 } elseif ($dataset->status == "UNKNOWN_ERROR" {
     //TODO: process unknown error response 
 }

Надеюсь, это поможет!

...