如何在php查询中使用sql数据库值

如何在php查询中使用sql数据库值,php,sql,google-maps-api-3,Php,Sql,Google Maps Api 3,因此,我尝试使用多个变量进行radius类型的搜索,我的数据库中存储了每个城市的Lat/Long,但我注意到,大多数解决方案都要求我查询整个数据库(最终可能是50000多行),以便在函数中使用存储的Lat/Long值 是否仍然可以使用此存储的数据库值,而无需先从查询中获取它,然后在查询过程中使用它 我现在就是这样做的,但我认为这需要很多,特别是当数据库达到100000多行时,可能需要一些时间来检查每一行,如果我能在查询过程中检查距离会更好,这样我就可以更好地过滤结果,而不必检查每一行 funct

因此,我尝试使用多个变量进行radius类型的搜索,我的数据库中存储了每个城市的Lat/Long,但我注意到,大多数解决方案都要求我查询整个数据库(最终可能是50000多行),以便在函数中使用存储的Lat/Long值

是否仍然可以使用此存储的数据库值,而无需先从查询中获取它,然后在查询过程中使用它

我现在就是这样做的,但我认为这需要很多,特别是当数据库达到100000多行时,可能需要一些时间来检查每一行,如果我能在查询过程中检查距离会更好,这样我就可以更好地过滤结果,而不必检查每一行

function getLocation($address) {
    if (!empty($address)) {

        //Formatted address
        $formattedAddr = str_replace(' ', '+', $address);

        //Send request and receive json data by address
        $geocodeFromAddr = file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?address=' . $formattedAddr . '&sensor=true_or_false');
        $output1 = json_decode($geocodeFromAddr);

        //Get latitude and longitute from json data
        $latitude = $output1->results[0]->geometry->location->lat;
        $longitude = $output1->results[0]->geometry->location->lng;

        return "$latitude,$longitude";
    } 
    else {
        return false;
    }
}

function GetDrivingDistance($lat1, $lat2, $long1, $long2) {
    $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $lat1 . "," . $long1 . "&destinations=" . $lat2 . "," . $long2 . "&mode=driving&units=imperial";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $response = curl_exec($ch);
    curl_close($ch);
    $response_a = json_decode($response, true);
    $dist = $response_a['rows'][0]['elements'][0]['distance']['text'];
    $time = $response_a['rows'][0]['elements'][0]['duration']['text'];

    return $dist;

    //return array('distance' => $dist, 'time' => $time);
}

$sql = "SELECT * FROM mytable WHERE `date` >= '$selected_date'";

if ($length && !empty($length)) {
    $sql.= " AND `length`<='$length'";
}

$sql.= " ORDER BY date_created DESC";

$CITY = "DALLAS, TX";
 // FOR TESTING
$SLAT = getLocation($CITY);
$oparr = split("\,", $SLAT);
$FLAT = $oparr[0];
$FLONG = $oparr[1];

while ($row = $result->fetch_assoc()) {
    $id = $row['id'];
    $city = $row['city'];
    $state = $row['state'];
    $lat = $row['lats'];
    $long = $row['longs'];
    $distance = GetDrivingDistance($FLAT, $lat, $FLONG, $long);

    if ($distance <= 200) {

        // SHOW TABLE RESULTS

    } 
    else {
        echo "No results";
    }
}
函数getLocation($address){ 如果(!空($address)){ //格式化地址 $formattedAddr=str_replace(“,+”,$address); //按地址发送请求和接收json数据 $geocodeFromAddr=文件\u获取\u内容('http://maps.googleapis.com/maps/api/geocode/json?address=“.$formattedAddr.&sensor=true或false”); $output1=json\u decode($geocodeFromAddr); //从json数据中获取纬度和经度 $latitude=$output1->results[0]->geometry->location->lat; $longitude=$output1->results[0]->geometry->location->lng; 返回“$纬度,$经度”; } 否则{ 返回false; } } 函数GetDrivingDistance($lat1、$lat2、$long1、$long2){ $url=”https://maps.googleapis.com/maps/api/distancematrix/json?origins=“$lat1.”、“$long1.”和destinations=“.$lat2.”、“$long2.”模式=驾驶&单位=英制”; $ch=curl_init(); curl_setopt($ch,CURLOPT_URL,$URL); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_PROXYPORT,3128); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); $response=curl\u exec($ch); 卷曲关闭($ch); $response\u a=json\u decode($response,true); $dist=$response_a['rows'][0]['elements'][0]['distance']['text']; $time=$response_a['rows'][0]['elements'][0]['duration']['text']; 返回$dist; //返回数组('distance'=>$dist,'time'=>$time); } $sql=“从mytable中选择*,其中`date`>='$selected\u date'; 如果($length&&!empty($length)){ $sql.=”和`length`基于来自的查询,我发现您可以在MySQL中计算距离,从而减少在调用Google Maps API之前从数据库读取记录的需要。请参阅下面的代码示例

看看表中有3条记录的地方,其中两条在德克萨斯州达拉斯200英里以内(另一条在休斯顿附近)

//获取达拉斯的位置
//getLocation(“德克萨斯州达拉斯”)//
$lat=32.7856717;
$lng=-96.77326000001;
$query='选择城市,(3959*acos(弧度('.$lat.))*cos(弧度(mytable.lats))
*cos(弧度(mytable.longs)-弧度('.$lng')+sin(弧度('.$lat'))
*sin(弧度(mytable.lats)))表示距离mytable的距离<200';
//$connection先前通过mysqli_connect()初始化
$results=$connection->query($query);
而($row=$results->fetch_object()){
//显示表格结果
回显“记录:”。$row->city。“-距离:”。$row->距离。“
”; }

