是否可以在php中的SELECT语句中调用函数?

时间:2015-07-08 00:28:23

标签: php mysql select where

我有一个包含不同位置的数据库,每个位置都有自己的经度和纬度变量。我希望能够使用我所做的距离函数来返回我的WHERE语句中两个经度和纬度之间的距离。所以我正在寻找两点之间的距离,如果它小于我正在搜索的半径,它会传递WHERE语句。

距离函数:

function distance($lat1, $lon1, $lat2, $lon2) {
    $theta = $lon1 - $lon2;
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    return $miles;
}

在我的SELECT语句中我想要这样的东西:

SELECT * FROM Locations WHERE distance($latitude, $longitude, 'latitude', 'longitude')
然而,这是行不通的。 我没试过就试过这些......

"SELECT * FROM Locations WHERE distance($latitude, $longitude, 'latitude', 'longitude') < $radius"

sprintf("SELECT * FROM Locations WHERE %f < $radius", distance($latitude, $longitude, 'latitude', 'longitude'))

这甚至可以预制吗?如果不是这个问题的好方法是什么?谢谢!

编辑:我试图做

"SELECT * FROM Locations WHERE '" . distance('Latitude', 'Longitude', $latitude, $longitude) . "' < $radius"

但它不起作用,但是如果我只是回应它它输出我正在寻找的结果。但是当我尝试在mysqli_query

中使用它时,它无法正常工作

4 个答案:

答案 0 :(得分:1)

我使用了同样但一个问题: 我在查询中使用如下:

///////////////////////////////////////////////////
$sql = "select ... AND '".distance2($lat,$long,'tbl_parkinglocations.lat',`tbl_parkinglocations.lat`) ."'<=20 ";
///////////////////////////////////////////////////

但在功能上:

function distance2($lat1,$long1,$lat2,$long2){
            //Google api

            echo $fromAddress=$lat1.','.$long1;
            echo $toAddress=$lat2.','.$long2;
                // echo "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$fromAddress&destinations=$toAddress&sensor=false";
            $URL = json_decode(file_get_contents("https://maps.googleapis.com/maps/api/distancematrix/json?origins=$fromAddress&destinations=$toAddress&sensor=false"));

            echo "<br>".$URL; exit;

            $status = $URL->rows[0]->elements[0]->status;
            if($status != 'ZERO_RESULTS'){
                    $res = round($URL->rows[0]->elements[0]->distance->value/1000);
                     return $res;
            }
        }

它得到第3和第4个参数如下: 3rd-&GT; tbl_parkinglocations.lat 4th-&GT; tbl_parkinglocations.lat

答案 1 :(得分:0)

简单的方法是将函数的结果存储在变量中,然后将其添加到选择查询中。

答案 2 :(得分:0)

试试这个..

$sql = "SELECT * FROM Locations WHERE " . distance($latitude, $longitude, 'latitude', 'longitude') . " < $radius";

答案 3 :(得分:0)

不,你不能那样做。

您可以创建一个存储过程,该存储过程可以计算位置与指定坐标的距离,然后在SQL查询中使用该存储过程。

或者您可以在SQL查询中内联您的距离计算,例如显示为here in this linked answer