0

这很奇怪我有一个存储多边形的数据库和一个正在运行的查询,该查询检查一个点是否存在于任何多边形中并检索它们。但是,当查询在我的 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));

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

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

这里发生了什么?我在这里使用 Codeigniter。

更新

我刚刚做了一个 var_dump 并发现了一些奇怪的东西。如果我 var_dump 创建的 SQL 查询,它显示的字符比我 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 个额外的字符 - 我有一种奇怪的感觉,这些字符正在引起问题......我该如何进一步......

4

2 回答 2

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));
}
于 2016-11-29T13:18:54.573 回答
0

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

于 2017-02-15T09:33:57.507 回答