2016-11-29 2 views
0

これはうんざりです。ポリゴンとその中にポイントが存在するかどうかをチェックして取得するクエリを格納するデータベースがあります。しかし、私のPHPコードのSQL文字列としてクエリが作成された場合、何も返しませんが、手動でクエリを入力すると、完全に実行されます!Spatial Geomety SQL - 2つの全く同じクエリが動作しない

#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)')); 

HERESにどのように実際に生成されるSQL:

パブリック関数get_by_coords($緯度、$経度){

$latitude, $longitude実際GET変数から文字列として渡され
// 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 = "25.276987"; 
(float)$latitude; // equals zero 

ここでは何ですか?ここでCodeigniterを使用しています。

更新

私は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

パラメータを使用してクエリを印刷し、それをサーバー上で実行してみてください。それが動作しているかどうかを確認してください。 – adi

+0

また、uが投稿した2番目のクエリには、最初のクエリーに存在しないコンマで区切られた座標が含まれています。 – adi

+0

実際に出力された内容にちょうどカンマを変更しました。変更なし - 最初のクエリは、他のものが何も与えない結果を返します。その座標は完全に無視されます。 – 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 *と* longitudeを区切る 'point(...) 'にカンマ'、 'はありませんスコープの問題か* 'ポイント(%s、%s)')* isは、スコープの問題です。 * '点(25.276987 55.296249)')*のような単純文字列として解釈されます。 –

+0

私はいくつかの進歩を遂げたと思います。 – Ali

関連する問題