空间几何SQL - 两个完全相同的查询,一个工作,另一个不工作

时间:2016-11-29 11:36:39

标签: php codeigniter gis mysql-spatial

这是bizzarre我有一个存储多边形的数据库和一个运行查询,检查任何多边形中是否存在一个点并检索它们。但是,当我的PHP代码中的查询被创建为sql字符串时,如果我手动输入查询,它将返回任何内容 - 它运行完美!

#This works
SELECT * FROM locations 
WHERE type = 'polygon' AND locationable_type = 'Notification' AND 
ST_CONTAINS(locations.geoshape, GeomFromText('Point(25.276987 55.296249)') ) ;

#This doesnt work
SELECT * FROM locations 
WHERE type = 'polygon' AND locationable_type = 'Notification' AND  
ST_CONTAINS(locations.geoshape, GeomFromText('Point(‎25.276987 55.296249)') );

以下是实际生成sql的方法:

公共函数get_by_coords($ latitude,$ longitude){

// this grabs all the notifications
$sql = sprintf("SELECT * FROM locations WHERE type = 'polygon' AND locationable_type = 'Notification' 
        AND ST_CONTAINS(locations.geoshape, GeomFromText('point(%s, %s)') )", ($latitude), ($longitude));

其中$latitude, $longitude实际上是作为GET变量的字符串传递的。我试图进行类型转换,但结果是:

$latitude = "25.276987";
(float)$latitude; // equals zero

这是怎么回事?我在这里使用Codeigniter。

UPDATE

我刚做了一个var_dump并发现了一些奇怪的东西。如果我var_dump创建的SQL查询它显示的字符数比我在字符串中直接键入的var_dump var_dump还多6个字符,即:

string(166) "SELECT * FROM locations  WHERE type = 'polygon' AND locationable_type = 'Notification' AND  ST_CONTAINS(locations.geoshape, Point('‎25.27116987','‎55.292216249'))"
string(160) "SELECT * FROM locations  WHERE type = 'polygon' AND locationable_type = 'Notification' AND  ST_CONTAINS(locations.geoshape, Point('25.27116987','55.292216249'))"

生成第一个字符串,而第二个字符串是生成的 - 它显示第一个字符串中有6个额外的字符 - 我有一种奇怪的感觉,这些是导致问题..我怎么在这里更进一步......

2 个答案:

答案 0 :(得分:0)

据我记得在php函数中,我们仍然需要在参数前面加上美元符号。

在函数

中执行....($latitude), ($longitude));

因此你的函数参数应该是

public function get_by_coords($latitude,$longitude){

$sql = sprintf("SELECT * FROM locations WHERE type = 'polygon' AND locationable_type = 'Notification' 
        AND ST_CONTAINS(locations.geoshape, GeomFromText('point(%s, %s)') )", ($latitude), ($longitude));
}

答案 1 :(得分:0)

嘿,伙计们对迟到的回应感到抱歉。我设法找出问题所在。我在sql生成的sql上做了一个简单的strlen手动输入的sql,并发现了长度的差异。有一些隐藏的角色 - 一个简单的删除不可打印的角色,它就像一个魅力。