Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php GOOGLE Maps API v3与MySQL的动态关系_Php_Mysql_Database_Google Maps Api 3 - Fatal编程技术网

Php GOOGLE Maps API v3与MySQL的动态关系

Php GOOGLE Maps API v3与MySQL的动态关系,php,mysql,database,google-maps-api-3,Php,Mysql,Database,Google Maps Api 3,我正在设计我自己的第一个网页。这是一个不动产页面,一些用户会在其中添加开放式信息,而其他用户则可以提取这些信息。 数据库和web的代码非常好(两个月后…),插入和获取数据非常好。。。 现在谷歌地图。我正在尝试像trulia这样的东西,甚至是非常原创的东西(似乎是他们开始了混搭,对吧?)。crimereports.com也很不错 目标:从数据库中提取地址,从地理编码中获取long和lat,将其插入到表中,显示在谷歌地图中。另外:当人们浏览地图时,新的信息会弹出到地图中 以下是用于检索地址、地理代码

我正在设计我自己的第一个网页。这是一个不动产页面,一些用户会在其中添加开放式信息,而其他用户则可以提取这些信息。 数据库和web的代码非常好(两个月后…),插入和获取数据非常好。。。 现在谷歌地图。我正在尝试像trulia这样的东西,甚至是非常原创的东西(似乎是他们开始了混搭,对吧?)。crimereports.com也很不错

目标:从数据库中提取地址,从地理编码中获取long和lat,将其插入到表中,显示在谷歌地图中。另外:当人们浏览地图时,新的信息会弹出到地图中

以下是用于检索地址、地理代码以及将lat和lng添加回数据库的代码

<?php
//require("phpsqlajax_dbinfo.php");

// Opens a connection to a MySQL server
$username = "abc"; //personal info changed to abc
$password = "abc";
$hostname = "abc"; 
$database = "abc";
$connection = mysqli_connect($hostname, $username, $password);
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

//if (!$connection) {
  //die("Not connected : " . mysql_error());
//}

define("MAPS_HOST", "maps.google.com");
define("KEY", "my .............key........code");



// Set the active MySQL database
$db_selected = mysqli_select_db($connection, $database);
if (!$db_selected) {
  die("Can\'t use db : " . mysql_error());
}

// Select all the rows in the markers table
$query = "SELECT * FROM brokerstour.property WHERE 1";
$result = mysqli_query($connection, $query);
if (!$result) {
  die("Invalid query: " . mysql_error());
}

// Initialize delay in geocode speed
$delay = 0;
$base_url = "http://maps.googleapis.com/maps/api/geocode/output?parameters";

// Iterate through the rows, geocoding each address
while ($row = @mysqli_fetch_assoc($result)) {
  $geocode_pending = true;

  while ($geocode_pending) {
    $address = $row["address"];
    $id = $row["id"];
    $request_url = $base_url . "&q=" . urlencode($address);
    $xml = simplexml_load_file($request_url) or die("url not loading");

    $status = $xml->Response->Status->code;
    if (strcmp($status, "200") == 0) {
      // Successful geocode
      $geocode_pending = false;
      $coordinates = $xml->Response->Placemark->Point->coordinates;
      $coordinatesSplit = split(",", $coordinates);
      // Format: Longitude, Latitude, Altitude
      $lat = $coordinatesSplit[1];
      $lng = $coordinatesSplit[0];

      $query = sprintf("UPDATE property " .
             " SET lat = '%s', lng = '%s' " .
             " WHERE id = '%s' LIMIT 1;",
             mysql_real_escape_string($lat),
             mysql_real_escape_string($lng),
             mysql_real_escape_string($id));
      $update_result = mysql_query($query);
      if (!$update_result) {
        die("Invalid query: " . mysql_error());
      }
    } else if (strcmp($status, "620") == 0) {
      // sent geocodes too fast
      $delay += 100000;
    } else {
      // failure to geocode
      $geocode_pending = false;
      echo "Address " . $address . " failed to geocoded. ";
      echo "Received status " . $status . "
\n";
    }
    usleep($delay);
  }
}
?>
响应->状态->代码;
如果(strcmp($status,“200”)==0){
//成功的地理编码
$geocode_pending=false;
$coordinates=$xml->Response->Placemark->Point->coordinates;
$CoordinationsSplit=拆分(“,”,$Coordinations);
//格式:经度、纬度、高度
$lat=$CoordinationsSplit[1];
$lng=$coordinatesSplit[0];
$query=sprintf(“更新属性”)。
设置纬度='%s',液化天然气='%s'。
其中id='%s'限制1;“,
mysql\u real\u escape\u字符串($lat),
mysql\u real\u escape\u字符串($lng),
mysql_real_escape_字符串($id));
$update\u result=mysql\u query($query);
如果(!$update\u结果){
die(“无效查询:”.mysql_error());
}
}否则如果(strcmp($status,“620”)==0){
//发送地理代码太快了
$delay+=100000;
}否则{
//地理编码失败
$geocode_pending=false;
回显“地址”。$Address。“无法进行地理编码。”;
回显“已接收状态”。$status。“
\n”;
}
usleep(延迟);
}
}
?>
以下是我对Google教程所做的更改(原始代码): 1) 更新了php:mysqli以避免错误。没有得到更多的php错误。 2) 已将url从“http://”更改。映射你的主机。“/maps/geo?output=xml”。“&key=”。钥匙 到 "" 正在尝试将代码更新到API v3

