简体   繁体   中英

php file_get_contents() returning false with a valid url

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 !

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

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){
    //...

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/>";
}

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/>";
    } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM