2016-07-01 33 views
1

到目前爲止我還沒能找到答案......也許有人在這裏可以提供幫助。在我的WHERE上使用IN截斷了不正確的DOUBLE值

,我發現了以下錯誤:錯誤運行的查詢... ::::錯誤:ER_TRUNCATED_WRONG_VALUE:截斷不正確DOUBLE值:「2,4」

發生這種情況時使用mysql運行一個查詢模塊在nodejs中。查詢如下:

selectQ = "UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN (?);" 

我打電話這樣說:

con.query(selectQ,[hash,lupdator,usrs], function (err, rows) {...}); 

這工作得很好,只要我只有在的USR變量一個數字,但是當我的列表數字(在看起來像「2,4」的連接字符串)我得到上面的截斷錯誤。

任何想法?謝謝!

最終結果是:

每回答正確標註使用準備好的聲明中對我的「IN」沒有工作。我相信如果我傳遞一個單引號字符串的列表來查找基於文本的數據類型,但查詢是將轉義的INT傳遞爲文本字符類型,它會正常工作。

Anyhoo ...我只是驗證我的數組中的所有項都是數字,如果他們是我加入數組並將它傳遞到準備好的查詢中。我不相信這會讓我暴露於注射,但如果我錯了,隨時糾正我。這裏是我的代碼:

for(i = 0; i < usr.length; i++){ 
     if(!IsNumeric(usr[i])){ 
      callback("Password hash failed, server side issue.",null); return; 
     } 
    } 
    var usrs = usr.join(','); 
    selectQ = "UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN ("+usrs+");" 
+0

準備好的陳述不能像那樣工作。你必須有一個'IN'子句,每個單獨的參數都有足夠的'?'條目。 – Pointy

+0

擁有太多'?'(通常)是安全的,只需用空值填充未使用的插槽即可。 – Pointy

+0

在Postgresql中,您可以使用一個數組運算符,這個運算符不那麼雜亂。 – Pointy

回答

1

的方式你傳遞的參數不會給你:

UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN (2,4); 

它會給你:

UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id IN ((2,4)); 

所以2,4變一個單一的價值。你需要找到另一種方式,這可能意味着執行單獨的語句像這樣的:

UPDATE usr SET pass = ?, last_updator = ?, last_update = NOW() WHERE id = ?; 

另外,如果你是動態構建列表中,你應該知道這裏面IN聲明一長串值不擴大好。許多數據庫服務器也會對它們的大小施加限制(MSSQL限制爲512個元素,我不知道MySQL)。

+0

實際上,它給你'IN('2,4')'。 – Barmar

+0

這取決於這個消息是指一個DOUBLE值,所以我做出了一個有根據的猜測,但重點是它是一個單個值,與類型無關 –

+0

單獨的語句不是必需的IN'語句可以處理儘可能多的佔位符:'IN(?,?,?,?,?,?,?,? ',')'很好,OP可以使準備好的查詢擁有大量的'?'佔位符,然後將'null'傳遞給其他人。我不知道MySQL,但我用過的其他數據庫似乎沒有遭受任何性能下降,至少沒有什麼意義。 – Pointy

相關問題