如果我使用旧的url,我会得到错误610。 使用新的url,我得到:


(!)尖叫:已为忽略错误抑制 (!)警告:simplexml_load_file():I/O警告:无法加载外部实体“maps.googleapis.com/maps/api/geocode/output?参数&q=4200+Park+Blvd+”,在C:。。。。在线57

url未加载 充分披露:我是一个非常新的人,也许以上这些都没有意义。然而,我已经在这个问题上坚持了一个星期。(顺便说一句,对于那些刚接触谷歌地图的人来说,谷歌API 3开头的那本书是必须的。虽然它不涉及数据库,但它很好地解释了谷歌地图API)

有人能给我一个提示、一本书、一个教程吗?任何帮助都是巨大的帮助。 谢谢你抽出时间

<?php

$conn = mysql_connect('localhost', 'rxxt', 'xxxxxxx');
if(!$conn)
 {
   echo "Database Error.";
 }
 else
 {
   echo "Connected.";
   mysql_select_db('YOUR TABLE', $conn);
   $query = "SELECT * from YOUR TABLE";
   $result = mysql_query($query, $conn) or die($query.mysql_error());
    while($row = mysql_fetch_array($result))
    { 

      $address = $row['address'];
      $id = $row['id'];

      $loc_address = str_replace(" ", "+", $address); //to replace spaces by '+' signs
          $location = $loc_address;
      echo $location."<br>";
      $delay = 0;  // this delay is here just to avoid errors - 
          $url = "http://maps.google.com/maps/api/geocode/json?address=".$location."&sensor=false";
          echo $url;
            $output=file_get_contents($url);
            $out= json_decode($output);
            $lat = $out->results[0]->geometry->location->lat;
            $lng = $out->results[0]->geometry->location->lng;
            echo '<br>Lat is '. $lat;
            echo '<br>Long is '. $lng;


       $query = sprintf("UPDATE YOUR TABLE " .
             " SET lat = '%s', lng = '%s' " .
             " WHERE id = '%s' LIMIT 1;",
             mysql_real_escape_string($lat),
             mysql_real_escape_string($lng),
             mysql_real_escape_string($id));
           $update_result = mysql_query($query);

      echo "Successfully inserted.";
    // Below is just for reference - they say we need the delay. The may problem: does not get the status to compare to 200, 620, etc.   
    /*$status = $xml->Response->Status->code;  
    if (strcmp($status, "200") == 0) {
            // Successful geocode
            echo '<br />successfull geocode</strong><br />';
            $geocode_pending = false;
    }
    else if (strcmp($status, "620") == 0) {
         // sent geocodes too fast
         $delay += 100000;
            } else {
         // failure to geocode
         $geocode_pending = false;
         echo "Address " . $address . " failed to geocoded. ";
         echo "Received status " . $status . "
        \n";
          }*/
    usleep($delay); 
    }
 }
mysql_close($conn);
?>
第57行是 $xml=simplexml_load_file($request_url)或die(“url未加载”)

$base\u url=”http://maps.googleapis.com/maps/api/geocode/output?parameters";不指定输出。它应该是
xml
jason
。您传递的参数还有地址和
sensor=false
sensor=true

编辑

$q = $row["address"];
$base_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
$request_url = $base_url.urlencode($q)."&sensor=false";
$xml = simplexml_load_file($request_url) or die("url not loading");
if($xml->status=="OK"){
    // Successful geocode
    $lat = $xml->result->geometry->location->lat;
    $lng = $xml->result->geometry->location->lng; 
    echo $lat.","$lng."<br>";//
    } 
    }
除去

$geocode_pending = true;
while ($geocode_pending) {
结束编辑

$q = $row["address"];
$base_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
$request_url = $base_url.urlencode($q)."&sensor=false";
$xml = simplexml_load_file($request_url) or die("url not loading");
if($xml->status=="OK"){
    // Successful geocode
    $lat = $xml->result->geometry->location->lat;
    $lng = $xml->result->geometry->location->lng; 
    echo $lat.","$lng."<br>";//
    } 
    }
编辑

