3

I'm currently working on a geocoding php function, using google maps API. Strangely, file_get_contents() returns bool(false) whereas the url I use is properly encoded, I think.

In my browser, when I test the code, the page takes a very long time to load, and the geocoding doesn't work (of course, given that the API doesn't give me what I want).

Also I tried to use curl, no success so far.

If anyone could help me, that'd be great !

Thanks a lot.

The code :

function test_geocoding2(){

    $addr = "14 Boulevard Vauban, 26000 Valence";
    if(!gc_geocode($addr)){
        echo "false <br/>";
    }
}

function gc_geocode($address){

    $address = urlencode($address);
    $url = "http://maps.google.com/maps/api/geocode/json?address={$address}";

    $resp_json = file_get_contents($url);

    $resp = json_decode($resp_json, true);

    if($resp['status']=='OK'){
        $lati = $resp['results'][0]['geometry']['location']['lat'];
        $longi = $resp['results'][0]['geometry']['location']['lng'];

        if($lati && $longi){
            echo "(" . $lati . ", " . $longi . ")";
        }else{
            echo "data not complete <br/>";
            return false;
        }

    }else{
        echo "status not ok <br/>";
        return false;
    }
}

UPDATE : The problem was indeed the fact that I was behind a proxy. I tested with another network, and it works properly. However, your answers about what I return and how I test the success are very nice as well, and will help me to improve the code.

Thanks a lot !

Reyedy
  • 918
  • 2
  • 13
  • 36
  • 1
    Most probably you are using some proxy for internet. http://stackoverflow.com/questions/5211887/how-to-use-curl-via-a-proxy – Ali Jun 22 '16 at 10:51
  • You never return anything other than `false` in the function `gc_geocode()`... you `echo` other things, but never return `true` afterwards – Ben Jun 22 '16 at 10:52
  • 1
    Try `if (gc_geocode($addr) === false)` – vp_arth Jun 22 '16 at 10:55

4 Answers4

2

The problem was the fact that I was using a proxy. The code is correct.

To check if there is a proxy between you and the Internet, you must know the infrastructure of your network. If you work from a school or a company network, it is very likely that a proxy is used in order to protect the local network. If you do not know the answer, ask your network administrator.

If there is no declared proxy in your network, it is still possible that a transparent proxy is there. However, as states the accepted answer to this question: https://superuser.com/questions/505772/how-can-i-find-out-if-there-is-a-proxy-between-myself-and-the-internet-if-there

If it's a transparent proxy, you won't be able to detect it on the client PC.

Some website also provide some proxy detectors, though I have no idea of how relevant is the information given there. Here are two examples :

http://amibehindaproxy.com/

http://www.proxyserverprivacy.com/free-proxy-detector.shtml

Reyedy
  • 918
  • 2
  • 13
  • 36
1

Take a look at the if statement:

if(!gc_geocode($addr)){
    echo "false <br/>";
}

This means that if gc_geocode($addr) returns either false or null, this statement will echo "false".

However, you never actually return anything from the function, so on success, it's returning null:

$address = urlencode($address);
$url = "http://maps.google.com/maps/api/geocode/json?address={$address}";
$resp_json = file_get_contents($url);
$resp = json_decode($resp_json, true);
    if($lati && $longi){
        echo "(" . $lati . ", " . $longi . ")"; //ECHO isn't RETURN
        /* You should return something here, e.g. return true */
    } else {
        echo "data not complete <br/>";
        return false;
    }
} else {
    echo "status not ok <br/>";
    return false;
}

Alternatively, you can just change the if statement to only fire when the function returns false:

if(gc_geocode($addr)===false){
    //...
Ben
  • 8,894
  • 7
  • 44
  • 80
1

When you are not return anything function returns null.
Just use that:

if(!is_null(gc_geocode($addr))) {
    echo "false <br/>";
}

Or:

if(gc_geocode($addr) === false) {
    echo "false <br/>";
}
vp_arth
  • 14,461
  • 4
  • 37
  • 66
1

Above function gc_geocode() working properly on my system, without any extra load. You have called gc_geocode () it returns you lat, long that is correct now you have check through

if(!gc_geocode($addr)){
    echo "false <br/>";
} 

Use

  if($responce=gc_geocode($addr)){
      echo $responce;       
    }
  else{
     echo "false <br/>";
    } 
Anand Jain
  • 779
  • 2
  • 10
  • 32