如何将PHP半径函数与多个变量一起使用?

Jay*_*yce 6 php mysql latitude-longitude

我一直在阅读radius和mysql,我对如何使用多个搜索变量精确实现代码感到困惑,所以有人可能会为我分解它.

我的数据库有以下表格:

idx | 类型 | 价格 | item_desc | s_lat | s_long | 创建日期

这是我目前的代码.

$search_origin_radius = "200";
$search_dest_radius = "100";
$search_origin_lat = "37.2629742";
$search_origin_long = "-98.286158";
$search_dest_lat = "37.2629742";
$search_dest_long = "-98.286158";
$type = "consumers";
$price = "100";

$sql = "SELECT * FROM products WHERE `price` = '$price'";

if($type && !empty($type))
{
    $sql .= " AND `type` = '$type'";    
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我发现的一切都说使用:

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( latitude ) ) 
    * cos( radians( longitude ) - radians(-122) ) + sin( radians(37) ) * sin(radians(lat)) ) ) AS distance 
FROM myTable
HAVING distance < 50
ORDER BY distance 
Run Code Online (Sandbox Code Playgroud)

但是我对我如何实现它的超级困惑$search_origin_radius$search_dest_radius.基本上我要做的就是在两个城市的价格范围和半径范围内找到所有待售的东西.

示例我想找到俄克拉荷马城周围100美元的价格,200英里内的OK和100英里内的堪萨斯城.

编辑**正如建议的那样,将其添加为存储函数.

function Calc_Distance($latitudeFrom, $longitudeFrom, $latitudeTo,         $longitudeTo, $earthRadius = 3959)
{
  // convert from degrees to radians
  $latFrom = deg2rad($latitudeFrom);
  $lonFrom = deg2rad($longitudeFrom);
  $latTo = deg2rad($latitudeTo);
  $lonTo = deg2rad($longitudeTo);

  $latDelta = $latTo - $latFrom;
  $lonDelta = $lonTo - $lonFrom;

  $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
    cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  return $angle * $earthRadius;
}
Run Code Online (Sandbox Code Playgroud)

使用新查询但仍然没有显示:

$sql = "
SELECT *
FROM products
WHERE Calc_Distance(s_lat, s_long, $search_origin_lat, $search_origin_long) < 200
  AND Calc_Distance(s_lat, s_long, $search_dest_lat,   $search_dest_long)   < 100
  AND price = $price
";
Run Code Online (Sandbox Code Playgroud)

Art*_*rth 5

俄克拉荷马城和堪萨斯城距离彼此相距300英里.

AND距离堪萨斯城100英里以外的俄克拉荷马城200英里以下的土地很少,所以我对你的查询没有结果感到惊讶.

也许你想要OR逻辑......

SELECT id
  FROM products
 WHERE (*Oklahoma City distance calc miles* < 200
    OR *Kansas City distance calc miles* < 100)
   AND price = 100;
Run Code Online (Sandbox Code Playgroud)

..或者你可以UNION ALL一个SELECT为每个城市:

SELECT id, 'Oklahoma City' as city  
  FROM products
 WHERE *Oklahoma City distance calc miles* < 200
   AND price = 100

 UNION ALL

SELECT id, 'Kansas City'
  FROM products
 WHERE *Kansas City distance calc miles* < 100
   AND price = 100;
Run Code Online (Sandbox Code Playgroud)

我个人倾向于第二,因为它很容易构建代码,并为您提供整齐地找到产品的城市.

虽然正如@PaulSpiegel指出的那样,如果搜索区域相交,这个(未经修改的)可以多次返回一些产品.


Ric*_*mes 0

编写一个存储函数,它接受两对纬度和经度,并返回距离。

$sql = "
SELECT ...
    FROM MyTbl
    WHERE Distance(s_lat, s_long, $search_origin_lat, $search_origin_long) < 200
      AND Distance(s_lat, s_long, $search_dest_lat,   $search_dest_long)   < 100
      AND price = $price
";
Run Code Online (Sandbox Code Playgroud)

或者将表达式拼写两次。