在数据库中更新谷歌地图lat / lng

时间:2012-07-03 14:48:55

标签: php mysql google-maps latitude-longitude

我得到了以下代码,但它似乎没有得到lat和long的正确值。它给了我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/>";
}

我似乎无法找到我做错的事。我希望任何人都可以帮助我。

2 个答案:

答案 0 :(得分:2)

一些事情!要进行调试,我会执行以下操作:

  1. 确保使用严格; &安培;使用警告;在你的代码的顶部(你可能做了这个,但它没有显示我的代码片段。)
  2. 我打印出$ json,如果你从地图api得到0,你可能会在$ json文本中看到错误信息。如果你在$ json中得到lat / lng,那么在你的mysql查询中添加更多的调试,或者在它进入exec函数之前打印出查询。例如,添加更多调试:

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

  4. 我猜你从上面的网址中删除了它(我看不到&amp; 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。您可能认为它是正确的,但是一些小问题阻止它工作,如果您看到字符串就很明显。

  7. 希望这一切都有所帮助,祝你好运!

答案 1 :(得分:1)

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

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

我遇到的唯一可能性是:

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

的其他可能性来找我:

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

我也投票支持艾伦霍尔曼的建议。