2013-10-25 66 views
0

過去幾天我一直有一個問題,我縮小了問題的範圍,如下所示。如果我不使用自定義距離函數,參數的傳遞將正常工作。誰能告訴我我做錯了什麼?截至目前,我只是手動清理該字段並將其硬編碼到查詢中。通過功能傳遞消毒輸入不起作用

WORKS(返回正確的結果):

$sth = $db->prepare("SELECT * FROM providers WHERE distance('42.8','-73.9',lat,lon)<25"); 
$sth->execute(); 

不工作(返回所有供應商):

$sth = $db->prepare("SELECT * FROM providers WHERE distance('42.8','-73.9',lat,lon)<:radius"); 
$sth->execute(array(":radius" =>25)); 

回答

2

我並不真正熟悉PDO,但可能是因爲你正在傳遞一個int,並且該語句默認將值視爲string。請參閱手冊頁面:http://php.net/manual/en/pdostatement.execute.php並查看input_parameters瞭解更多信息。在執行語句之前,您總是可以嘗試使用bind_param()將您的數據轉換爲正確的類型。

+0

你認爲這很重要嗎,這是sqlite? (我應該考慮將其添加爲標籤)。 SQLite有一個鬆散的數據類型系統。 –

+0

嗯,我不確定(不熟悉SQLite),但是,如果我要做出一個假設,或許數據類型很重要,因爲您正在使用準備好的語句。我猜想,它與SQLite數據類型系統有關較少,更多的是與PDO想要獲得關於它正在使用的數據的更多細節有關。 – Crackertastic

+0

好吧......我將會AFK一段時間...但我會在今晚晚些時候嘗試bind_param()並報告回來。 –

0

試試這個代碼: 我有點新PDO自己,但我發現這個工作對我來說:

$radius = 25; 
$sth = $db->prepare("SELECT * FROM providers WHERE distance('42.8','-73.9',lat,lon)<:radius"); 
$query_params = array( 
     ':radius' => $radius 
    ); 
$sth = $db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); // forgot 

$sth -> execute($query_params); 
+0

youv'e本質上沒有任何改變。直接傳遞數組v.s.創建一個數組var,然後傳遞該var與' - > execute()'函數有關的基本上與par相同。 –

+0

對不起 - 你是對的。我忘記了//忘記的行,我假設它對PDO做了些什麼 – bigbitecode