你也可以考虑添加到你的构建中,这样你就可以使用用户定义函数(UDF)HaveVixOxDiston()了,然后你的查询可以简化为:

$query = 'SELECT city, haversine_distance('.$lat.','.$lng.',mytable.lats,mytable.longs) AS distance  FROM mytable having distance < 200';
$query='SELECT city,haversine_distance('.$lat.','.$lng.',mytable.lats,mytable.longs)作为距离小于200'的mytable的距离;
$sql=“选择
caid
签证
机票
套餐
收入
费用
按日期分组(现金.月)”; $result=$conn->query($sql)

$result=mysqli\u查询($conn,$sql);
$rows=mysqli\u fetch\u数组($result);
//$d=$data[“费用”];
$res=mysqli_查询($conn,$sql);
$data=mysqli\u fetch\u数组($res);
如果($result->num_rows>0){
而($row=$result->fetch_assoc()){
//$费用=$行[“费用”];
//echo$费用;
echo$行[“visa”]。“
”; } }
您使用的是SQL Server、MySQL还是其他数据库引擎?如果您使用的是SQL Server,请查看关于我使用MySQL的公认答案。好的-您可以按照以下思路设计一些东西吗?我看到的唯一问题是它不允许多变量搜索,或者至少我无法正确实现。因为有时在我的搜索中,他们可能会搜索其他变量,因此我使用“WHERE username=“$username”和id=“$id”作为距离。您仍然可以在HAVING子句之前添加WHERE子句-例如,
SELECT city,(3959*acos(弧度(32.7856717))*cos(弧度(mytable.lats))*cos(弧度)(弧度(mytable.lats))*cos(弧度)(mytable.longs)-radians(-96.77326000001))+sin(radians(32.7856717))*sin(radians(mytable.lats)))作为与mytable的距离,其中zip-in(7511975149)的距离<200
我使用了您的公式并进行了回显,它似乎没有拾取mytables存储的信息,因为您可以看到它只显示“mytable.olat”而不是实际值:选择*,(3959*acos(弧度(35.0077519))*cos(弧度(mytable.olat))*cos(弧度(mytable.olong)-radians())+sin(弧度(35.0077519))*sin(弧度(mytable.olat)))作为距离mytable的距离,其中
length
长度的字段类型是什么?如果是整数/数字类型,则不应使用引号…但可能是字符串类型?可能是与城市相关的长度?长度是字符串,但我不认为这是问题,因为我也尝试过不使用引号。我想我问题可能是它没有读到
$query = 'SELECT city, haversine_distance('.$lat.','.$lng.',mytable.lats,mytable.longs) AS distance  FROM mytable having distance < 200';
  $result=mysqli_query($conn, $sql);

 $rows=mysqli_fetch_array($result);
//      $d = $data["expenses"];
  $res=mysqli_query($conn, $sql);
   $data=mysqli_fetch_array($res);



  if ($result-> num_rows >0){
      while($row = $result-> fetch_assoc()){
          //$expenses =  $row["expenses"];
         // echo $expenses;




     echo  $row["visa"]."</br>" ;

      }
     }