这是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个额外的字符 - 我有一种奇怪的感觉,这些是导致问题..我怎么在这里更进一步......
答案 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)