Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 在select子句中使用自定义函数_Php_Mysql - Fatal编程技术网

Php 在select子句中使用自定义函数

Php 在select子句中使用自定义函数,php,mysql,Php,Mysql,我正在尝试获取一个查询,该查询将提供一个按距离当前位置多远排序的商店列表。我在php中工作,并使用MySQL作为我的数据库 为了计算两个存储之间的距离,我使用了两个存储中的经度和纬度,并从中推导出距离。这包含在自定义函数距离($lat1、$lng1、$lat2、$lng2)中。此功能的结果是距离,单位为km 我想使用这个函数在我的查询结果中创建一个额外的列,这样我就可以对所有存储进行排序,从我当前位置最后面的一个到我当前位置最远的一个。这两个函数都在同一个文件中声明,但我没有得到任何结果。是否可

我正在尝试获取一个查询,该查询将提供一个按距离当前位置多远排序的商店列表。我在php中工作,并使用MySQL作为我的数据库

为了计算两个存储之间的距离,我使用了两个存储中的经度和纬度,并从中推导出距离。这包含在自定义函数
距离($lat1、$lng1、$lat2、$lng2)
中。此功能的结果是距离,单位为
km

我想使用这个函数在我的查询结果中创建一个额外的列,这样我就可以对所有存储进行排序,从我当前位置最后面的一个到我当前位置最远的一个。这两个函数都在同一个文件中声明,但我没有得到任何结果。是否可以像我那样声明SELECT子句中的函数来调用它

function getSortedStores($cur_lat, $cur_lng)
{
    $query = "SELECT Store.ID, Store.Name, distance($cur_lat, $cur_lng, Address.Latitude, Address.Longitude) AS Distance FROM Store INNER JOIN Address ON Store.ID=Address.StoreID ORDER BY Distance";
    $result = mysql_query($query);
    return $result;
}

function distance($lat1, $lng1, $lat2, $lng2)
{
    $toRadians = M_PI / 180;
    $lat1 *= $toRadians;
    $lng1 *= $toRadians;
    $lat2 *= $toRadians;
    $lng2 *= $toRadians;

    $r = 6371; // mean radius of Earth in km
    $dlat = $lat2 - $lat1;
    $dlng = $lng2 - $lng1;
    $a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a));
    $km = $r * $c;
    $km = round($km, 1);

    return $km;
}

您不能在mysql中使用php函数。有关mysql用户定义函数的更多详细信息

看到这个了吗


您不能以这种方式混合使用PHP和mySQL,您可以使用mySQL进行计算,也可以选择原始数据并根据PHP中的结果集进行计算。但是不能在mySQL查询中调用PHP函数

或者,假设你的商店不是移动的。您可以创建一个简单的表格来存储所有商店之间的距离。它会占用一些额外的存储空间,但最终可能会为您节省相当多的CPU周期

TABLE distances
  store1_id INT PK
  store2_id INT PK
  distance FLOAT

SELECT distance
FROM distances
WHERE (store1_id = $store1 AND store2_id = $store2)
  OR (store1_id = $store2 AND store1_id = $store2)
LIMIT 1

首先,PHP和SQL是不同的语言,由不同的解释器在可能不同的计算机上运行。你不能混合使用PHP和mysql。你必须在获取结果后使用mysql或PHP进行计算。假设你知道你的代码是错的,看看如何在MySqlWell中高效地进行计算。您可以在mysql上创建该函数。