$q = $row["address"];
$base_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
$request_url = $base_url.urlencode($q)."&sensor=false";
$xml = simplexml_load_file($request_url) or die("url not loading");
if($xml->status=="OK"){
    // Successful geocode
    $lat = $xml->result->geometry->location->lat;
    $lng = $xml->result->geometry->location->lng; 
    echo $lat.","$lng."<br>";//
    } 
    }
echo$lat.,“$lng.”
“// } }

删除其余的代码,并确保在开始添加其余的代码之前能够正常工作

这是部分成功。 此代码完成以下任务: a) 从表中获取地址; b) 从谷歌获取lat和lnt; c) 将数据插入到表中

我还需要解决这个问题。此外,我是一个3个月大的程序员。。。我花了两周的时间才完成上面的工作。。。我把延迟留在那里只是为了参考(这是谷歌的教程,里面有来自网络上其他人的更改。)

我试图投票支持斯特拉坎先生的答案,但我在堆栈溢出中缺乏声誉。。。我做不到。这一修正方案同样有效。谢谢你抽出时间

<?php

$conn = mysql_connect('localhost', 'rxxt', 'xxxxxxx');
if(!$conn)
 {
   echo "Database Error.";
 }
 else
 {
   echo "Connected.";
   mysql_select_db('YOUR TABLE', $conn);
   $query = "SELECT * from YOUR TABLE";
   $result = mysql_query($query, $conn) or die($query.mysql_error());
    while($row = mysql_fetch_array($result))
    { 

      $address = $row['address'];
      $id = $row['id'];

      $loc_address = str_replace(" ", "+", $address); //to replace spaces by '+' signs
          $location = $loc_address;
      echo $location."<br>";
      $delay = 0;  // this delay is here just to avoid errors - 
          $url = "http://maps.google.com/maps/api/geocode/json?address=".$location."&sensor=false";
          echo $url;
            $output=file_get_contents($url);
            $out= json_decode($output);
            $lat = $out->results[0]->geometry->location->lat;
            $lng = $out->results[0]->geometry->location->lng;
            echo '<br>Lat is '. $lat;
            echo '<br>Long is '. $lng;


       $query = sprintf("UPDATE YOUR TABLE " .
             " SET lat = '%s', lng = '%s' " .
             " WHERE id = '%s' LIMIT 1;",
             mysql_real_escape_string($lat),
             mysql_real_escape_string($lng),
             mysql_real_escape_string($id));
           $update_result = mysql_query($query);

      echo "Successfully inserted.";
    // Below is just for reference - they say we need the delay. The may problem: does not get the status to compare to 200, 620, etc.   
    /*$status = $xml->Response->Status->code;  
    if (strcmp($status, "200") == 0) {
            // Successful geocode
            echo '<br />successfull geocode</strong><br />';
            $geocode_pending = false;
    }
    else if (strcmp($status, "620") == 0) {
         // sent geocodes too fast
         $delay += 100000;
            } else {
         // failure to geocode
         $geocode_pending = false;
         echo "Address " . $address . " failed to geocoded. ";
         echo "Received status " . $status . "
        \n";
          }*/
    usleep($delay); 
    }
 }
mysql_close($conn);
?>
响应->状态->代码;
如果(strcmp($status,“200”)==0){
//成功的地理编码
echo'
成功的地理编码
; $geocode_pending=false; } 否则如果(strcmp($status,“620”)==0){ //发送地理代码太快了 $delay+=100000; }否则{ //地理编码失败 $geocode_pending=false; 回显“地址”。$Address。“无法进行地理编码。”; 回显“已接收状态”。$status。“ \n”; }*/ usleep(延迟); } } mysql_close($conn); ?>
谢谢您抽出时间!错误消息现在似乎更接近解决方案。首先,我用你的8行代码替换了这一行(url$base_url=“)。我对这一行不熟悉……这是我现在得到的:注意:未定义的变量:C中的行:…在第48行(这是你的第一行)。我还得到了以下错误:(注意:在第67行(第67行:$status=$xml->Response->status->code;)尝试获取C中非对象的属性:…)最后,我收到了这样一条消息:“地址…未能进行地理编码。已收到状态”。它会读取每个地址!您从
$q=$row[“Address”];
Try
echo$q;
中得到了什么?谢谢您的帮助。错误消息:“未定义变量:C:\wamp\www\test\geocode.php中的行”。我尝试打印“q”,什么也没有发生。代码读取所有地址行并返回相同的消息:“正在尝试获取C:\wamp\www\test\…”中非对象的属性。我猜代码和mysql都很好。问题是与谷歌的连接,似乎url是主要障碍。我用键尝试了谷歌V2代码,它给出了610个错误。通过V3代码和您的帮助,我得到了上述错误。比以前不阅读mysql时要好。再次感谢您的帮助!我答案中的url是如果您在浏览器中键入了地址,则更正