2017-05-30 70 views
0

MySQL查詢我有以下查詢我使用的查詢功能(https://github.com/mysqljs/mysql#escaping-query-values):逃逸問號字符作爲佔位符中的NodeJS

database.query("UPDATE Project SET Content = 'Hello ?' WHERE Id = ?", [id], function(err, rows, fields) { 
     if (err) { 
      console.log(err); 
      res.json({ status: 'FAIL QUERY' }); 
     } else { 
      res.json({ status: 'SUCCESS' }); 
     } 
    }); 

我有一個錯誤,因爲它正在取代問號上「'你好?'」和「WHERE ID =?」而他只有一個屬性:[id]。 如何避免這種情況?

回答

3

你有多種選擇:

database.query("UPDATE Project SET Content = ? WHERE Id = ?", [ 'Hello ?', id], function(err, rows, fields) { ... }) 

或者:

database.query("UPDATE Project SET Content = 'Hello ?' WHERE Id =" + mysql.escape(id), function(err, rows, fields) { ... }); 
0

準備好的語句將按順序替換?的每個實例,並按順序替換傳遞數組中的元素。如果要將其保留爲佔位符,或者在陣列中有2個元素,則需要使用不同的佔位符字符,第一個元素將替換爲Hello後的?(請記住,它也會將單引號圍繞該元素),第二個爲Id = ?

0

我會報告這個作爲該項目的錯誤。當這些字符出現時,他們不應該替換?字符:

  • 字符串文字內部,如在您的示例中。
  • 內部分隔的標識符。使用標點符號作爲表名或列名的一部分是不常見的,但合法的SQL。
  • 內部評論。

如果Node.js的項目替換的?不管上下文的,那麼這是不可接受的錯誤。

我會停止使用該包,直到他們修復該錯誤。

+0

用戶會被告知這種行爲(並且還解釋了這一點,儘管沒有太多的說法,提供的功能比官方執行準備好的語句更方便)。還有其他選項可用。 – robertklep

+0

@robertklep,不管行爲是否記錄在案,這是錯誤的。我認爲Node.js應該是如此的熱門,比PHP好得多 - 但PDO確實解析了參數。對不起,我不接受這個錯誤的藉口。這實在令人失望,特別是對於已經存在數年的軟件包而言。 –

+0

PHP與此有什麼關係?此外,如果您對此感到如此強烈,請隨時發佈錯誤報告:https://github.com/mysqljs/mysql/issues此外,這不是Node的唯一MySQL庫,['mysql2']( https://開頭github上。com/sidorares/node-mysql2#using-prepared-statements)支持正確的預處理語句。 – robertklep

0

感謝您的回答!我學到了很多。 使用(mysql.escape(id))的robertklep答案爲我工作。

不過,我發現了另一種方式,我與你分享添加多個參數查詢:

您可以創建一個名爲JSON和queryJSON給它增加鍵 - 值。例如:queryJSON = {Content: 'Hello ?', Address: '742 Evergreen Terrace'}。然後:

database.query("UPDATE Offer SET ? WHERE Id = ?", [queryJSON, id], function(err, rows, fields) { 

這對我的請求添加一個或多個參數請求是有用的。