2013-05-29 25 views
0

我試圖使用餘弦的球形定律從用戶到存儲在MySQL數據庫中的每個場地的距離。用戶輸入他們的位置,並執行以下查詢。使用PDO將變量插入到SELECT子句中?

$data = array(':lat' => $lat, ':lon' => $lon); 

$qry = "SELECT ACOS(SIN(v.Latitude) * SIN(:lat) + COS(v.Latitude) * COS(:lat) * COS(:lon - v.Longitude)) * 3963 AS distance FROM Venue v"; 

$stmt = $pdo->prepare($qry); 
$stmt->execute($data); 
$rows = $stmt->fetchAll(); 

問題是,我得到以下錯誤。

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number' 

當我從SELECT子句中刪除變量(:lat:lon),它工作得很好。語句中的其他變量(此處未顯示)工作得很好,它只是SELECT子句中導致問題的變量。這是不是無法在SELECT語句中使用PDO變量來限制PDO,還是有解決此問題的方法?

我使用PHP 5.4.15,我的PDO選項如下。

$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',  // UTF-8 to prevent issue sending special characters with JSON 
       PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION, // fire exceptions for errors (turn this off for release) 
       PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,  // only return results indexed by column name 
       PDO::ATTR_EMULATE_PREPARES  => false     // actually prepare statements, not pseudo-prepare (http://stackoverflow.com/questions/10113562/pdo-mysql-use-pdoattr-emulate-prepares-or-not) 
       ); 
+0

您正在使用什麼版本的PHP?我只是用PHP 5.3.15試了一下,效果很好。有可能早期版本的PHP不知道如何處理兩個相同的命名參數佔位符。 –

+0

我正在使用PHP 5.4.15 –

+0

我只是再次運行查詢來驗證這正是我發佈的確切代碼發生的情況,它是。我剛剛更新了我的問題,以包含初始化時通過的PDO選項。 –

回答

0
$data = array($lat, $lat, $lon); 

$qry = "SELECT ACOS(SIN(v.Latitude) * SIN(?) + COS(v.Latitude) * COS(?) * COS(? - v.Longitude)) * 3963 AS distance FROM Venue v"; 

$stmt = $pdo->prepare($qry); 
$stmt->execute($data); 
$rows = $stmt->fetchAll(); 
+0

這使得閱讀更加困惑,因爲我有3條不同的線計算不同的距離。大約有10個不同的問號需要跟蹤。這確實可以解決問題,但似乎應該有更好的方法... –

+0

您也可以使用指定的佔位符。只是給他們*不同的名字 –

+0

我知道,這似乎是一個不必要的麻煩。 PDO應該比這更聰明! –

相關問題