Я создал таблицу MySQL, где поле имеет тип POINT
и используется для хранения координат широты и долготы (например: 36.6294654 -93.1725982).
Я получил ошибку при отправке формы, и я предполагаю, что это связано с несовпадающим типом данных.
SQLSTATE[22003]: Numeric value out of range: 1416 Cannot get geometry object from data you send to the GEOMETRY field
Я понимаю, что POINT
должен иметь формат примера (я также пробовал lat, lon). Проблема, я думаю, в том, что пространство преобразует переменную в STRING
,
Я что-то здесь упускаю?
Вот мой PHP-код для подключения к базе данных и вставки записи.
// use google's geocoding service to transform an address into lat/lon coordinates (https://developers.google.com/maps/documentation/geocoding/)
$json = file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode($street) . ',+' . urlencode($city) . ',+' . urlencode($state) . ',+' . urlencode($zip) . '&key=YOUR_API_KEY');
$json = json_decode($json, true);
$latlon = $json['results'][0]['geometry']['location']['lat'] . ' ' . $json['results'][0]['geometry']['location']['lng'];
try {
$dbh = new PDO('mysql:host=someserver;port=someport;dbname=somedatabase', 'someusername', 'somepassword', array(PDO::ATTR_PERSISTENT => true));
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'INSERT INTO Venues (Name, Street, City, State, Zip, Country, TimeZone, LatLon, Phone, Email, Website, Host, Notes) VALUES (:name, :street, :city, :state, :zip, :country, :timezone, :latlon, :phone, :email, :website, :host, :notes)';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(":name" => $name, ":street" => $street, ":city" => $city, ":state" => $state, ":zip" => $zip, ":country" => $country, ":timezone" => $timezone, ":latlon" => $latlon, ":phone" => $phone, ":email" => $email, ":website" => $website, ":host" => $host, ":notes" => $notes));
if ($stmt->rowCount() == 1) {
echo '<p>"' . $name . '" creation succeeded.</p>';
} else {
echo '<p>"' . $name . '" creation failed.</p>';
}
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$dbh = null;
}
catch(PDOException $e) {
echo $e->getMessage();
}
В качестве альтернативы, я мог бы просто иметь отдельные поля lat и lon, но я хотел попрактиковаться со встроенной функциональностью геометрии msyql.
Редактировать…
Следуя совету этот ответ, Я окружил $latlon
с POINT()
, Однако это не изменило результаты.
Изменить 2 …
Вот структура таблицы, на случай, если что-то будет выглядеть неправильно.
VenueKey int(11)
Name varchar(255)
Street varchar(255)
City varchar(255)
State varchar(2)
Zip varchar(10)
Country varchar(2)
TimeZone varchar(20)
LatLon point
Phone varchar(20)
Email varchar(255)
Website varchar(255)
Host varchar(255)
Notes text
Это должно исправить вашу проблему:
$latlng = 'POINT(' . $json['results'][0]['geometry']['location']['lat']. " " . $json['results'][0]['geometry']['location']['lng']. ')';
а затем заверните :latlon
с PointFromText
:
$sql = 'INSERT INTO Venues (Name, Street, City, State, Zip, Country, TimeZone, LatLon, Phone, Email, Website, Host, Notes) VALUES (:name, :street, :city, :state, :zip, :country, :timezone, PointFromText(:latlon), :phone, :email, :website, :host, :notes)';
Других решений пока нет …