2015-11-02 60 views
-2

我有一個通用結構的表。
在名爲myvalue的列中,我存儲可以是整數,字符串或日期的信息。
爲了使其具有通用性,列myvalueVARCHAR。這意味着,當我保存一個整數時,它仍然存儲爲一個字符串。PHP的PDO SELECT語句:比較VARCHAR爲INT

現在,我在表上執行SELECT。例如。

SELECT * FROM mytable WHERE myvalue > 10 AND username = 'foo' 

假設我們有2行用戶foo520
直接執行此查詢,會給我正確的結果(返回20)。

現在,我通過PDO執行查詢:

$sql = "SELECT * FROM mytable WHERE myvalue > ? AND username = ?"; 
$params = array(10, 'foo'); 
$adapter->fetchAll($sql, $params); 

彷彿PDO比較字符串的結果返回[5, 20]

我該如何告訴PDO做一個數字比較?

+0

這應該只是罰款。當您將10直接放在問號上時會發生什麼? – Daan

+0

它可以直接放置(見第一個例子) – Horen

+0

不,那不是我的意思和說的。留下foo作爲問號。 – Daan

回答

1

$adapter->fetchAll是一個大黑盒子的神祕給我們,所以我猜測,你天真地做這樣的事情裏面:

$stmt = $pdo->prepare($sql); 
$stmt->execute($params); 

這的確將所有PARAMS爲字符串。如果你想參數爲整數明確處理,你需要適當約束他們:

$stmt = $pdo->prepare('SELECT * FROM mutable WHERE myvalue > ? AND username = ?'); 
$stmt->bindValue(1, 10, PDO::PARAM_INT); 
$stmt->bindValue(2, 'foo', PDO::PARAM_STR); 
$stmt->execute(); 

這可能意味着你必須重寫或放棄你的包裝了一下。

或者,您可以卸載這個轉換操作到MySQL(雖然它似乎IMO放錯位置):

$sql = "SELECT * FROM mutable WHERE myvalue > CAST(? AS SIGNED INTEGER) AND username = ?"; 
$params = array(10, 'foo'); 
$adapter->fetchAll($sql, $params); 
+0

同意 - 這個問題需要提供更多的信息。 – wally

+0

夠公平的。這是Zend Framework的實現 – Horen