Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 如何仅在经度和纬度处于给定距离时显示查询结果_Php_Sql_Pdo - Fatal编程技术网

Php 如何仅在经度和纬度处于给定距离时显示查询结果

Php 如何仅在经度和纬度处于给定距离时显示查询结果,php,sql,pdo,Php,Sql,Pdo,如何将两个$sql查询组合成一个$sql查询。我想输入一些名称、地址、城市或州,只有在指定的经度和纬度范围内才显示。我尝试了多种方法将这些$sql组合成一个,但就是搞不懂逻辑。请帮忙 $sql = "SELECT *, ( 3959 * acos( cos( radians(47.64585) ) * cos( radians( lat ) ) * cos( radians( longitude ) - radians(-117.159999) ) + sin( radians(47.

如何将两个$sql查询组合成一个$sql查询。我想输入一些名称、地址、城市或州,只有在指定的经度和纬度范围内才显示。我尝试了多种方法将这些$sql组合成一个,但就是搞不懂逻辑。请帮忙

    $sql = "SELECT *, ( 3959 * acos( cos( radians(47.64585) ) * cos( radians( lat ) ) * cos( radians( longitude ) - radians(-117.159999) ) 
+ sin( radians(47.64585) ) * sin( radians( lat ) ) ) ) AS distance FROM table HAVING distance > 100";
单独运行时,上面的$sql和下面的$sql都可以正常工作。我只包含了上面的$sql代码,而没有包含所有的连接和相关内容。如果需要,我可以提供整个连接和显示表代码。我还将使用经度,纬度和距离变量为我的当前位置。我只是对它们进行了硬编码,希望我的示例更具可读性

    $name = "text entered from search form";

$db= new pdo("mysql:host=localhost;dbname=$dbname",$username,$password);
$sql="SELECT * FROM table WHERE     
  companyname LIKE '%" . $name . "%' 
  OR
  address LIKE '%" . $name . "%'
  OR
  city LIKE '%" . $name ."%'
  OR
  state LIKE '%" . $name ."%'";

$result = $db->query($sql);
$numrows=$result->fetch(PDO::FETCH_ASSOC);

if ($result != false) {
    while($row=$result->fetch(PDO::FETCH_ASSOC)){
    $client_id=$row['client_id'];
    $companyname =$row['companyname'];
    $address=$row['address'];
    $city=$row['city'];
    $state=$row['state'];

echo  $client_id, $companyname, $address, $city, $state;

}
}
$result = null;

只需将第二个查询中的where子句添加到第一个查询中

SELECT *,
    ( 3959 * acos( cos ( radians(47.64585) )
        * cos( radians( lat ) ) 
        * cos( radians( longitude ) - radians(-117.159999) ) 
        + sin( radians(47.64585) )
        * sin( radians( lat ) )
        )
    ) AS distance 
FROM table
WHERE     
    companyname LIKE '%" . $name . "%' 
    OR address LIKE '%" . $name . "%'
    OR city LIKE '%" . $name ."%'
    OR state LIKE '%" . $name ."%'
HAVING distance > 100
不过警告是,此查询将无法利用where子句中具有典型B树索引的字段上的任何索引。这是因为在搜索值的类似定义的开头有一个通配符,典型的b树索引只支持前缀匹配用例。对于这个用例,您可能需要考虑自然语言搜索。


您也可能需要考虑使用MySQL空间扩展,如果您要大量利用地理空间功能的话。这将允许为处理空间数据而优化的特殊字段和索引类型。

只需将第二个查询中的where子句添加到第一个查询中即可

SELECT *,
    ( 3959 * acos( cos ( radians(47.64585) )
        * cos( radians( lat ) ) 
        * cos( radians( longitude ) - radians(-117.159999) ) 
        + sin( radians(47.64585) )
        * sin( radians( lat ) )
        )
    ) AS distance 
FROM table
WHERE     
    companyname LIKE '%" . $name . "%' 
    OR address LIKE '%" . $name . "%'
    OR city LIKE '%" . $name ."%'
    OR state LIKE '%" . $name ."%'
HAVING distance > 100
不过警告是,此查询将无法利用where子句中具有典型B树索引的字段上的任何索引。这是因为在搜索值的类似定义的开头有一个通配符,典型的b树索引只支持前缀匹配用例。对于这个用例,您可能需要考虑自然语言搜索。

您也可能需要考虑使用MySQL空间扩展,如果您要大量利用地理空间功能的话。除其他外,这将允许为处理空间数据而优化的特殊字段和索引类型