Сложные ВСТАВКИ (mysql Geometry POINT) с Doctrine в Symfony 1.4.x - PullRequest
2 голосов
/ 29 октября 2011

Я использую symfony 1.4.10 и пытаюсь сделать довольно сложную INSERT в таблицу MySQL.Я использую геометрические функции MySQL для хранения набора координат широты и долготы в форме, в которой я могу легко выполнять поиск близости (это просто фон, не очень актуально).

Вот что мне нужноделать в сыром SQL:

INSERT INTO video_geo (vimeo_vid, coord) 
     VALUES ( 15702113, GeomFromText( 'POINT(-122.415 37.7792)' ));

ОБНОВЛЕНИЕ: Я почти уверен, что проблема заключается в параметре "несоответствие" с POINT.POINT принимает два «params», lat и lon, но это один столбец в БД.Не уверен, как применить к нему подготовленное утверждение (сколько знаков вопроса и что дать, строка?)

Я пытаюсь использовать «необработанный запрос» с Doctrine, но не могу найтислишком много подробной документации по нему (только очень простые примеры, из которых трудно экстраполировать).

Это моя последняя попытка проб и ошибок:

<?php
$connection = Doctrine_Manager::connection();
$query = "INSERT INTO video_geo (vimeo_vid, coord) VALUES( ? , GeomFromText( 'POINT( ? ? )' ));";
$statement = $connection->prepare($query);
$statement->bindValue(1, $vimeoID);
$statement->bindValue(2, $lat);
$statement->bindValue(3, $lon);
$statement->execute();
?>

Это приводит к следующей ошибке:

В журнале sf:

28 октября 22:58:14 symfony [info] {Doctrine_Connection_Statement} execute: INSERT INTO video_geo (vimeo_vid,координировать) ЗНАЧЕНИЯ (?, GeomFromText ('POINT (??)'));- ()

Исключено исключение:

Doctrine_Connection_Mysql_Exception 'с сообщением' SQLSTATE [HY093]: недопустимый номер параметра: число связанных переменных не соответствует числу токенов 'в...

Я думаю, что проблема с POINT ... я должен передать один параметр?Я не уверен, что это за тип.

Пример в руководстве по Symfony не показывает, как делать подготовленные операторы, я думаю, что это информация, которую я ищу здесь.

Любая помощь приветствуется!Спасибо ...

Питер

1 Ответ

1 голос
/ 23 ноября 2011

Doctrine использует PDO для запросов MySQL.

Я не совсем уверен, но я думаю, что ваша проблема - это "два вопросительных знака" в функции POINT ().

Этоиз документа PDO: ... вместо целого значения должен использоваться заполнитель ..

Так что вы можете попробовать:

$query = "INSERT INTO video_geo (vimeo_vid, coord) VALUES( ? , GeomFromText( 'POINT( ? )' ));";
$statement = $connection->prepare($query);
$statement->bindValue(1, $vimeoID);
$statement->bindValue(2, $lat . " " . $lon);

И как короткоеподсказка, я бы посоветовал использовать именованные параметры: -)

...