2012-04-21 221 views
1

我有一個PDO綁定參數的問題,當它在數據庫上執行時,所設置的參數沒有被推入到查詢中。我通過讓MySQL將查詢記錄到文件來目擊此事。PHP PDO bindParam返回NULL

如果我對服務器執行 - 我在日誌文件中看到這個。

-

SELECT sg.locID, (3959 * acos(cos(radians(53.21333)) * cos(radians(latitude)) * cos(radians(longitude) - radians(-2.4354014)) + sin(radians(53.21333)) * sin(radians(latitude)))) AS distance FROM location_geo sg HAVING distance < 1000 ORDER BY distance LIMIT 0 , 20 

當從PHP/PDO內執行

SELECT 
    sg.locID, 
    (3959 * acos(cos(radians(NULL)) * cos(radians(latitude)) * cos(radians(longitude) - radians(NULL)) + sin(radians(NULL)) * sin(radians(latitude)))) AS distance 
FROM 
    location_geo sg 
HAVING 
    distance < 1000 
ORDER BY distance LIMIT 0, 20 

這裏是代碼多數民衆贊成通過PHP

$lat = 53.21333; 
$lng = -2.4354014; 
$limit = 10; 
$start = 0; 

$query = " 
    SELECT 
     sg.locID, 
     (3959 * acos(cos(radians(:latitude)) * cos(radians(latitude)) * cos(radians(longitude) - radians(:longitude)) + sin(radians(:latitude)) * sin(radians(latitude)))) AS distance 
    FROM 
     location_geo sg 
    HAVING 
     distance < :radius 
    ORDER BY distance LIMIT :start, :limit 
"; 

$stm = Modules::db()->prepare($query); 
$stm->bindValue(":radius", 1000, PDO::PARAM_INT); 
$stm->bindParam(":latitude", $lat, PDO::PARAM_INT); 
$stm->bindParam(":longitude", $lng, PDO::PARAM_INT); 
$stm->bindParam(":start", $start, PDO::PARAM_INT); 
$stm->bindParam(":limit", $limit, PDO::PARAM_INT); 
$stm->execute(); 

下面有我的表

CREATE TABLE `location_geo` (
    `locID` int(11) unsigned NOT NULL, 
    `latitude` double DEFAULT NULL, 
    `longitude` double DEFAULT NULL, 
    PRIMARY KEY (`locID`) 
) 

僞數據執行

INSERT INTO `location_geo` (`locID`, `latitude`, `longitude`) 
VALUES 
    (1, 53.21333, -2.4354014), 
    (2, 53.213435, -2.4345214); 

我試圖更換bindParams和將數據放入一個數組中執行呼叫內然而結果是相同的。

如果您錯過了,緯度和經度的值將保持爲空。沒有來自PDO的錯誤。

奇怪。

回答

1

爲了調試目的,我使用了setAttribute()。像這樣的例子:

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

這樣它會告訴你,如果你犯了什麼錯誤,它們是什麼。

+0

不幸的是這不會產生任何東西在屏幕上或在日誌中。謝謝無論如何。 – 2012-04-21 23:07:05

+0

嘗試將其設置爲一個級別highr:PDO :: ERRMODE_EXCEPTION – Mads 2012-04-21 23:09:10

1

好吧,我從來沒有使用過原料PDO,但我認爲錯誤是在這裏:

$stm->bindParam(":latitude", $lat, PDO::PARAM_INT); 
$stm->bindParam(":longitude", $lng, PDO::PARAM_INT); 

你爲什麼說這是一個INT(我相信這PDO::PARAM_INT說什麼類型的值是通過),如果你通過FLOAT?可能這就是它被轉換爲NULL的原因,因爲浮點值不是整數...

+0

沒有浮動選項,甚至設置爲PARAM_STR返回相同的行爲。 int選項不會像str選項那樣將值包含在單引號中。然而,正如你指出這可能是問題所在,我會對此進行調查。謝謝 – 2012-04-21 21:41:58

+0

有一些關於這個問題的話題你應該看看:http://stackoverflow.com/questions/1335081/what-is-the-best-way-to-bind-decimal-double-float-values-與-pdo-in-php ..and也許你可以跳過PDO :: PARAM_ *參數,然後用'$ stm-> bindParam(「:latitude」,$ lat);'例如。 – 2012-04-21 21:47:41

+0

我已經嘗試過,沒有定義該文章中的建議類型,您可以在查詢日誌中看到mysql,它將值包裝在單引號中,與PARAM_STR相同。經度和緯度的值保持爲NULL。我看不到這是原因:( – 2012-04-21 22:00:40