PHP:在mysql查询

时间:2017-03-09 19:00:28

标签: php mysql where having

我有一个名为Messages的表,其中一个条目包含与以下内容相同的内容:

longtitude = 4.867478333333334
latitude = 52.31819833333334
username = 'pb'  

如果我用下面的表格查询:

$longitude=4.867478333333334
$latitude=52.31819833333334
$username='pb'
$search=''
$visibledistance=2

使用下面的mysql查询:

$query=("SELECT 
  subject,username,message,timestamp,(
    6371 * acos (
        cos ( radians('$latitude') )
      * cos( radians( Messages.latitude ) )
      * cos( radians( Messages.longitude ) - radians('$longitude') )
      + sin ( radians('$latitude') )
      * sin( radians( Messages.latitude ) )
    )
  ) AS distance FROM Messages WHERE username ='pb'  AND ((subject LIKE        '%$search%') OR (message LIKE '%$search%'))  GROUP BY subject  

HAVING distance < '$visibledistance' 
ORDER BY timestamp");
$sth = mysql_query($query);

我没有结果。如果我删除HAVING distance&lt; '$ visibledistance'我得到的所有条目都与剩下的标准相匹配,所以除了它的距离之外没有任何错误。有人可以帮我理解我是怎么做到的吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果你有数值,你应该避免使用vars周围的单引号

你应该使用concat来代替

(如果你使用'$ visibledistance',那么你就是eval HAVING distance < '4'(你估计你与字符串的距离)

查看您的代码
你没有使用聚合函数,所以你不需要你可以使用where(但是noy别名)for fliter和distcint而不是group by

  $query=("SELECT distinct
    subject,username,message,timestamp,(
      6371 * acos (
          cos ( radians($latitude) )
        * cos( radians( Messages.latitude ) )
        * cos( radians( Messages.longitude ) - radians($longitude) )
        + sin ( radians($latitude) )
        * sin( radians( Messages.latitude ) )
      )
    ) AS distance FROM Messages WHERE username ='pb'  AND ((subject LIKE concat('%', '$search', '%') 
            OR (message LIKE concat('%','$search','%'))    

  WHERE (
      6371 * acos (
          cos ( radians($latitude) )
        * cos( radians( Messages.latitude ) )
        * cos( radians( Messages.longitude ) - radians($longitude) )
        + sin ( radians($latitude) )
        * sin( radians( Messages.latitude ) )
      )
    ) < $visibledistance 
  ORDER BY timestamp");