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 ..... が表示されません)、maps 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

GoogleのクエリコードとJSONデコードは正しいです。私はそれらを自分で試しました、そして、アドレスチェック(私が試したもの)なら、それは正しくlatとlngを発行します。

クエリを印刷して、クライアントから手動で実行することを確認してみてください。

私に来た唯一の可能性は次のとおりです。

  • テーブルに対するUPDATE権限がありません(エラーが発生しているはずです)
  • 「ストア」は更新不可能なビューである可能性があります(エラー1288をスローする必要があります)
  • 「$lat」および/または「$lng」の値は数値ではなく、文字列、または空の文字列です。これにより、エラーは発生せず、値は0.00000になります。

私に来なかった他の可能性:

  • ファイアウォール、ネットワークの問題、またはOVER_QUERY_LIMITが原因で、Googleが適切に応答していません。
  • アドレスのUTFエンコーディングの問題

アレン・ホルマンのアドバイスにも投票します。

于 2012-07-03T18:29:52.807 に答える