2012-08-28 118 views
2

我有這個奇怪的問題。爲什麼這兩個實現返回不同的結果?PDO:綁定參數和連接字符串之間的區別

$db = DbBase::getInstance(); 
    $stmt = $db->prepare('SELECT round(round(9.50 * :amount, 2) * 23 * 0.01, 2)'); 
    $stmt->execute(array(':amount' => 1)); 
    echo $stmt->fetchColumn(); 

    Result: 2.18 

    $db = DbBase::getInstance(); 
    $stmt = $db->prepare('SELECT round(round(9.50 * 1, 2) * 23 * 0.01, 2)'); 
    $stmt->execute(); 
    echo $stmt->fetchColumn(); 

    Result: 2.19 

當我綁定量它給了我不同的結果。由於SQL注入,我寧願不連接字符串。

+0

什麼是 「落後」 $ DB?一個sqlite,MySQL,postgresql,???連接? – VolkerK

+0

MySQL,它是PDO的包裝。 – PPPHP

回答

4

當使用陣列來傳遞數據,該數據被作爲字符串傳遞:

docs

值的數組與儘可能多的元件,因爲在結合的參數正在執行的SQL語句。所有值都被視爲PDO :: PARAM_STR。

但是,當您手動輸入1直接將查詢作爲int處理時。讓我看看是否可以進一步挖掘一下,看看當一個字符串被轉換爲一個int時,內部發生了什麼。

編輯:這可能是已經提交併接受most similar bugs之一:

1) 
SET @a = 1; 
SELECT @a; 

2) 
SET @a = 1.1; 
SELECT @a; 

.. and this 

3) 
SET @a = 1.1; 
SELECT @a + 7; 
returns '8.100000000000000000000000000000' 
(probably the addition will convert "1.1" to a double, the result 
of the addition is also a DOUBLE and finally the DOUBLE is converted 
to a string - that should be OK as well as far as I can understand) 

所以看起來在內部,當你把它傳遞一個int MySQL是轉換爲雙。這將很好地解釋你所看到的行爲。

這是其他同類(數字並不完全正確)的列表錯誤你可能感興趣的:

http://bugs.mysql.com/bug.php?id=46037

http://bugs.mysql.com/bug.php?id=35071

http://bugs.mysql.com/bug.php?id=35071 < - 好一個展示Win和林之間的差異

filtered list of data type bugs我仔細閱讀了哪些有趣的閱讀。

編輯2:啊!

這裏是一個bug that rather perfectly說明您的問題:

Reproduce code: 
--------------- 
CREATE TABLE my_db.my_table (
    id int(10) unsigned NOT NULL auto_increment, 
    PRIMARY KEY (id) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

<?php 
$DB = new PDO('mysql:dbname=my_db;host=localhost', 'user', 'pass'); 
$stmt = $DB->prepare('select * from my_table where id>?'); 
$stmt->bindValue(1, 13); 
$stmt->execute(); 
?> 

or 

<?php 
$DB = new PDO('mysql:dbname=my_db;host=localhost', 'user', 'pass'); 
$stmt = $DB->prepare('select * from my_table where id>?'); 
$stmt->execute(array(13)); 
?> 

Expected result: 
---------------- 
select * from my_table where id>13 

Actual result: 
-------------- 
select * from my_table where id>'13' 
+0

對於「讓我看看我是否可以進一步挖掘以查看當字符串被轉換爲int爲內部時發生了什麼」。等待:) – swapnesh

+1

@swapnesh是的,我很想知道事情如何在這些寶石的內部工作:) – Fluffeh

+0

嗯,我必須糾正我的問題。其實我想綁定浮點值,我無法找到一個方法來做到這一點。 – PPPHP

相關問題