2011-10-29 47 views
2

我正在使用symfony 1.4.10,並試圖在MySQL表中執行一個相當複雜的INSERT。我使用MySQL的幾何函數來存儲一組緯度,經度座標,我可以很容易地進行鄰近搜索(這只是背景,並不太相關)。在Symfony 1.4.x中使用Doctrine的複雜插入(mysql幾何點)

這是我想在原始SQL做什麼:

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

更新:我敢肯定的問題是參數「錯配」與POINT。 POINT需要兩個'params',lat和lon,但它是DB中的一列。不知道如何應用準備好的語句(有多少問號和給它一個字符串?)

我試圖使用「原始查詢」與教義,但我找不到太多詳細它的文件(只有真正的基本例子,很難推斷)。

這是我最新的嘗試和錯誤的嘗試:

<?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日誌:

Oct 28 22:58:14 symfony [info] {Doctrine_Connection_Statement} execute : INSERT INTO video_geo (vimeo_vid, coord) VALUES(?, GeomFromText('POINT(? ?)')); -()

異常傾倒:

Doctrine_Connection_Mysql_Exception' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in...

我在想這個問題是與點...我應該傳遞一個參數?我不確定這是什麼類型。

symfony手冊中的示例沒有顯示如何執行預準備語句,我認爲這是我在這裏查找的信息。

任何幫助表示讚賞! Thx ...

Peter

+0

你看這裏? http://stackoverflow.com/questions/2774947/using-raw-sql-with-doctrine –

+0

謝謝,這是有幫助的。我實際上在原文中做了一些更新(我使用的是Propel語法不是教條)。進度,但我仍然收到錯誤。 我會檢查鏈接,但它似乎像我上面的語法是正確的,它只是POINT'類型',可能導致一個問題......這是一個準備參數(字符串類型?),兩? – PeterG

+0

您是否知道[地理行爲]的存在(http://www.doctrine-project.org/projects/orm/1.2/docs/manual/behaviors%3Acore-behaviors%3Ageographical/en)? – greg0ire

回答

1

Doctrine使用PDO進行MySQL查詢。

我不太確定,但我認爲你的問題是POINT()函數中的「兩個問號」。

這是PDO實況:... placeholder must be used in the place of the whole value ..

所以,你可以嘗試:

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

而作爲一個短的提示,我會建議使用命名參數:-)

相關問題