我有一个名为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'我得到的所有条目都与剩下的标准相匹配,所以除了它的距离之外没有任何错误。有人可以帮我理解我是怎么做到的吗?
谢谢!
答案 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");