2016-11-29 22 views
0

這是bizzarre我有一個數據庫,存儲多邊形和查詢運行,檢查是否存在一個點內任何多邊形和檢索它們。然而,當我的php代碼中的查詢被創建爲一個sql字符串時,它不會返回任何結果,但是如果我手動輸入查詢 - 它將完美運行!空間幾何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($緯度,$經度){

// 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查詢它顯示有6個字符,比我的var_dump查詢直接在一個字符串類型,即:

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

嘗試用參數打印查詢,然後在它上面啓動server..check,如果它正在工作然後或不是。因爲U告訴你,你手動嘗試,它的工作。 – adi

+0

也在你發佈的第二個查詢中包含用逗號隔開的座標,這在你的第一個查詢中不存在。 – adi

+0

DId,實際上只是將逗號更改爲輸出的內容。沒有變化 - 第一個查詢給了我一個結果,另一個沒有給出任何結果。它的座標完全被忽略。 – Ali

回答

0

嘿,夥計們遺憾的響應晚。我設法找出問題所在。我對生成的sql做了一個簡單的strlen,手動輸入了sql,發現了長度的差異。有一些隱藏的角色 - 一個簡單的刪除不可打印的角色,它像一個魅力。

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)); 
} 
+0

嗯是的多數民衆贊成如此?但問題仍然存在.. – Ali

+0

在'點(...)'沒有逗號','分隔* latitute *&*經度*,但你把它放在上面,而且這些* locations.geoshape *&* GeomFromText *實際上是來自函數外部的變量或函數嗎?它可能是範圍問題或*'point(%s,%s)')*是被解釋爲普通字符串,如*'point(25.276987 55.296249)')*。 –

+0

我想我已經取得了一些進展 - 你能檢查一下這個問題嗎? – Ali

相關問題