3

詳細

mysql の空間拡張機能を利用したいので、bindParam を使用して POINT データ型の mysql テーブルに経度と緯度を格納しようとしています。残念ながら、SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'location' cannot be null というエラーが表示され続けます。

経度と緯度に値があることを確認しました。したがって、問題は私のコードにあるはずですが、何が間違っているのかわかりません。

これが私が使用しているコードです。

$location=$latitude." ".$longitude;
$sql = "INSERT INTO my_geodata SET location = PointFromText('POINT(:location)')";
      //INSERT INTO my_geodata SET location = PointFromText('POINT(-41 12)');    

try 
{
    $stmt = $dbh->prepare($sql);            
    $stmt->bindParam(':location', $location, PDO::PARAM_STR);           
    $stmt->execute();   
    $dbh = null;
}

catch(PDOException $e)
{               
    echo $error=$e->getMessage();
}

質問

私は何を間違っていますか?PDO と bindParam を使用して、経度と緯度を (POINT データ型を使用する) mysql テーブルに挿入するにはどうすればよいですか?

変化

AgreeOrNot の回答に基づいて、これを達成するための少し異なる方法は次のとおりです。

$location = 'POINT(' . $latitude . " " . $longitude . ')';    
$sql = "INSERT INTO my_geodata (location) VALUES (PointFromText(:location))";
4

2 に答える 2

5

クエリのパラメータ化は (単純な) 文字列の置換ではないことに注意してください。コードでは、クエリ パラメータは文字列リテラルに入れられますが、そのまま保持されます。

これを試して:

$location = 'POINT(' . $latitude . " " . $longitude . ')';
$sql = "INSERT INTO my_geodata SET location = PointFromText(:location)";
于 2013-07-27T04:11:32.783 に答える
1

空間拡張はまだ緯度と経度用に設計されておらず、デカルト座標用に設計されています。距離関数は地球の曲率を考慮していないため、常に間違った結果が得られます。とても悲しいことです...

于 2013-10-19T21:07:37.677 に答える