0

我得到了以下代码,但它似乎没有得到正确的纬度和经度值。它给了我 0,000000 作为回报。当我检查地址时,它会在 json 中为我提供正确的值。

mysql_select_db($dbname);

$result = mysql_query("SELECT id, street, postalcode, place, lat, lng FROM stores") or die(mysql_error());  

while($row = mysql_fetch_array( $result )){

$addressbar = $row['street']." ".$row['postalcode']." ".$row['place'];

$address = urlencode($addressbar);

$json = file_get_contents("http://maps.googleapis.com/maps/api/geocode/json?address=$address&sensor=true");
$decoded = json_decode($json);

$lat = $decoded->results[0]->geometry->location->lat;
$lng = $decoded->results[0]->geometry->location->lng;

mysql_query("UPDATE stores SET lat='$lat', lng='$lng' WHERE id=".$row['id']."") or die(mysql_error());
printf( $addressbar."%d\n", mysql_affected_rows());
echo "<br/><br/>";
}

我似乎找不到我做错了什么。我希望任何人都可以帮助我。

4

2 回答 2

2

一些东西!要调试,我会执行以下操作:

  1. 确保使用严格;& 使用警告;位于代码的顶部(您可能这样做了,但它没有显示在代码段中)。
  2. 我会打印出 $json,如果您从地图 api 中返回 0,您可能会在 $json 文本中看到错误消息。如果您在 $json 中获取 lat/lng,则在 mysql 查询中添加更多调试或在查询进入 exec 函数之前打印出查询。例如添加更多调试:

    DBI->connect( $dsn, $username, $password, { 'PrintError' => 1 } )
    
  3. 如果它不在 $json 中,那么我将手动转到地图 api URL 以查看我返回的内容

  4. 我猜你是从上面的 URL 中删除了它(我没有看到 &key=AAABB .....),但请仔细检查你的地图 API 密钥是否正确
  5. 我确定您相信来自 google 的数据,但请养成在进行任何查询时使用占位符的习惯。占位符 (?) 不是将变量直接放在 SQL 代码中,而是保护您免受 SQL 注入。前任:

    $mysqlquery = $dbh->prepare( 'UPDATE stores SET lat=?, lng=? WHERE id=?' );
    $mysqlquery->execute( $lat, $lng, $row['id'] );
    
  6. 有时,当我调试打印出我将要发送到 API 的内容时,它会帮助我。不要将 URL 或查询直接发送到函数,而是将其放入变量中,打印出该变量,然后将变量发送到函数/api。您可能会假设它是正确的,但是如果您看到字符串,一些小问题会阻止它工作,这是显而易见的。

希望这对大家有所帮助,祝你好运!

于 2012-07-03T17:58:51.937 回答
1

谷歌查询码和JSON解码正确;我自己尝试过,如果地址检查(我尝试过的那个),它会正确发出 lat 和 lng。

尝试打印查询并检查从客户端手动执行它。

我想到的唯一可能性是:

  • 你没有表的 UPDATE 权限(你应该得到一个错误)
  • 也许“商店”是一个不可更新的视图(应该抛出错误 1288)
  • "$lat" 和/或 "$lng" 的值不是数字,而是字符串,甚至是空字符串。这不会给您任何错误,并且值为 0.00000。

我没有想到的其他可能性:

  • 由于防火墙、网络问题或 OVER_QUERY_LIMIT,Google 无法正确回答。
  • 地址的UTF编码问题

我也投票赞成艾伦霍尔曼的建议。

于 2012-07-03T18:29:52.807 回答