2017-10-24 8 views
0
$params = [ 
    ':x1' => $locationBox['leftLongitude'], 
    ':y1' => $locationBox['topLatitude'], 
    ':x2' => $locationBox['rightLongitude'], 
    ':y2' => $locationBox['topLatitude'], 
    ':x3' => $locationBox['rightLongitude'], 
    ':y3' => $locationBox['bottomLatitude'], 
    ':x4' => $locationBox['leftLongitude'], 
    ':y4' => $locationBox['bottomLatitude'], 
    ':x5' => $locationBox['leftLongitude'], 
    ':y5' => $locationBox['topLatitude'] 
]; 

$sql = " 
    .... 
    INNER JOIN tag_geo T3 ON (T3.id = T2.tag_id_b AND ST_Covers(ST_GeogFromText('POLYGON((:x1 :y1, :x2 :y2, :x3 :y3, :x4 :y4, :x5 :y5))'), T3.geo_location)); 
"; 

$connection = \Yii::$app->getDb(); 
$command = $connection->createCommand($sql); 
$command->bindValues($params); 
$result = $command->queryAll(); 

私はエラーを取得する引用符で包まれたパラメータを評価するために失敗する準備しました)、POLYGON関数をラップするティックを削除すると、パラメータは評価されますが、このPOLYGONは一重引用符で囲む必要があるため、別のエラーが発生しました。Yii2文は

答えて

1

POLYGONを一重引用符で囲むため、ポリゴンパーツはそのままdbエンジンによって認識されます。文字列はPOLYGON((:x1 :y1, :x2 :y2, :x3 :y3, :x4 :y4, :x5 :y5))です。それはまだ代わりに使用疑問符マーカー(?)が動作しない場合は、もちろん

<?php 

$sql = " 
    .... 
    INNER JOIN tag_geo T3 ON (T3.id = T2.tag_id_b AND ST_Covers(ST_GeogFromText(:polygon), T3.geo_location)); 
"; 

$params = [ 
    ":poligon" => sprintf(// Output: POLYGON((x1-value y1-value, x2-value y2-value, ...)) 
      "POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s))" 
      , $locationBox['leftLongitude'] 
      , $locationBox['topLatitude'] 
      , $locationBox['rightLongitude'] 
      , $locationBox['topLatitude'] 
      , $locationBox['rightLongitude'] 
      , $locationBox['bottomLatitude'] 
      , $locationBox['leftLongitude'] 
      , $locationBox['bottomLatitude'] 
      , $locationBox['leftLongitude'] 
      , $locationBox['topLatitude'] 
    ) 
]; 

//... 

:だから、SQL文のisteadで唯一つのマーカーを(:polygon)を実装する必要があります。

この状況は、LIKEキーワードを使用するSQL文を準備しようとする場合と似ています。ここの例はSyntax of LIKE in PreparedStatementです。

+0

これは動作しますが、エーテルの一重引用符または二重引用符を削除する必要があります。 'POLYGON((%s%s、%s%s、%s%s、%s%s、%s%s))' –

+0

私はテストしました!それはそうです。 –

+0

だから、あなたが言った通りですか?一重引用符を削除する必要がありますか? –