Тип Данных PHP Для поля ТОЧКИ MySQL


Я создал таблицу MySQL, в которой поле имеет тип POINT и используется для хранения координат lat, lon (например: 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=AIzaSyDAQPnstTsQBb6_Ok8WLXWNWoxmaQZxLG4');
$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
Author: Community, 2015-01-14

1 answers

Это должно устранить вашу проблему:

$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)';
 1
Author: Prisoner, 2015-01-15 15:44:11