【问题标题】:Is it possible to call a function in my SELECT statement in php?是否可以在 php 中的 SELECT 语句中调用函数?
【发布时间】:2015-07-08 00:28:22
【问题描述】:

我有一个包含不同位置的数据库,每个位置都有自己的经度和纬度变量。我希望能够使用我制作的一个距离函数,它在我的 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 中使用它时它不能正常工作

【问题讨论】:

  • 您的距离函数需要返回一个值,然后您将其添加到查询中
  • distance 返回两点之间的距离。我应该把剩下的功能放在那里吗?
  • 我认为这只是一个 pp 字符串连接问题$fooo='text'.my_function_output().'more text'; my_function_output() 需要在 $foo 中返回你想要的字符串
  • a php function inside a mysql query? 的可能重复项(不,你不能。你也许可以制作一个存储过程。否则做一个往返。注意 SQLite 可以很容易地回调 PHP 函数,因为它运行在相同的过程。)

标签: php mysql select where


【解决方案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;
            }
        }

它得到第三和第四个参数如下: 第三->tbl_parkinglocations.lat 4th->tbl_parkinglocations.lat

【讨论】:

    【解决方案2】:

    执行此操作的简单方法是将函数的结果存储在变量中,然后您可以将其添加到您的选择查询中。

    【讨论】:

    • 但我需要每个位置的经度和纬度。这样我只能得到搜索范围内的位置。
    【解决方案3】:

    试试这个..

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

    【讨论】:

    • 还是没有运气。不过还是谢谢。
    • 是的,刚刚添加了距离方法
    • 返回$miles后使用分号return $miles;
    • 分号在那里,我只是想念复制它。
    • 当我在 echo 中运行该字符串以查看它是否生成正确的字符串时,它输出正确,但是当我尝试在查询中执行此操作时,它不起作用。
    【解决方案4】:

    不,你不能那样做。

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

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

    【讨论】:

    • 对不起,我对这一切都很陌生。对于初学者来说,这两个选项中的哪一个可能更容易弄清楚。另外,“内联”距离计算是什么意思?
    • 对于初学者来说最简单的方法是第二种选择,您可以创建一个类似于链接答案中的 SQL 查询。
    • 哦,明白了。所以基本上做计算并用AS分配它。因此,在我执行 SELECT 语句的 php 文件中,我可以使用我的变量,比如 &longitude 和 &latitude 吗,因为我将它作为字符串传递给 mysql_query
    • 我使用了链接答案的一个版本,现在我可以找到所有位置的距离,但是我如何使用此信息仅拉出半径内的一次。我在某处读到,我在 SELECT 中为找到“distance_in_km”所做的计算直到 WHERE 运行后才计算出来,所以我不能说 WHERE distance_in_km
    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2023-02-07
    相关资源
    最近更新 更多